Преглед изворни кода

Merge remote-tracking branch 'ivalkou/dev' into experimental

Jon B.M пре 4 година
родитељ
комит
1fd0427bd2
76 измењених фајлова са 3455 додато и 726 уклоњено
  1. 1 1
      Dependencies/LoopKit/LoopKit/de.lproj/Localizable.strings
  2. 3 3
      Dependencies/LoopKit/LoopKitUI/de.lproj/Localizable.strings
  3. 105 0
      Dependencies/rileylink_ios/MinimedKit/sk.lproj/Localizable.strings
  4. 210 0
      Dependencies/rileylink_ios/MinimedKitUI/sk.lproj/Localizable.strings
  5. 69 0
      Dependencies/rileylink_ios/MinimedKitUI/sk.lproj/MinimedPumpManager.strings
  6. 216 0
      Dependencies/rileylink_ios/OmniKit/sk.lproj/Localizable.strings
  7. 179 0
      Dependencies/rileylink_ios/OmniKitPacketParser/sk.lproj/Localizable.strings
  8. 7 7
      Dependencies/rileylink_ios/OmniKitUI/it.lproj/Localizable.strings
  9. 261 0
      Dependencies/rileylink_ios/OmniKitUI/sk.lproj/Localizable.strings
  10. 63 0
      Dependencies/rileylink_ios/OmniKitUI/sk.lproj/OmnipodPumpManager.strings
  11. 21 0
      Dependencies/rileylink_ios/RileyLink.xcodeproj/project.pbxproj
  12. 51 0
      Dependencies/rileylink_ios/RileyLink/sk.lproj/Localizable.strings
  13. 30 0
      Dependencies/rileylink_ios/RileyLinkBLEKit/sk.lproj/Localizable.strings
  14. 104 0
      Dependencies/rileylink_ios/RileyLinkKitUI/sk.lproj/Localizable.strings
  15. 15 9
      FreeAPS.xcodeproj/project.pbxproj
  16. 2 2
      FreeAPS.xcodeproj/xcuserdata/i.valkou.xcuserdatad/xcschemes/xcschememanagement.plist
  17. 0 43
      FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved
  18. 6 0
      FreeAPS/Resources/Base.lproj/InfoPlist.strings
  19. 6 0
      FreeAPS/Resources/ar.lproj/InfoPlist.strings
  20. 6 0
      FreeAPS/Resources/ca.lproj/InfoPlist.strings
  21. 6 0
      FreeAPS/Resources/da.lproj/InfoPlist.strings
  22. 11 5
      FreeAPS/Resources/de.lproj/InfoPlist.strings
  23. 6 0
      FreeAPS/Resources/es.lproj/InfoPlist.strings
  24. 6 0
      FreeAPS/Resources/fi.lproj/InfoPlist.strings
  25. 6 0
      FreeAPS/Resources/fr.lproj/InfoPlist.strings
  26. 6 0
      FreeAPS/Resources/he.lproj/InfoPlist.strings
  27. 7 1
      FreeAPS/Resources/it.lproj/InfoPlist.strings
  28. 2 1
      FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json
  29. 6 0
      FreeAPS/Resources/nb.lproj/InfoPlist.strings
  30. 6 0
      FreeAPS/Resources/nl.lproj/InfoPlist.strings
  31. 6 0
      FreeAPS/Resources/pl.lproj/InfoPlist.strings
  32. 6 0
      FreeAPS/Resources/pt-BR.lproj/InfoPlist.strings
  33. 6 0
      FreeAPS/Resources/ru.lproj/InfoPlist.strings
  34. 20 0
      FreeAPS/Resources/sk.lproj/InfoPlist.strings
  35. 6 0
      FreeAPS/Resources/sv.lproj/InfoPlist.strings
  36. 6 0
      FreeAPS/Resources/tr.lproj/InfoPlist.strings
  37. 6 0
      FreeAPS/Resources/uk.lproj/InfoPlist.strings
  38. 6 0
      FreeAPS/Resources/zh-Hans.lproj/InfoPlist.strings
  39. 1 1
      FreeAPS/Sources/APS/APSManager.swift
  40. 5 1
      FreeAPS/Sources/APS/CGM/CGMType.swift
  41. 6 4
      FreeAPS/Sources/APS/DeviceDataManager.swift
  42. 17 11
      FreeAPS/Sources/APS/FetchGlucoseManager.swift
  43. 5 22
      FreeAPS/Sources/APS/Storage/GlucoseStorage.swift
  44. 72 9
      FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings
  45. 55 11
      FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings
  46. 55 11
      FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings
  47. 133 89
      FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings
  48. 33 11
      FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings
  49. 55 11
      FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings
  50. 55 11
      FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings
  51. 55 11
      FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings
  52. 55 11
      FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings
  53. 109 65
      FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings
  54. 78 34
      FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings
  55. 55 11
      FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings
  56. 55 11
      FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings
  57. 55 11
      FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings
  58. 592 141
      FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings
  59. 56 12
      FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings
  60. 40 11
      FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings
  61. 39 14
      FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings
  62. 83 39
      FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings
  63. 55 11
      FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings
  64. 55 11
      FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings
  65. 0 10
      FreeAPS/Sources/Models/FreeAPSSettings.swift
  66. 10 2
      FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift
  67. 18 22
      FreeAPS/Sources/Modules/HealthKit/HealthKitStateModel.swift
  68. 1 5
      FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift
  69. 1 1
      FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift
  70. 25 21
      FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift
  71. 1 1
      FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift
  72. 20 1
      FreeAPS/Sources/Services/WatchManager/WatchManager.swift
  73. 1 0
      FreeAPSWatch WatchKit Extension/ComplicationController.swift
  74. 1 0
      FreeAPSWatch WatchKit Extension/DataFlow.swift
  75. 23 6
      FreeAPSWatch WatchKit Extension/Views/MainView.swift
  76. 1 0
      crowdin.yml

+ 1 - 1
Dependencies/LoopKit/LoopKit/de.lproj/Localizable.strings

@@ -53,7 +53,7 @@
 "mg/dL/U" = "mg/dL/IE";
 
 /* The short unit display string for millimoles per liter */
-"mmol/L" = "mmol/L";
+"mmol/L" = "mmol/l";
 
 /* The short unit display string for millimoles per liter per U */
 "mmol/L/U" = "mmol/L/IE";

+ 3 - 3
Dependencies/LoopKit/LoopKitUI/de.lproj/Localizable.strings

@@ -78,7 +78,7 @@
 "com.loudnate.InsulinKit.totalDateLabel" = "seit %1$@";
 
 /* The title of the action used to dismiss an error alert */
-"com.loudnate.LoopKit.errorAlertActionTitle" = "OK";
+"com.loudnate.LoopKit.errorAlertActionTitle" = "Ok";
 
 /* The title for the override emoji condition section */
 "Condition" = "Bedingung";
@@ -141,7 +141,7 @@
 "Medium" = "Mittlere";
 
 /* Placeholder for minimum value in glucose range */
-"min" = "min";
+"min" = "minimal";
 
 /* Alert action title to open error help */
 "More Info" = "Weitere Info";
@@ -166,7 +166,7 @@
 "Override presets can be set up under the 'Configuration' section of the settings screen." = "Voreinstellungen der Overrides können im Abschnitt Konfiguration des Einstellungsbildschirms eingerichtet werden.";
 
 /* The section title of glucose overrides */
-"Overrides" = "Overrides";
+"Overrides" = "Zeitliche Anpassungen";
 
 /* Title for the pre-meal override range */
 "Pre-Meal" = "Vor dem Essen";

+ 105 - 0
Dependencies/rileylink_ios/MinimedKit/sk.lproj/Localizable.strings

@@ -0,0 +1,105 @@
+/* Communications error for a bolus currently running */
+"A bolus is already in progress" = "Podanie bolusu už prebieha";
+
+/* The description of AlarmClockReminderPumpEvent */
+"AlarmClockReminder" = "AlarmClockReminder";
+
+/* The description of AlarmSensorPumpEvent */
+"AlarmSensor" = "AlarmSensor";
+
+/* Describing the battery chemistry as Alkaline */
+"Alkaline" = "Alkalické";
+
+/* The format string description of a BasalProfileStartPumpEvent. (1: The index of the profile)(2: The basal rate) */
+"Basal Profile %1$@: %2$@ U/hour" = "Bazálny Profil %1$@: %2$@ J/hod";
+
+/* Pump error code when bolus is in progress */
+"Bolus in progress" = "Bolus sa podáva";
+
+/* Describing the Canada pump region */
+"Canada" = "Kanada";
+
+/* Suggestions for diagnosing a command refused pump error */
+"Check that the pump is not suspended or priming, or has a percent temp basal type" = "Skontrolujte že pumpa nie je pozastavená alebo sa nastavuje, alebo má percentuálny dočasný typ bazálu";
+
+/* Pump error code returned when command refused */
+"Command refused" = "Príkaz zamietnutý";
+
+/* No comment provided by engineer. */
+"Comms with another pump detected" = "Zaznamenané komunikácie s inou pumpou.";
+
+/* Error description */
+"Decoding Error" = "Chyba dekódovania";
+
+/* Error description */
+"Device Error" = "Chyba zariadenia";
+
+/* Describing the pump history insulin data source */
+"Event History" = "História Udalostí";
+
+/* Pump error code when invalid history page is requested */
+"History page does not exist" = "Stránka História neexistuje";
+
+/* Format string for failure reason. (1: The operation being performed) (2: The response data) */
+"Invalid response during %1$@: %2$@" = "Neplatná odpoveď počas %1$@: %2$@";
+
+/* Describing the battery chemistry as Lithium */
+"Lithium" = "Líthiové";
+
+/* Recovery suggestion */
+"Make sure your RileyLink is nearby and powered on" = "Uistite sa že je váš RileyLink v dosahu a zapnutý";
+
+/* Pump error code describing max setting exceeded */
+"Max setting exceeded" = "Prekročené max nastavenie";
+
+/* Pump title (1: model number) */
+"Minimed %@" = "Minimed %@";
+
+/* Generic title of the minimed pump manager */
+"Minimed 500/700 Series" = "Minimed 500/700 Série";
+
+/* Describing the North America pump region */
+"North America" = "Severná Amerika";
+
+/* No comment provided by engineer. */
+"Pump did not respond" = "Pumpa neodpovedá";
+
+/* Error description */
+"Pump Error" = "Chyba pumpy";
+
+/* No comment provided by engineer. */
+"Pump is suspended" = "Pumpa je pozastavená";
+
+/* No comment provided by engineer. */
+"Pump responded unexpectedly" = "Pumpa odpovedala neočakávane";
+
+/* The format string describing a pump message. (1: The packet type)(2: The message type)(3: The message address)(4: The message data */
+"PumpMessage(%1$@, %2$@, %3$@, %4$@)" = "Správa Pumpy(%1$@, %2$@, %3$@, %4$@)";
+
+/* Describing the reservoir insulin data source */
+"Reservoir" = "Rezervoár";
+
+/* Error description */
+"RileyLink radio tune failed" = "RileyLink radio ladenie zlyhalo";
+
+/* The format string description of a TempBasalPumpEvent. (1: The rate of the temp basal in minutes) */
+"Temporary Basal: %1$.3f U/hour" = "Dočasný Bazál: %1$.3f J/hod";
+
+/* The format string description of a TempBasalDurationPumpEvent. (1: The duration of the temp basal in minutes) */
+"Temporary Basal: %1$d min" = "Dočasný Bazál: %1$d min";
+
+/* The format string description of a TempBasalPumpEvent. (1: The rate of the temp basal in percent) */
+"Temporary Basal: %1$d%%" = "Dočasný Bazál: %1$d%%";
+
+/* The format string description of an unknown pump error code. (1: The specific error code raw value) */
+"Unknown pump error code: %1$@" = "Neznáma chyba pumpy kód: %1$@";
+
+/* No comment provided by engineer. */
+"Unknown pump model: %@" = "Neznámy model pumpy: %@";
+
+/* Format string for an unknown response. (1: The operation being performed) (2: The response data) */
+"Unknown response during %1$@: %2$@" = "Neznáma odpoveď počas %1$@: %2$@";
+
+/* Describing the worldwide pump region */
+"World-Wide" = "Celo-Svetovo";
+

Разлика између датотеке није приказан због своје велике величине
+ 210 - 0
Dependencies/rileylink_ios/MinimedKitUI/sk.lproj/Localizable.strings


+ 69 - 0
Dependencies/rileylink_ios/MinimedKitUI/sk.lproj/MinimedPumpManager.strings

@@ -0,0 +1,69 @@
+/* Class = "UITableViewController"; title = "RileyLink Setup"; ObjectID = "0MV-2k-Dty"; */
+"0MV-2k-Dty.title" = "RileyLink Setup";
+
+/* Class = "UILabel"; text = "Find Device"; ObjectID = "1fp-45-qWK"; */
+"1fp-45-qWK.text" = "Find Device";
+
+/* Class = "UILabel"; text = "Other Devices"; ObjectID = "A6i-Cb-baR"; */
+"A6i-Cb-baR.text" = "Other Devices";
+
+/* Class = "UILabel"; text = "Do not change the time using your pumpʼs menu."; ObjectID = "Bdb-j4-WcR"; */
+"Bdb-j4-WcR.text" = "Do not change the time using your pumpʼs menu.";
+
+/* Class = "UILabel"; text = "Utilities"; ObjectID = "c7t-pZ-WqY"; */
+"c7t-pZ-WqY.text" = "Utilities";
+
+/* Class = "UILabel"; text = "Connect Devices"; ObjectID = "erq-yb-anx"; */
+"erq-yb-anx.text" = "Connect Devices";
+
+/* Class = "UITableViewController"; title = "Pump Clock"; ObjectID = "Fps-h3-V4K"; */
+"Fps-h3-V4K.title" = "Pump Clock";
+
+/* Class = "UITableViewSection"; footerTitle = "The pump ID is the 6-digit numerical portion of the serial number (labeled as SN or S/N)."; ObjectID = "fVG-pl-jT9"; */
+"fVG-pl-jT9.footerTitle" = "The pump ID is the 6-digit numerical portion of the serial number (labeled as SN or S/N).";
+
+/* Class = "UITableViewSection"; headerTitle = "Pump ID"; ObjectID = "fVG-pl-jT9"; */
+"fVG-pl-jT9.headerTitle" = "Pump ID";
+
+/* Class = "UILabel"; text = "Your pump is ready for use."; ObjectID = "g1m-3k-XI3"; */
+"g1m-3k-XI3.text" = "Your pump is ready for use.";
+
+/* Class = "UITextField"; placeholder = "Enter the 6-digit pump ID"; ObjectID = "HeG-VF-L5P"; */
+"HeG-VF-L5P.placeholder" = "Enter the 6-digit pump ID";
+
+/* Class = "UILabel"; text = "If you travel to a different time zone for an extended period of time, you can change the pumpʼs time zone at any time in Loopʼs Settings screen."; ObjectID = "HuY-fE-vM8"; */
+"HuY-fE-vM8.text" = "If you travel to a different time zone for an extended period of time, you can change the pumpʼs time zone at any time in Loopʼs Settings screen.";
+
+/* Class = "UILabel"; text = "Loop will keep your pumpʼs clock synchronized with your phone in the time zone youʼre in now."; ObjectID = "IQ5-53-x9s"; */
+"IQ5-53-x9s.text" = "Loop will keep your pumpʼs clock synchronized with your phone in the time zone youʼre in now.";
+
+/* Class = "UITableViewSection"; footerTitle = "The pump region and color are denoted as the last 3 letters of the the model number (labeled as REF)."; ObjectID = "lGI-LD-xR7"; */
+"lGI-LD-xR7.footerTitle" = "The pump region and color are denoted as the last 3 letters of the the model number (labeled as REF).";
+
+/* Class = "UITableViewSection"; headerTitle = "Region and Color"; ObjectID = "lGI-LD-xR7"; */
+"lGI-LD-xR7.headerTitle" = "Region and Color";
+
+/* Class = "UITableViewController"; title = "Setup Complete"; ObjectID = "Nwf-TJ-KmJ"; */
+"Nwf-TJ-KmJ.title" = "Setup Complete";
+
+/* Class = "UITableViewController"; title = "Pump Broadcasts"; ObjectID = "oBL-lh-SHI"; */
+"oBL-lh-SHI.title" = "Pump Broadcasts";
+
+/* Class = "UILabel"; text = "On"; ObjectID = "ojQ-ob-gBx"; */
+"ojQ-ob-gBx.text" = "On";
+
+/* Class = "UITableViewController"; title = "Pump Setup"; ObjectID = "OZk-Db-KCs"; */
+"OZk-Db-KCs.title" = "Pump Setup";
+
+/* Class = "UILabel"; text = "Enter the pump region"; ObjectID = "tGa-FP-JqD"; */
+"tGa-FP-JqD.text" = "Enter the pump region";
+
+/* Class = "UINavigationItem"; title = "Pump Setup"; ObjectID = "V47-Nq-7ew"; */
+"V47-Nq-7ew.title" = "Pump Setup";
+
+/* Class = "UILabel"; text = "Loop will listen for status messages sent by your pump. Follow the steps below on your pump to enable these messages:"; ObjectID = "yLn-Ya-p1R"; */
+"yLn-Ya-p1R.text" = "Loop will listen for status messages sent by your pump. Follow the steps below on your pump to enable these messages:";
+
+/* Class = "UITableViewSection"; headerTitle = "Main Menu"; ObjectID = "ZnF-zy-5gR"; */
+"ZnF-zy-5gR.headerTitle" = "Main Menu";
+

+ 216 - 0
Dependencies/rileylink_ios/OmniKit/sk.lproj/Localizable.strings

@@ -0,0 +1,216 @@
+/* Description for an inactive alert modifier */
+" (inactive)" = " (inactive)";
+
+/* Format string for activation time exceeded
+   Pod state when activation not completed in the time allowed */
+"Activation time exceeded" = "Activation time exceeded";
+
+/* Description for auto-off alarm */
+"Auto-off alarm" = "Auto-off alarm";
+
+/* Pod state when running below fifty units */
+"Below 50 units" = "Menej ako 50 jednotiek";
+
+/* Error message shown when operation could not be completed due to existing bolus in progress */
+"Bolus in progress" = "Bolus sa podáva";
+
+/* The format string describing a bolus. (1: The amount delivered)(2: Start time of the dose)(3: duration)(4: scheduled certainty) */
+"Bolus: %1$@U %2$@ %3$@ %4$@" = "Bolus: %1$@J %2$@ %3$@ %4$@";
+
+/* Delivery status when bolusing */
+"Bolusing" = "Bolusing";
+
+/* Delivery status when bolusing and temp basal is running */
+"Bolusing with temp basal" = "Bolusing with temp basal";
+
+/* Pod state when inserting cannula */
+"Cannula inserting" = "Nastrelenie kanuly";
+
+/* String describing a dose that was certainly scheduled */
+"Certain" = "Certain";
+
+/* Format string for invalid message error code (1: error code number) */
+"Command error %1$u" = "Command error %1$u";
+
+/* Recovery suggestion when unexpected address received */
+"Crosstalk possible. Please move to a new location and try again" = "Crosstalk possible. Please move to a new location and try again";
+
+/* Pod state when pod has been deactivated */
+"Deactivated" = "Deaktivované";
+
+/* Description for Empty reservoir pod fault */
+"Empty reservoir" = "Prázdny zásobník";
+
+/* Error message shown when empty response from pod was received */
+"Empty response from pod" = "Žiadna odpoveď z Podu";
+
+/* Pod state error event logged shutting down */
+"Error event logged, shutting down" = "Error event logged, shutting down";
+
+/* Description for expiration alert */
+"Expiration alert" = "Upozornenie o expirácii";
+
+/* Description for finish setup */
+"Finish setup " = "Dokončiť nastavenie ";
+
+/* Pod inititialized */
+"Initialized" = "Initialized";
+
+/* The format string for Internal pod fault (1: The fault code value) */
+"Internal pod fault %1$03d" = "Interná chyba Podu %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$@" = "PrerušenýBolus: %1$@ J (%2$@ J plánované) %3$@ %4$@ %5$@";
+
+/* Description for low reservoir alarm */
+"Low reservoir advisory alarm" = "Varovný alarm Nízka hladina zásobníka";
+
+/* Recovery suggestion when no RileyLink is available */
+"Make sure your RileyLink is nearby and powered on" = "Uistite sa že je váš RileyLink v dosahu a zapnutý";
+
+/* Pod alert state when no alerts are active */
+"No alerts" = "Žiadne upozornenia";
+
+/* Error message shown when no pod is paired */
+"No pod paired" = "Žiadny Pod párovaný";
+
+/* Error message shown when no response from pod was received */
+"No response from pod" = "Žiadna odpoveď z Podu";
+
+/* Error message shown when no response from pod was received */
+"No RileyLink available" = "Žiadny RileyLink dostupný";
+
+/* Delivery status when basal is running
+   Pod state when running above fifty units */
+"Normal" = "Normálny";
+
+/* Description for Occlusion detected pod fault */
+"Occlusion detected" = "Zistená oklúzia";
+
+/* Generic title of the omnipod pump manager */
+"Omnipod" = "Omnipod";
+
+/* Pod status after pairing */
+"Paired" = "Spárované";
+
+/* Recovery suggestion on unexpected pod change */
+"Please bring only original pod in range or deactivate original pod" = "Please bring only original pod in range or deactivate original pod";
+
+/* Recovery suggestion when no response is received from pod */
+"Please bring your pod closer to the RileyLink and try again" = "Priblížte váš Pod k RileyLinku a skúste znova";
+
+/* Recover suggestion shown when no pod is paired */
+"Please pair a new pod" = "Prosím spárujte nový Pod";
+
+/* Recovery suggestion when pairing signal strength is too high */
+"Please reposition the RileyLink further from the pod" = "Please reposition the RileyLink further from the pod";
+
+/* Recovery suggestion when pairing signal strength is too low */
+"Please reposition the RileyLink relative to the pod" = "Please reposition the RileyLink relative to the pod";
+
+/* Error message shown when user cannot pair because pod is already paired */
+"Pod already paired" = "Pod je už spárovaný";
+
+/* Error message shown when prime is attempted, but pod is already primed */
+"Pod already primed" = "Pod already primed";
+
+/* Description for expiration advisory alarm */
+"Pod expiration advisory alarm" = "Varovný alarm Expirácia Podu";
+
+/* The title for pod expiration notification */
+"Pod Expiration Notice" = "Oznam Expirácia Podu";
+
+/* Description for Pod expired pod fault */
+"Pod expired" = "Pod Expiroval";
+
+/* Format string for pod fault code */
+"Pod Fault: %1$@" = "Chyba Podu: %1$@";
+
+/* Error message when cannula insertion fails because the pod is in an unexpected state */
+"Pod is not in a state ready for cannula insertion" = "Pod nie je v stave pripravený pre zavedenie kanyly";
+
+/* Error message when prime fails because the pod is in an unexpected state */
+"Pod is not in a state ready for priming." = "Pod is not in a state ready for priming.";
+
+/* Error message action could not be performed because pod is suspended */
+"Pod is suspended" = "Pod je pozastavený";
+
+/* Error message shown when pod sends ack instead of response */
+"Pod sent ack instead of response" = "Pod sent ack instead of response";
+
+/* Pod state when prime or cannula insertion has not completed in the time allotted */
+"Pod setup window expired" = "Nastavenie okna Podu expirovalo";
+
+/* Format string for poor pod signal strength */
+"Poor signal strength" = "Poor signal strength";
+
+/* Delivery status when pod is priming
+   Pod status when priming */
+"Priming" = "Priming";
+
+/* Pod state when ready for basal programming */
+"Ready for basal programming" = "Pripravený na programovanie bazálu";
+
+/* Pod state when ready for cannula insertion */
+"Ready to insert cannula" = "Pripravený zaviesť kanylu";
+
+/* The format string describing a resume. (1: Time)(2: Scheduled certainty */
+"Resume: %1$@ %2$@" = "Obnoviť: %1$@ %2$@";
+
+/* Delivery status when basal is running */
+"Scheduled Basal" = "Plánovaný Bazál";
+
+/* Description for shutdown imminent alarm */
+"Shutdown imminent alarm" = "Vypnúť bezprostredný alarm";
+
+/* Format string for pod signal strength too high */
+"Signal strength too high" = "Signal strength too high";
+
+/* The format string describing a suspend. (1: Time)(2: Scheduled certainty */
+"Suspend: %1$@ %2$@" = "Pozastaviť: %1$@ %2$@";
+
+/* Delivery status when insulin delivery is suspended */
+"Suspended" = "Pozastavené";
+
+/* Pod tank fill completed */
+"Tank fill completed" = "Tank fill completed";
+
+/* Pod power to motor activated */
+"Tank power activated" = "Tank power activated";
+
+/* Error message shown when temp basal could not be set due to existing temp basal in progress */
+"Temp basal in progress" = "Dočasný bazál už prebieha";
+
+/* Delivery status when temp basal is running */
+"Temp basal running" = "Temp basal running";
+
+/* The format string describing a temp basal. (1: The rate)(2: Start time)(3: duration)(4: volume)(5: scheduled certainty */
+"TempBasal: %1$@ U/hour %2$@ %3$@ %4$@ U %5$@" = "TempBasal: %1$@ U/hour %2$@ %3$@ %4$@ U %5$@";
+
+/* The format string for pod expiration notification body (1: time until expiration) */
+"Time to replace your pod! Your pod will expire in %1$@" = "Time to replace your pod! Your pod will expire in %1$@";
+
+/* Recovery suggestion when ack received instead of response */
+"Try again" = "Try again";
+
+/* String describing a dose that was possibly scheduled */
+"Uncertain" = "Uncertain";
+
+/* Format string for unexpected pod change */
+"Unexpected pod change" = "Unexpected pod change";
+
+/* Error message shown when empty response from pod was received */
+"Unexpected response from pod" = "Unexpected response from pod";
+
+/* The format string for Unknown pod fault (1: The fault code value) */
+"Unknown pod fault %1$03d" = "Unknown pod fault %1$03d";
+
+/* Recovery suggestion when operation could not be completed due to existing bolus in progress */
+"Wait for existing bolus to finish, or cancel bolus" = "Wait for existing bolus to finish, or cancel bolus";
+
+/* Recovery suggestion when operation could not be completed due to existing temp basal in progress */
+"Wait for existing temp basal to finish, or suspend to cancel" = "Wait for existing temp basal to finish, or suspend to cancel";
+
+/* Description waiting for pairing reminder */
+"Waiting for pairing reminder" = "Waiting for pairing reminder";
+

+ 179 - 0
Dependencies/rileylink_ios/OmniKitPacketParser/sk.lproj/Localizable.strings

@@ -0,0 +1,179 @@
+/* Description for auto-off alarm */
+"Auto-off alarm" = "Auto-off alarm";
+
+/* Pod state when running below fifty units */
+"Below 50 units" = "Below 50 units";
+
+/* Error message shown when operation could not be completed due to existing bolus in progress */
+"Bolus in progress" = "Bolus in progress";
+
+/* The format string describing a bolus. (1: The amount delivered)(2: Start time of the dose)(3: duration)(4: scheduled certainty) */
+"Bolus: %1$@U %2$@ %3$@ %4$@" = "Bolus: %1$@U %2$@ %3$@ %4$@";
+
+/* Delivery status when bolusing */
+"Bolusing" = "Bolusing";
+
+/* Delivery status when bolusing and temp basal is running */
+"Bolusing with temp basal" = "Bolusing with temp basal";
+
+/* Pod state when inserting cannula */
+"Cannula inserting" = "Cannula inserting";
+
+/* String describing a dose that was certainly scheduled */
+"Certain" = "Certain";
+
+/* Pod state when pod has been deactivated */
+"Deactivated" = "Deactivated";
+
+/* Description for Empty reservoir pod fault */
+"Empty reservoir" = "Empty reservoir";
+
+/* Error message shown when empty response from pod was received */
+"Empty response from pod" = "Empty response from pod";
+
+/* Pod state error event logged shutting down */
+"Error event logged, shutting down" = "Error event logged, shutting down";
+
+/* Description for expiration alert */
+"Expiration alert" = "Expiration alert";
+
+/* Description for finish setup */
+"Finish setup " = "Finish setup ";
+
+/* Pod inititialized */
+"Initialized" = "Initialized";
+
+/* The format string for Internal pod fault (1: The fault code value) */
+"Internal pod fault %1$03d" = "Internal pod fault %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$@" = "InterruptedBolus: %1$@ U (%2$@ U scheduled) %3$@ %4$@ %5$@";
+
+/* Description for low reservoir alarm */
+"Low reservoir advisory alarm" = "Low reservoir advisory alarm";
+
+/* Recovery suggestion when no RileyLink is available */
+"Make sure your RileyLink is nearby and powered on" = "Make sure your RileyLink is nearby and powered on";
+
+/* Pod alert state when no alerts are active */
+"No alerts" = "No alerts";
+
+/* Error message shown when no pod is paired */
+"No pod paired" = "No pod paired";
+
+/* Error message shown when no response from pod was received */
+"No response from pod" = "No response from pod";
+
+/* Error message shown when no response from pod was received */
+"No RileyLink available" = "No RileyLink available";
+
+/* Delivery status when basal is running
+   Pod state when running above fifty units */
+"Normal" = "Normal";
+
+/* Description for Occlusion detected pod fault */
+"Occlusion detected" = "Occlusion detected";
+
+/* Generic title of the omnipod pump manager */
+"Omnipod" = "Omnipod";
+
+/* Pod status after pairing */
+"Paired" = "Paired";
+
+/* Recovery suggestion when no response is received from pod */
+"Please bring your pod closer to the RileyLink and try again" = "Please bring your pod closer to the RileyLink and try again";
+
+/* Recover suggestion shown when no pod is paired */
+"Please pair a new pod" = "Please pair a new pod";
+
+/* Error message shown when user cannot pair because pod is already paired */
+"Pod already paired" = "Pod already paired";
+
+/* Error message shown when prime is attempted, but pod is already primed */
+"Pod already primed" = "Pod already primed";
+
+/* Description for expiration advisory alarm */
+"Pod expiration advisory alarm" = "Pod expiration advisory alarm";
+
+/* The title for pod expiration notification */
+"Pod Expiration Notice" = "Pod Expiration Notice";
+
+/* Description for Pod expired pod fault */
+"Pod expired" = "Pod expired";
+
+/* Format string for pod fault code */
+"Pod Fault: %1$@" = "Pod Fault: %1$@";
+
+/* Error message when cannula insertion fails because the pod is in an unexpected state */
+"Pod is not in a state ready for cannula insertion." = "Pod is not in a state ready for cannula insertion.";
+
+/* Error message when prime fails because the pod is in an unexpected state */
+"Pod is not in a state ready for priming." = "Pod is not in a state ready for priming.";
+
+/* Error message action could not be performed because pod is suspended */
+"Pod is suspended" = "Pod is suspended";
+
+/* Pod state when prime or cannula insertion has not completed in the time allotted */
+"Pod setup window expired" = "Pod setup window expired";
+
+/* Delivery status when pod is priming
+   Pod status when priming */
+"Priming" = "Priming";
+
+/* Pod state when ready for basal programming */
+"Ready for basal programming" = "Ready for basal programming";
+
+/* Pod state when ready for cannula insertion */
+"Ready to insert cannula" = "Ready to insert cannula";
+
+/* The format string describing a resume. (1: Time)(2: Scheduled certainty */
+"Resume: %1$@ %2$@" = "Resume: %1$@ %2$@";
+
+/* Delivery status when basal is running */
+"Scheduled Basal" = "Scheduled Basal";
+
+/* Description for shutdown imminent alarm */
+"Shutdown imminent alarm" = "Shutdown imminent alarm";
+
+/* The format string describing a suspend. (1: Time)(2: Scheduled certainty */
+"Suspend: %1$@ %2$@" = "Suspend: %1$@ %2$@";
+
+/* Delivery status when insulin delivery is suspended */
+"Suspended" = "Suspended";
+
+/* Pod tank fill completed */
+"Tank fill completed" = "Tank fill completed";
+
+/* Pod power to motor activated */
+"Tank power activated" = "Tank power activated";
+
+/* Error message shown when temp basal could not be set due to existing temp basal in progress */
+"Temp basal in progress" = "Dočasný bazál už prebieha";
+
+/* Delivery status when temp basal is running */
+"Temp basal running" = "Temp basal running";
+
+/* The format string describing a temp basal. (1: The rate)(2: Start time)(3: duration)(4: volume)(5: scheduled certainty */
+"TempBasal: %1$@ U/hour %2$@ %3$@ %4$@ U %5$@" = "Dočasný Bazál: %1$@ J/hod %2$@ %3$@ %4$@ J %5$@";
+
+/* The format string for pod expiration notification body (1: time until expiration) */
+"Time to replace your pod! Your pod will expire in %1$@" = "Čas vymeniť váš Pod! Váš Pod expriruje o %1$@";
+
+/* String describing a dose that was possibly scheduled */
+"Uncertain" = "Neurčité";
+
+/* Error message shown when empty response from pod was received */
+"Unexpected response from pod" = "Neočakávaná odpoveď Podu";
+
+/* The format string for Unknown pod fault (1: The fault code value) */
+"Unknown pod fault %1$03d" = "Neznáma chyba Podu %1$03d";
+
+/* Recovery suggestion when operation could not be completed due to existing bolus in progress */
+"Wait for existing bolus to finish, or cancel bolus" = "Počkajte kým sa ukončí podanie bolusu, alebo zrušte bolus";
+
+/* Recovery suggestion when operation could not be completed due to existing temp basal in progress */
+"Wait for existing temp basal to finish, or suspend to cancel" = "Počkajte kým skončí dočasný bazál, alebo pozastavte pre zrušenie";
+
+/* Description waiting for pairing reminder */
+"Waiting for pairing reminder" = "Čakanie na pripomienku pre párovanie";
+

+ 7 - 7
Dependencies/rileylink_ios/OmniKitUI/it.lproj/Localizable.strings

@@ -72,7 +72,7 @@
 "Configuration" = "Configurazione";
 
 /* The title of the Insulin Type */
-"Insulin Type" = "Insulin Type";
+"Insulin Type" = "Tipo di Insulina";
 
 /* The title of the continue action in an action sheet */
 "Continue" = "Continua";
@@ -106,16 +106,16 @@
 "Error enabling bolus beeps" = "Errore durante l’attivazione dei bip bolo";
 
 /* The alert title for enable Confirmation Beeps */
-"Enable Confirmation Beeps" = "Enable Confirmation Beeps";
+"Enable Confirmation Beeps" = "Abilita Bip di Conferma";
 
 /* The alert title for Disable Confirmation Beep */
-"Disable Confirmation Beeps" = "Disable Confirmation Beeps";
+"Disable Confirmation Beeps" = "Disabilita Bip di Conferma";
 
 /* The alert title for enable Automatic Bolus Beeps */
-"Enable Automatic Bolus Beeps" = "Enable Automatic Bolus Beeps";
+"Enable Automatic Bolus Beeps" = "Abilita Bip Automatici di Bolus";
 
 /* The alert title for Disable Automatic Bolus Beeps */
-"Disable Automatic Bolus Beeps" = "Disable Automatic Bolus Beeps";
+"Disable Automatic Bolus Beeps" = "Disabilita Bip Automatici di Bolus";
 
 /* The alert title for a resume error */
 "Error Resuming" = "Errore durante la ripresa";
@@ -249,13 +249,13 @@
 "Unknown" = "Sconosciuto";
 
 /* The title of the diagnostics section in settings */
-"Diagnostics" = "Diagnostics";
+"Diagnostics" = "Diagnostica";
 
 /* The diagnostic command Read Pod Status */
 "Read Pod Status" = "Read Pod Status";
 
 /* The diagnostic command Read Pulse Log */
-"Read Pulse Log" = "Read Pulse Log";
+"Read Pulse Log" = "Leggi Registro Battiti";
 
 /* The title of the pod details section in settings */
 "Pod Details" = "Pod Details";

+ 261 - 0
Dependencies/rileylink_ios/OmniKitUI/sk.lproj/Localizable.strings

@@ -0,0 +1,261 @@
+/* Accessibility format string for (1: localized volume)(2: time) */
+"%1$@ units remaining at %2$@" = "%1$@ jednotiek zostáva o %2$@";
+
+/* The format string for displaying an offset from a time zone: (1: GMT)(2: -)(3: 4:00) */
+"%1$@%2$@%3$@" = "%1$@%2$@%3$@";
+
+/* Format string providing instructions for replacing pod due to a fault. (1: The fault description) */
+"%1$@. Insulin delivery has stopped. Please deactivate and remove pod." = "%1$@. Podávanie inzulínu je zastavené. Prosím deaktivujte a odstráňte Pod.";
+
+/* Format string for delivered insulin. (1: The localized amount)
+   Format string for insulin remaining in reservoir. (1: The localized amount) */
+"%@ U" = "%@ J";
+
+/* Format string for bolus progress when finished. (1: The localized amount) */
+"%@ U (Finished)" = "%@ U (Ukončené)";
+
+/* Format string for bolus progress. (1: The delivered amount) (2: The programmed amount) (3: the percent progress) */
+"%@ U of %@ U (%@)" = "%1$@ J z %2$@ J (%3$@)";
+
+/* Format string for temp basal rate. (1: The localized amount) */
+"%@ U/hour" = "%@ J/hod";
+
+/* Format string for bolus percent progress. (1: Percent progress) */
+"%@%%" = "%@%%";
+
+/* Format string for reservoir reading when above or equal to maximum reading. (1: The localized amount) */
+"%@+ U" = "%@+ J";
+
+/* Appends a full-stop to a statement */
+"%@." = "%@.";
+
+/* Format string for reservoir volume. (1: The localized volume) */
+"%@U" = "%@J";
+
+/* The title of the cell showing the pod activated at time */
+"Active Time" = "Aktívny Čas";
+
+/* The title of the cell showing the Pod Active Clock */
+"Pod Active Clock" = "Aktívne Hodiny Podu";
+
+/* The title of the cell showing alarm status */
+"Alarms" = "Alarmy";
+
+/* Confirmation message for shutting down a pod */
+"Are you sure you want to shutdown this pod?" = "Naozaj chcete vypnúť tento Pod?";
+
+/* Confirmation message for removing Omnipod PumpManager */
+"Are you sure you want to stop using Omnipod?" = "Naozaj chcete prestať používať Ominpod?";
+
+/* The title text for the address assigned to the pod */
+"Assigned Address" = "Priradená Adresa";
+
+/* The title of the cell showing pod basal status */
+"Basal Delivery" = "Podávanie Bazálu";
+
+/* The title text for the basal rate schedule */
+"Basal Rates" = "Bazálne Dávky";
+
+/* The title of the cell showing pod bolus status */
+"Bolus Delivery" = "Podávanie Bolusu";
+
+/* The title of the cancel action in an action sheet */
+"Cancel" = "Zrušiť";
+
+/* The title of the command to change pump time zone */
+"Change Time Zone" = "Zmeniť Časové Pásmo";
+
+/* Progress message for changing pod time. */
+"Changing time…" = "Mení sa čas…";
+
+/* The title of the configuration section in settings */
+"Configuration" = "Konfigurácia";
+
+/* The title of the Insulin Type */
+"Insulin Type" = "Typ Inzulínu";
+
+/* The title of the continue action in an action sheet */
+"Continue" = "Pokračovať";
+
+/* Button title to deactivate pod because of fault during setup */
+"Deactivate" = "Deaktivovať";
+
+/* Button title for pod deactivation
+   Button title to deactivate pod */
+"Deactivate Pod" = "Deaktivovať Pod";
+
+/* Button title to delete Omnipod PumpManager */
+"Delete Omnipod" = "Vymazať Omnipod";
+
+/* Title text for delivery limits */
+"Delivery Limits" = "Limity Dávkovania";
+
+/* The title of the device information section in settings */
+"Device Information" = "Informácie o zariadeni";
+
+/* Title text for button to disable bolus beeps */
+"Disable Bolus Beeps" = "Vypnúť Pípnutie pre Bolus";
+
+/* Title text for button to enable bolus beeps */
+"Enable Bolus Beeps" = "Zapnúť Pípnutie pre Bolus";
+
+/* The alert title for disable bolus beeps error */
+"Error disabling bolus beeps" = "Chyba vypnutia pípnutie pre Bolus";
+
+/* The alert title for enable bolus beeps error */
+"Error enabling bolus beeps" = "Chyba zapnutia pípnutie pre bolus";
+
+/* The alert title for enable Confirmation Beeps */
+"Enable Confirmation Beeps" = "Zapnúť Potvrdzovacie Pípnutia";
+
+/* The alert title for Disable Confirmation Beep */
+"Disable Confirmation Beeps" = "Vypnúť Potvrdzovacie Pípnutia";
+
+/* The alert title for enable Automatic Bolus Beeps */
+"Enable Automatic Bolus Beeps" = "Povoliť Automatické Pípnutia pre Bolus";
+
+/* The alert title for Disable Automatic Bolus Beeps */
+"Disable Automatic Bolus Beeps" = "Vypnúť Automatické Pípnutia pre Bolus";
+
+/* The alert title for a resume error */
+"Error Resuming" = "Zhrnutie Chyby";
+
+/* The alert title for a suspend error */
+"Error Suspending" = "Chyba Pozastavenia";
+
+/* The title of the cell showing the pod expiration reminder date */
+"Expiration Reminder" = "Pripomienka Expirácie";
+
+/* The title of the cell showing the pod expiration after expiry */
+"Expired" = "Expirovaný";
+
+/* The title of the cell showing the pod expiration */
+"Expires" = "Expiruje";
+
+/* Pod life HUD view label */
+"Fault" = "Fault";
+
+/* The title of the command to finish pod setup */
+"Finish pod setup" = "Dokončiť nastavenie Podu";
+
+/* Accessibility format string for (1: localized volume)(2: time) */
+"Greater than %1$@ units remaining at %2$@" = "Viac ako %1$@ jednotiek ostáva o %2$@";
+
+/* Instructions when deactivating pod that has been paired, but not attached. */
+"Incompletely set up pod must be deactivated before pairing with a new one. Please deactivate and discard pod." = "Neúplne nastavený Pod musí byť deaktivovaný predtým ako spárujete nový. Prosím deaktivujte a znehodnodte Pod.";
+
+/* Instructions when deactivating pod that has been paired and possibly attached. */
+"Incompletely set up pod must be deactivated before pairing with a new one. Please deactivate and remove pod." = "Neúplne nastavený Pod musí byť deaktivovaný predtým ako spárujete nový. Prosím deaktivujte a odstráňte Pod.";
+
+/* Button title to insert cannula during setup */
+"Insert Cannula" = "Zaviesť Kanylu";
+
+/* The title of the cell showing delivered insulin */
+"Insulin Delivered" = "Podaný Inzulín";
+
+/* The error message shown when Loop's basal schedule has an unsupported rate */
+"Invalid entry" = "Neplatný záznam";
+
+/* The title of the cell showing the pod lot id */
+"Lot" = "Lot";
+
+/* The detail text for bolus delivery when no bolus is being delivered */
+"None" = "None";
+
+/* Button title to pair with pod during setup */
+"Pair" = "Pair";
+
+/* The title of the command to pair new pod */
+"Pair New Pod" = "Pair New Pod";
+
+/* The text of the loading label when pairing */
+"Pairing…" = "Pairing…";
+
+/* The title of the cell showing the pod pi version */
+"PI Version" = "PI Version";
+
+/* The title of the command to play test beeps */
+"Play Test Beeps" = "Play Test Beeps";
+
+/* Progress message for play test beeps. */
+"Play Test Beeps…" = "Play Test Beeps…";
+
+/* The title of the cell showing the pod pm version */
+"PM Version" = "PM Version";
+
+/* Label describing pod age view */
+"Pod Age" = "Pod Age";
+
+/* Title of the pod settings view controller */
+"Pod Settings" = "Pod Settings";
+
+/* The text of the loading label when pod is primed */
+"Primed" = "Primed";
+
+/* The text of the loading label when priming */
+"Priming…" = "Priming…";
+
+/* Label describing time remaining view */
+"Remaining" = "Remaining";
+
+/* Label indicating pod replacement necessary
+   The title of the command to replace pod */
+"Replace Pod" = "Replace Pod";
+
+/* The title of the command to replace pod when there is a pod fault */
+"Replace Pod Now" = "Replace Pod Now";
+
+/* The title of the cell showing reservoir status */
+"Reservoir" = "Reservoir";
+
+/* Button title for retrying pod deactivation */
+"Retry Pod Deactivation" = "Retry Pod Deactivation";
+
+/* Title of button to save delivery limit settings
+   Title of button to sync basal profile when no pod paired */
+"Save" = "Save";
+
+/* The detail text of the basal row when pod is running scheduled basal */
+"Schedule" = "Schedule";
+
+/* The title of the status section in settings */
+"Status" = "Status";
+
+/* A message indicating a command succeeded */
+"Succeeded" = "Succeeded";
+
+/* The detail text of the basal row when pod is suspended */
+"Suspended" = "Suspended";
+
+/* Title text for the button to delete Omnipod PumpManager */
+"Switch from Omnipod Pumps" = "Switch from Omnipod Pumps";
+
+/* Title of button to sync basal profile from pod */
+"Sync With Pod" = "Sync With Pod";
+
+/* The title of the command to run the test command */
+"Test Command" = "Test Command";
+
+/* Progress message for testing commands. */
+"Testing Commands…" = "Testing Commands…";
+
+/* The error message shown when Loop's basal schedule has more entries than the pod can support */
+"Too many entries" = "Too many entries";
+
+/* Instructions when pod cannot be deactivated */
+"Unable to deactivate pod. Please continue and pair a new one." = "Unable to deactivate pod. Please continue and pair a new one.";
+
+/* The detail text for delivered insulin when no measurement is available */
+"Unknown" = "Unknown";
+
+/* The title of the diagnostics section in settings */
+"Diagnostics" = "Diagnostics";
+
+/* The diagnostic command Read Pod Status */
+"Read Pod Status" = "Read Pod Status";
+
+/* The diagnostic command Read Pulse Log */
+"Read Pulse Log" = "Read Pulse Log";
+
+/* The title of the pod details section in settings */
+"Pod Details" = "Pod Details";

+ 63 - 0
Dependencies/rileylink_ios/OmniKitUI/sk.lproj/OmnipodPumpManager.strings

@@ -0,0 +1,63 @@
+/* Class = "UITableViewSection"; headerTitle = "Remove POD"; ObjectID = "1LF-te-Bdd"; */
+"1LF-te-Bdd.headerTitle" = "Odstrániť Pod";
+
+/* Class = "UINavigationItem"; title = "RileyLink Setup"; ObjectID = "3HH-eJ-lRh"; */
+"3HH-eJ-lRh.title" = "RileyLink Nastavenie";
+
+/* Class = "UITableViewController"; title = "Pump Setup"; ObjectID = "91O-Un-vKc"; */
+"91O-Un-vKc.title" = "Nastavenie Pumpy";
+
+/* Class = "UITableViewController"; title = "Pump Setup"; ObjectID = "ack-ra-XH6"; */
+"ack-ra-XH6.title" = "Nastavenie Pumpy";
+
+/* Class = "UITableViewController"; title = "Pump Setup"; ObjectID = "aNg-mm-Uuy"; */
+"aNg-mm-Uuy.title" = "Nastavenie Pumpy";
+
+/* Class = "UILabel"; text = "Your Pod is ready for use."; ObjectID = "bJ5-iH-fnF"; */
+"bJ5-iH-fnF.text" = "Váš Pod je pripravený k použitiu.";
+
+/* Class = "UILabel"; text = "Loop will remind you to change your pod before it expires. You can change this to a time convenient for you."; ObjectID = "Eng-IY-fQ7"; */
+"Eng-IY-fQ7.text" = "Loop vám pripomenie vymeniť váš Pod predtým ako expiruje. Môžete to zmeniť na čas, ktorý vám vyhovuje.";
+
+/* Class = "UILabel"; text = "Reminder"; ObjectID = "ePA-6p-q8C"; */
+"ePA-6p-q8C.text" = "Pripomienka";
+
+/* Class = "UITableViewSection"; footerTitle = "NOTE: Do not remove the pod's needle cap at this time."; ObjectID = "EUt-xk-Rmp"; */
+"EUt-xk-Rmp.footerTitle" = "POZNÁMKA: Neodstráňujte teraz kryt na ihle Podu.";
+
+/* Class = "UITableViewSection"; headerTitle = "Prepare Pod"; ObjectID = "EUt-xk-Rmp"; */
+"EUt-xk-Rmp.headerTitle" = "Pripravte Pod";
+
+/* Class = "UILabel"; text = "Please deactivate the pod. When deactivation is complete, remove pod from body."; ObjectID = "GK7-jb-tyY"; */
+"GK7-jb-tyY.text" = "Prosím deaktivujte Pod. Po ukončení deaktivácie, odstráňte Pod z tela.";
+
+/* Class = "UINavigationItem"; title = "Insert Cannula"; ObjectID = "HwT-30-f0y"; */
+"HwT-30-f0y.title" = "Zaviesť Kanylu";
+
+/* Class = "UILabel"; text = "Prepare site. Remove the pod's needle cap and adhesive backing. If pod is OK, apply to site."; ObjectID = "Iuv-5M-bDH"; */
+"Iuv-5M-bDH.text" = "Pripravte miesto. Odstráňte kryt ihly a kryt náplaste. Ak je Pod vporiadku, aplikujte ho na miesto.";
+
+/* Class = "UINavigationItem"; title = "Pod Pairing"; ObjectID = "jVO-Ut-MhL"; */
+"jVO-Ut-MhL.title" = "Párovanie Podu";
+
+/* Class = "UITableViewController"; title = "Pump Setup"; ObjectID = "k1Y-x4-m0a"; */
+"k1Y-x4-m0a.title" = "Nastavenie Pumpy";
+
+/* Class = "UINavigationItem"; title = "Setup Complete"; ObjectID = "nDb-R5-e02"; */
+"nDb-R5-e02.title" = "Nastavenie je dokončené";
+
+/* Class = "UITableViewSection"; footerTitle = "NOTE: If cannula sticks out, press cancel."; ObjectID = "rcC-ke-lUP"; */
+"rcC-ke-lUP.footerTitle" = "POZNÁMKA: Ak kanyla vyskočí vonku, stačte zrušiť.";
+
+/* Class = "UITableViewSection"; headerTitle = "Apply POD"; ObjectID = "rcC-ke-lUP"; */
+"rcC-ke-lUP.headerTitle" = "Aplikujte POD";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "vEc-Km-ewe"; */
+"vEc-Km-ewe.text" = "Label";
+
+/* Class = "UILabel"; text = "Fill a new pod with insulin. Listen for 2 beeps from the pod during filling. Keep the RileyLink about 6 inches from the pod during pairing."; ObjectID = "vmF-Dc-3DS"; */
+"vmF-Dc-3DS.text" = "Fill a new pod with insulin. Listen for 2 beeps from the pod during filling. Keep the RileyLink about 6 inches from the pod during pairing.";
+
+/* Class = "UINavigationItem"; title = "Replace Pod"; ObjectID = "yy1-xf-HdR"; */
+"yy1-xf-HdR.title" = "Vymeňte Pod";
+

+ 21 - 0
Dependencies/rileylink_ios/RileyLink.xcodeproj/project.pbxproj

@@ -880,6 +880,16 @@
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
+		19C1666A2756F09E00ED12E3 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = "<group>"; };
+		19C1666B2756F09E00ED12E3 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = "<group>"; };
+		19C1666C2756F09E00ED12E3 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/MinimedPumpManager.strings; sourceTree = "<group>"; };
+		19C1666D2756F09E00ED12E3 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = "<group>"; };
+		19C1666E2756F09E00ED12E3 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = "<group>"; };
+		19C1666F2756F09E00ED12E3 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/OmnipodPumpManager.strings; sourceTree = "<group>"; };
+		19C166702756F09E00ED12E3 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = "<group>"; };
+		19C166712756F09E00ED12E3 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = "<group>"; };
+		19C166722756F09E00ED12E3 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = "<group>"; };
+		19C166732756F09E00ED12E3 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = "<group>"; };
 		19E85E1F273EA8F2000CCFAE /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/OmnipodPumpManager.strings; sourceTree = "<group>"; };
 		19E85E20273EA8F4000CCFAE /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = "<group>"; };
 		19E85E21273EA8F6000CCFAE /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/MinimedPumpManager.strings; sourceTree = "<group>"; };
@@ -3211,6 +3221,7 @@
 				"pt-BR",
 				ro,
 				tr,
+				sk,
 			);
 			mainGroup = C12EA22E198B436800309FA4;
 			productRefGroup = C12EA238198B436800309FA4 /* Products */;
@@ -4353,6 +4364,7 @@
 				7D9BF0352336A304005DCFD6 /* pt-BR */,
 				7D9BF14D23371407005DCFD6 /* ro */,
 				19E85E21273EA8F6000CCFAE /* tr */,
+				19C1666C2756F09E00ED12E3 /* sk */,
 			);
 			name = MinimedPumpManager.storyboard;
 			sourceTree = "<group>";
@@ -4378,6 +4390,7 @@
 				7D9BF0382336A304005DCFD6 /* pt-BR */,
 				7D9BF15123371408005DCFD6 /* ro */,
 				19E85E24273EA8F6000CCFAE /* tr */,
+				19C166722756F09E00ED12E3 /* sk */,
 			);
 			name = Localizable.strings;
 			sourceTree = "<group>";
@@ -4402,6 +4415,7 @@
 				7D9BF0312336A2FB005DCFD6 /* fi */,
 				7D9BF0392336A304005DCFD6 /* pt-BR */,
 				7D9BF15223371408005DCFD6 /* ro */,
+				19C166732756F09E00ED12E3 /* sk */,
 			);
 			name = Localizable.strings;
 			sourceTree = "<group>";
@@ -4427,6 +4441,7 @@
 				7D9BF0372336A304005DCFD6 /* pt-BR */,
 				7D9BF15023371408005DCFD6 /* ro */,
 				19E85E23273EA8F6000CCFAE /* tr */,
+				19C1666A2756F09E00ED12E3 /* sk */,
 			);
 			name = Localizable.strings;
 			sourceTree = "<group>";
@@ -4453,6 +4468,7 @@
 				7D9BF0362336A304005DCFD6 /* pt-BR */,
 				7D9BF14F23371407005DCFD6 /* ro */,
 				19E85E22273EA8F6000CCFAE /* tr */,
+				19C166712756F09E00ED12E3 /* sk */,
 			);
 			name = Localizable.strings;
 			sourceTree = "<group>";
@@ -4478,6 +4494,7 @@
 				7D9BF03B2336A305005DCFD6 /* pt-BR */,
 				7D9BF15423371408005DCFD6 /* ro */,
 				19E85E25273EA8F6000CCFAE /* tr */,
+				19C1666D2756F09E00ED12E3 /* sk */,
 			);
 			name = Localizable.strings;
 			sourceTree = "<group>";
@@ -4503,6 +4520,7 @@
 				7D9BF03C2336A305005DCFD6 /* pt-BR */,
 				7D9BF15523371408005DCFD6 /* ro */,
 				19E85E27273EA94B000CCFAE /* tr */,
+				19C166702756F09E00ED12E3 /* sk */,
 			);
 			name = Localizable.strings;
 			sourceTree = "<group>";
@@ -4529,6 +4547,7 @@
 				7D9BF05F2336AE5A005DCFD6 /* vi */,
 				7D9BF14E23371407005DCFD6 /* ro */,
 				19E85E1F273EA8F2000CCFAE /* tr */,
+				19C1666F2756F09E00ED12E3 /* sk */,
 			);
 			name = OmnipodPumpManager.storyboard;
 			sourceTree = "<group>";
@@ -4554,6 +4573,7 @@
 				C1B9E0FF256AF078008E8B84 /* sv */,
 				C1B9E100256AF07B008E8B84 /* vi */,
 				19E85E26273EA8F7000CCFAE /* tr */,
+				19C1666E2756F09E00ED12E3 /* sk */,
 			);
 			name = Localizable.strings;
 			sourceTree = "<group>";
@@ -4579,6 +4599,7 @@
 				7D9BF03A2336A305005DCFD6 /* pt-BR */,
 				7D9BF15323371408005DCFD6 /* ro */,
 				19E85E20273EA8F4000CCFAE /* tr */,
+				19C1666B2756F09E00ED12E3 /* sk */,
 			);
 			name = Localizable.strings;
 			sourceTree = "<group>";

+ 51 - 0
Dependencies/rileylink_ios/RileyLink/sk.lproj/Localizable.strings

@@ -0,0 +1,51 @@
+/* The title of the about section */
+"About" = "About";
+
+/* The title of the button to add the credentials for a service */
+"Add Account" = "Add Account";
+
+/* The title of the nightscout API secret credential */
+"API Secret" = "API Secret";
+
+/* The title of the configuration section in settings */
+"Configuration" = "Configuration";
+
+/* The title of the button to remove the credentials for a service */
+"Delete Account" = "Delete Account";
+
+/* The placeholder text instructing users how to enter a pump ID */
+"Enter the 6-digit pump ID" = "Enter the 6-digit pump ID";
+
+/* The title text for the pull cgm Data cell */
+"Fetch CGM" = "Fetch CGM";
+
+/* The placeholder text for the nightscout site URL credential */
+"http://mysite.herokuapp.com" = "http://mysite.herokuapp.com";
+
+/* The title of the Nightscout service */
+"Nightscout" = "Nightscout";
+
+/* The title text for the pump ID config value */
+"Pump ID" = "Pump ID";
+
+/* Title text for section listing configured pumps */
+"Pumps" = "Pumps";
+
+/* The default placeholder string for a credential */
+"Required" = "Required";
+
+/* Title for RileyLink Testing main view controller */
+"RileyLink Testing" = "RileyLink Testing";
+
+/* Title text for button to set up omnipod */
+"Setup Omnipod" = "Setup Omnipod";
+
+/* The title of the nightscout site URL credential */
+"Site URL" = "Site URL";
+
+/* The empty-state text for a configuration value */
+"Tap to set" = "Tap to set";
+
+/* The title text for the nightscout upload enabled switch cell */
+"Upload To Nightscout" = "Upload To Nightscout";
+

+ 30 - 0
Dependencies/rileylink_ios/RileyLinkBLEKit/sk.lproj/Localizable.strings

@@ -0,0 +1,30 @@
+/* Write size limit exceeded error description (1: size limit) */
+"Data exceeded maximum size of %@ bytes" = "Data exceeded maximum size of %@ bytes";
+
+/* Invalid input error description (1: input) */
+"Input %@ is invalid" = "Input %@ is invalid";
+
+/* Recovery suggestion for unknown peripheral characteristic */
+"Make sure the device is nearby, and the issue should resolve automatically" = "Make sure the device is nearby, and the issue should resolve automatically";
+
+/* Timeout error description */
+"Peripheral did not respond in time" = "Peripheral did not respond in time";
+
+/* Not ready error description */
+"Peripheral isnʼt connected" = "Peripheral isnʼt connected";
+
+/* Response timeout error description */
+"Pump did not respond in time" = "Pump did not respond in time";
+
+/* Invalid response error description (1: response) */
+"Response %@ is invalid" = "Response %@ is invalid";
+
+/* Unsupported command error description */
+"RileyLink firmware does not support the %@ command" = "RileyLink firmware does not support the %@ command";
+
+/* Failure reason: unknown peripheral characteristic */
+"The RileyLink was temporarily disconnected" = "The RileyLink was temporarily disconnected";
+
+/* Error description */
+"Unknown characteristic" = "Unknown characteristic";
+

+ 104 - 0
Dependencies/rileylink_ios/RileyLinkKitUI/sk.lproj/Localizable.strings

@@ -0,0 +1,104 @@
+/* The title of the section describing commands */
+"Commands" = "Príkazy";
+
+/* The connected state */
+"Connected" = "Pripojený";
+
+/* The in-progress connecting state */
+"Connecting" = "Pripája sa";
+
+/* The title of the cell showing BLE connection state */
+"Connection State" = "Stav pripojenia";
+
+/* The title of the section describing the device */
+"Device" = "Zariadenie";
+
+/* The title of the devices table section in RileyLink settings */
+"Devices" = "Zariadenia";
+
+/* The disconnected state */
+"Disconnected" = "Odpojené";
+
+/* The in-progress disconnecting state */
+"Disconnecting" = "Odpája sa";
+
+/* The title of the cell showing firmware version */
+"Firmware" = "Firmware";
+
+/* The title of the cell showing current rileylink frequency */
+"Frequency" = "Frekvencia";
+
+/* The title of the cell showing device name */
+"Name" = "Názov";
+
+/* RileyLink setup description */
+"RileyLink allows for communication with the pump over Bluetooth Low Energy." = "RileyLink allows for communication with the pump over Bluetooth Low Energy.";
+
+/* The title of the cell showing BLE signal strength (RSSI) */
+"Signal Strength" = "Sila Signálu";
+
+/* The header of the cells showing connection monitoring */
+"Connection Monitoring" = "Connection Monitoring";
+
+/* The title of the cell showing uptime */
+"Uptime" = "Uptime";
+
+/* The title of the cell showing battery level */
+"Battery level" = "Stav batérie";
+
+/* The title of the cell showing Voltage */
+"Voltage" = "Napätie";
+
+/* "The title of the section for alerts" */
+"Alert" = "Upozornenie";
+
+/* The title of the cell showing Low Battery Alert */
+"Low Battery Alert" = "Upozornenie Nízky stav Batérie";
+
+/* Header of list showing battery level alert options */
+"Battery level Alert" = "Upozornenie Stavu Batérie";
+
+/* Battery level alert OFF in list of options */
+"OFF" = "VYP";
+
+/* The title of the command to update diagnostic LEDs */
+"Diagnostic LEDs" = "Diagnostic LEDs";
+
+/* The title of the command to fetch RileyLink statistics */
+"Get RileyLink Statistics" = "Get RileyLink Statistics";
+
+/* The title of the command to invert BLE connection LED logic */
+"Invert LED Logic" = "Invert LED Logic";
+
+/* The header of the cells showing test commands */
+"Test Commands" = "Testovať Ovládanie";
+
+/* The title of the cell showing Lighten Yellow LED */
+"Lighten Yellow LED" = "Lighten Yellow LED";
+
+/* The title of the cell showing Lighten Yellow LED */
+"Lighten Red LED" = "Lighten Red LED";
+
+/* The title of the cell showing Test Vibration */
+"Test Vibration" = "Testovať Vibrovanie";
+
+/* The title of the cell for sounding device finding piezo */
+"Find Device" = "Nájsť Zariadenie";
+
+/* The title of the cell for connection LED */
+"Connection LED" = "Connection LED";
+
+/* The title of the cell for connection vibration */
+"Connection Vibration" = "Connection Vibration";
+
+/* Detail text when battery alert disabled. */
+"Off" = "Vypnuté";
+
+/* Text indicating LED Mode is on */
+"On" = "Zapnuté";
+
+/* Text indicating LED Mode is off */
+"Off" = "Off";
+
+/* Text indicating LED Mode is auto */
+"Auto" = "Auto";

+ 15 - 9
FreeAPS.xcodeproj/project.pbxproj

@@ -14,7 +14,7 @@
 		0F7A65FBD2CD8D6477ED4539 /* NotificationsConfigProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = E625985B47742D498CB1681A /* NotificationsConfigProvider.swift */; };
 		17A9D0899046B45E87834820 /* CREditorProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C8D5F457B5AFF763F8CF3DF /* CREditorProvider.swift */; };
 		1927C8E62744606D00347C69 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1927C8E82744606D00347C69 /* InfoPlist.strings */; };
-		19795117275952E80044850D /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 198377D4266BFFF6004DE65E /* Localizable.strings */; };
+		19795118275953E50044850D /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 198377D4266BFFF6004DE65E /* Localizable.strings */; };
 		198377D2266BFFF6004DE65E /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 198377D4266BFFF6004DE65E /* Localizable.strings */; };
 		199561C1275E61A50077B976 /* HealthKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 199561C0275E61A50077B976 /* HealthKit.framework */; };
 		1BBB001DAD60F3B8CEA4B1C7 /* ISFEditorStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 505E09DC17A0C3D0AF4B66FE /* ISFEditorStateModel.swift */; };
@@ -207,6 +207,7 @@
 		38E8757927579D9200975559 /* Publisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3811DE5525C9D4D500A708ED /* Publisher.swift */; };
 		38E8757B2757B1C300975559 /* TempTargetsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38E8757A2757B1C300975559 /* TempTargetsView.swift */; };
 		38E8757D2757C45D00975559 /* BolusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38E8757C2757C45D00975559 /* BolusView.swift */; };
+		38E8757E2758C86A00975559 /* ConvenienceExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38192E0C261BAF980094D973 /* ConvenienceExtensions.swift */; };
 		38E8758027595DC600975559 /* BolusConfirmationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38E8757F27595DC500975559 /* BolusConfirmationView.swift */; };
 		38E989DD25F5021400C0CED0 /* PumpStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38E989DC25F5021400C0CED0 /* PumpStatus.swift */; };
 		38E98A2325F52C9300C0CED0 /* Signpost.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38E98A1B25F52C9300C0CED0 /* Signpost.swift */; };
@@ -430,6 +431,8 @@
 		199561C0275E61A50077B976 /* HealthKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HealthKit.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS8.0.sdk/System/Library/Frameworks/HealthKit.framework; sourceTree = DEVELOPER_DIR; };
 		199732B4271B72DD00129A3F /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/Localizable.strings"; sourceTree = "<group>"; };
 		199732B5271B9EE900129A3F /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = "<group>"; };
+		19C166682756EFBD00ED12E3 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		19C166692756EFBD00ED12E3 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = "<group>"; };
 		1CAE81192B118804DCD23034 /* SnoozeProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SnoozeProvider.swift; sourceTree = "<group>"; };
 		212E8BFE6D66EE65AA26A114 /* CalibrationsProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CalibrationsProvider.swift; sourceTree = "<group>"; };
 		223EC0494F55A91E3EA69EF4 /* BolusStateModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BolusStateModel.swift; sourceTree = "<group>"; };
@@ -1105,7 +1108,6 @@
 		3818AA48274C267000843DB3 /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
-				199561C0275E61A50077B976 /* HealthKit.framework */,
 				E0CC2C5B275B9DAE00A7BC71 /* HealthKit.framework */,
 				38E87402274F78C000975559 /* libswiftCoreNFC.tbd */,
 				38E873FD274F761800975559 /* CoreNFC.framework */,
@@ -1958,6 +1960,7 @@
 				fi,
 				"pt-PT",
 				"pt-BR",
+				sk,
 			);
 			mainGroup = 388E594F25AD948C0019842D;
 			packageReferences = (
@@ -2004,7 +2007,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				38E8753727554D5900975559 /* Preview Assets.xcassets in Resources */,
-				19795117275952E80044850D /* Localizable.strings in Resources */,
+				19795118275953E50044850D /* Localizable.strings in Resources */,
 				38E8754627554D8A00975559 /* Assets.xcassets in Resources */,
 				38E8753427554D5800975559 /* Assets.xcassets in Resources */,
 			);
@@ -2300,6 +2303,7 @@
 				38E8752A27554D5700975559 /* FreeAPSApp.swift in Sources */,
 				38E8757B2757B1C300975559 /* TempTargetsView.swift in Sources */,
 				38E8753027554D5700975559 /* NotificationView.swift in Sources */,
+				38E8757E2758C86A00975559 /* ConvenienceExtensions.swift in Sources */,
 				38E8754727554DF100975559 /* Color+Extensions.swift in Sources */,
 				38E8755927567CA600975559 /* Decimal+Extensions.swift in Sources */,
 				38E8758027595DC600975559 /* BolusConfirmationView.swift in Sources */,
@@ -2358,6 +2362,7 @@
 				1927C8FA2744612500347C69 /* tr */,
 				1927C8FB2744612600347C69 /* uk */,
 				1927C8FE274489BA00347C69 /* Base */,
+				19C166682756EFBD00ED12E3 /* sk */,
 			);
 			name = InfoPlist.strings;
 			sourceTree = "<group>";
@@ -2385,6 +2390,7 @@
 				1918333A26ADA46800F45722 /* fi */,
 				199732B4271B72DD00129A3F /* pt-PT */,
 				199732B5271B9EE900129A3F /* pt-BR */,
+				19C166692756EFBD00ED12E3 /* sk */,
 			);
 			name = Localizable.strings;
 			sourceTree = "<group>";
@@ -2657,12 +2663,12 @@
 				CODE_SIGN_STYLE = Automatic;
 				CURRENT_PROJECT_VERSION = "$(BUILD_VERSION)";
 				DEVELOPMENT_ASSET_PATHS = "\"FreeAPSWatch WatchKit Extension/Preview Content\"";
-				DEVELOPMENT_TEAM = T7VZ6LU6H3;
+				DEVELOPMENT_TEAM = "${DEVELOPER_TEAM}";
 				ENABLE_PREVIEWS = YES;
 				GENERATE_INFOPLIST_FILE = YES;
 				INFOPLIST_FILE = "FreeAPSWatch WatchKit Extension/Info.plist";
-				INFOPLIST_KEY_CFBundleDisplayName = "iAPS WatchKit Extension";
-				INFOPLIST_KEY_CLKComplicationPrincipalClass = FreeAPSWatch_WatchKit_Extension.ComplicationController;
+				INFOPLIST_KEY_CFBundleDisplayName = "$(APP_DISPLAY_NAME) WatchKit Extension";
+				INFOPLIST_KEY_CLKComplicationPrincipalClass = "$(PRODUCT_MODULE_NAME).ComplicationController";
 				INFOPLIST_KEY_NSHumanReadableCopyright = "";
 				INFOPLIST_KEY_WKRunsIndependentlyOfCompanionApp = NO;
 				LD_RUNPATH_SEARCH_PATHS = (
@@ -2693,12 +2699,12 @@
 				CODE_SIGN_STYLE = Automatic;
 				CURRENT_PROJECT_VERSION = "$(BUILD_VERSION)";
 				DEVELOPMENT_ASSET_PATHS = "\"FreeAPSWatch WatchKit Extension/Preview Content\"";
-				DEVELOPMENT_TEAM = T7VZ6LU6H3;
+				DEVELOPMENT_TEAM = "${DEVELOPER_TEAM}";
 				ENABLE_PREVIEWS = YES;
 				GENERATE_INFOPLIST_FILE = YES;
 				INFOPLIST_FILE = "FreeAPSWatch WatchKit Extension/Info.plist";
-				INFOPLIST_KEY_CFBundleDisplayName = "iAPS WatchKit Extension";
-				INFOPLIST_KEY_CLKComplicationPrincipalClass = FreeAPSWatch_WatchKit_Extension.ComplicationController;
+				INFOPLIST_KEY_CFBundleDisplayName = "$(APP_DISPLAY_NAME) WatchKit Extension";
+				INFOPLIST_KEY_CLKComplicationPrincipalClass = "$(PRODUCT_MODULE_NAME).ComplicationController";
 				INFOPLIST_KEY_NSHumanReadableCopyright = "";
 				INFOPLIST_KEY_WKRunsIndependentlyOfCompanionApp = NO;
 				LD_RUNPATH_SEARCH_PATHS = (

+ 2 - 2
FreeAPS.xcodeproj/xcuserdata/i.valkou.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -33,12 +33,12 @@
 		<key>FreeAPSWatch (Complication).xcscheme_^#shared#^_</key>
 		<dict>
 			<key>orderHint</key>
-			<integer>18</integer>
+			<integer>11</integer>
 		</dict>
 		<key>FreeAPSWatch (Notification).xcscheme_^#shared#^_</key>
 		<dict>
 			<key>orderHint</key>
-			<integer>17</integer>
+			<integer>12</integer>
 		</dict>
 		<key>FreeAPSWatch.xcscheme_^#shared#^_</key>
 		<dict>

+ 0 - 43
FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved

@@ -1,43 +0,0 @@
-{
-  "object": {
-    "pins": [
-      {
-        "package": "swift-algorithms",
-        "repositoryURL": "https://github.com/apple/swift-algorithms",
-        "state": {
-          "branch": null,
-          "revision": "2327673b0e9c7e90e6b1826376526ec3627210e4",
-          "version": "0.2.1"
-        }
-      },
-      {
-        "package": "swift-numerics",
-        "repositoryURL": "https://github.com/apple/swift-numerics",
-        "state": {
-          "branch": null,
-          "revision": "6583ac70c326c3ee080c1d42d9ca3361dca816cd",
-          "version": "0.1.0"
-        }
-      },
-      {
-        "package": "SwiftDate",
-        "repositoryURL": "https://github.com/malcommac/SwiftDate",
-        "state": {
-          "branch": null,
-          "revision": "6190d0cefff3013e77ed567e6b074f324e5c5bf5",
-          "version": "6.3.1"
-        }
-      },
-      {
-        "package": "Swinject",
-        "repositoryURL": "https://github.com/Swinject/Swinject",
-        "state": {
-          "branch": null,
-          "revision": "f10b6e9ebff440f985c43008f7c2d097639fcb81",
-          "version": "2.8.1"
-        }
-      }
-    ]
-  },
-  "version": 1
-}

+ 6 - 0
FreeAPS/Resources/Base.lproj/InfoPlist.strings

@@ -12,3 +12,9 @@
 
 /* Privacy - Calendars Usage Description */
 "NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events.";
+
+/* Privacy - Health Update Usage Description */
+"NSHealthUpdateUsageDescription" = "Health App is used to store blood glucose data";
+
+/* Privacy - Health Share Usage Description */
+"NSHealthShareUsageDescription" = "Health App is used to store blood glucose data";

+ 6 - 0
FreeAPS/Resources/ar.lproj/InfoPlist.strings

@@ -12,3 +12,9 @@
 
 /* Privacy - Calendars Usage Description */
 "NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events.";
+
+/* Privacy - Health Update Usage Description */
+"NSHealthUpdateUsageDescription" = "Health App is used to store blood glucose data";
+
+/* Privacy - Health Share Usage Description */
+"NSHealthShareUsageDescription" = "Health App is used to store blood glucose data";

+ 6 - 0
FreeAPS/Resources/ca.lproj/InfoPlist.strings

@@ -12,3 +12,9 @@
 
 /* Privacy - Calendars Usage Description */
 "NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events.";
+
+/* Privacy - Health Update Usage Description */
+"NSHealthUpdateUsageDescription" = "Health App is used to store blood glucose data";
+
+/* Privacy - Health Share Usage Description */
+"NSHealthShareUsageDescription" = "Health App is used to store blood glucose data";

+ 6 - 0
FreeAPS/Resources/da.lproj/InfoPlist.strings

@@ -12,3 +12,9 @@
 
 /* Privacy - Calendars Usage Description */
 "NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events.";
+
+/* Privacy - Health Update Usage Description */
+"NSHealthUpdateUsageDescription" = "Health App is used to store blood glucose data";
+
+/* Privacy - Health Share Usage Description */
+"NSHealthShareUsageDescription" = "Health App is used to store blood glucose data";

+ 11 - 5
FreeAPS/Resources/de.lproj/InfoPlist.strings

@@ -1,14 +1,20 @@
 /* Privacy - NFC Scan Usage Description */
-"NFCReaderUsageDescription" = "NFC is used to scan Libre sensors.";
+"NFCReaderUsageDescription" = "NFC wird zum Scannen von Libre Sensoren benutzt.";
 
 /* Privacy - Bluetooth Always Usage Description */
-"NSBluetoothAlwaysUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+"NSBluetoothAlwaysUsageDescription" = "Bluetooth wird verwendet, um mit Insulinpumpen und CGMs zu kommunizieren.";
 
 /* Privacy - Bluetooth Peripheral Usage Description */
-"NSBluetoothPeripheralUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+"NSBluetoothPeripheralUsageDescription" = "Bluetooth wird verwendet, um mit Insulinpumpen und CGMs zu kommunizieren.";
 
 /* Privacy - Face ID Usage Description */
-"NSFaceIDUsageDescription" = "For authorized acces to bolus";
+"NSFaceIDUsageDescription" = "Identitätsverifizierung für Bolus - damit nur autorisierte Personen einen Bolus abrufen können.";
 
 /* Privacy - Calendars Usage Description */
-"NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events.";
+"NSCalendarsUsageDescription" = "BZ Werte als Kalendartermin: Jeder neue CGM-Blutzuckerwert wird als momentaner Kalendartermin gespeichert, damit er auf der Apple Watch in real-time aufgefrischt wird.";
+
+/* Privacy - Health Update Usage Description */
+"NSHealthUpdateUsageDescription" = "Die Health App wird zur Speicherung von Blutzuckerdaten verwendet";
+
+/* Privacy - Health Share Usage Description */
+"NSHealthShareUsageDescription" = "Die Health App wird zur Speicherung von Blutzuckerdaten verwendet";

+ 6 - 0
FreeAPS/Resources/es.lproj/InfoPlist.strings

@@ -12,3 +12,9 @@
 
 /* Privacy - Calendars Usage Description */
 "NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events.";
+
+/* Privacy - Health Update Usage Description */
+"NSHealthUpdateUsageDescription" = "Health App is used to store blood glucose data";
+
+/* Privacy - Health Share Usage Description */
+"NSHealthShareUsageDescription" = "Health App is used to store blood glucose data";

+ 6 - 0
FreeAPS/Resources/fi.lproj/InfoPlist.strings

@@ -12,3 +12,9 @@
 
 /* Privacy - Calendars Usage Description */
 "NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events.";
+
+/* Privacy - Health Update Usage Description */
+"NSHealthUpdateUsageDescription" = "Health App is used to store blood glucose data";
+
+/* Privacy - Health Share Usage Description */
+"NSHealthShareUsageDescription" = "Health App is used to store blood glucose data";

+ 6 - 0
FreeAPS/Resources/fr.lproj/InfoPlist.strings

@@ -12,3 +12,9 @@
 
 /* Privacy - Calendars Usage Description */
 "NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events.";
+
+/* Privacy - Health Update Usage Description */
+"NSHealthUpdateUsageDescription" = "Health App is used to store blood glucose data";
+
+/* Privacy - Health Share Usage Description */
+"NSHealthShareUsageDescription" = "Health App is used to store blood glucose data";

+ 6 - 0
FreeAPS/Resources/he.lproj/InfoPlist.strings

@@ -12,3 +12,9 @@
 
 /* Privacy - Calendars Usage Description */
 "NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events.";
+
+/* Privacy - Health Update Usage Description */
+"NSHealthUpdateUsageDescription" = "Health App is used to store blood glucose data";
+
+/* Privacy - Health Share Usage Description */
+"NSHealthShareUsageDescription" = "Health App is used to store blood glucose data";

+ 7 - 1
FreeAPS/Resources/it.lproj/InfoPlist.strings

@@ -1,5 +1,5 @@
 /* Privacy - NFC Scan Usage Description */
-"NFCReaderUsageDescription" = "NFC is used to scan Libre sensors.";
+"NFCReaderUsageDescription" = "NFC è usato per scansionare i sensori di Libre.";
 
 /* Privacy - Bluetooth Always Usage Description */
 "NSBluetoothAlwaysUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
@@ -12,3 +12,9 @@
 
 /* Privacy - Calendars Usage Description */
 "NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events.";
+
+/* Privacy - Health Update Usage Description */
+"NSHealthUpdateUsageDescription" = "Health App is used to store blood glucose data";
+
+/* Privacy - Health Share Usage Description */
+"NSHealthShareUsageDescription" = "Health App is used to store blood glucose data";

+ 2 - 1
FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json

@@ -17,5 +17,6 @@
     "addSourceInfoToGlucoseNotifications": false,
     "lowGlucose": 72,
     "highGlucose": 270,
-    "carbsRequiredThreshold": 10
+    "carbsRequiredThreshold": 10,
+    "useAppleHealth": false
 }

+ 6 - 0
FreeAPS/Resources/nb.lproj/InfoPlist.strings

@@ -12,3 +12,9 @@
 
 /* Privacy - Calendars Usage Description */
 "NSCalendarsUsageDescription" = "Kalender brukes til å opprette nye blodsukker-oppføringer.";
+
+/* Privacy - Health Update Usage Description */
+"NSHealthUpdateUsageDescription" = "Helseappen brukes til å lagre blodsukkerdata";
+
+/* Privacy - Health Share Usage Description */
+"NSHealthShareUsageDescription" = "Helseappen brukes til å lagre blodsukkerdata";

+ 6 - 0
FreeAPS/Resources/nl.lproj/InfoPlist.strings

@@ -12,3 +12,9 @@
 
 /* Privacy - Calendars Usage Description */
 "NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events.";
+
+/* Privacy - Health Update Usage Description */
+"NSHealthUpdateUsageDescription" = "Health App is used to store blood glucose data";
+
+/* Privacy - Health Share Usage Description */
+"NSHealthShareUsageDescription" = "Health App is used to store blood glucose data";

+ 6 - 0
FreeAPS/Resources/pl.lproj/InfoPlist.strings

@@ -12,3 +12,9 @@
 
 /* Privacy - Calendars Usage Description */
 "NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events.";
+
+/* Privacy - Health Update Usage Description */
+"NSHealthUpdateUsageDescription" = "Health App is used to store blood glucose data";
+
+/* Privacy - Health Share Usage Description */
+"NSHealthShareUsageDescription" = "Health App is used to store blood glucose data";

+ 6 - 0
FreeAPS/Resources/pt-BR.lproj/InfoPlist.strings

@@ -12,3 +12,9 @@
 
 /* Privacy - Calendars Usage Description */
 "NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events.";
+
+/* Privacy - Health Update Usage Description */
+"NSHealthUpdateUsageDescription" = "Health App is used to store blood glucose data";
+
+/* Privacy - Health Share Usage Description */
+"NSHealthShareUsageDescription" = "Health App is used to store blood glucose data";

+ 6 - 0
FreeAPS/Resources/ru.lproj/InfoPlist.strings

@@ -12,3 +12,9 @@
 
 /* Privacy - Calendars Usage Description */
 "NSCalendarsUsageDescription" = "Календарь используется для создания новых событий о глюкозе.";
+
+/* Privacy - Health Update Usage Description */
+"NSHealthUpdateUsageDescription" = "Приложение Здоровье используется для хранения данных о глюкозе в крови";
+
+/* Privacy - Health Share Usage Description */
+"NSHealthShareUsageDescription" = "Приложение Здоровье используется для хранения данных о глюкозе в крови";

+ 20 - 0
FreeAPS/Resources/sk.lproj/InfoPlist.strings

@@ -0,0 +1,20 @@
+/* Privacy - NFC Scan Usage Description */
+"NFCReaderUsageDescription" = "NFC is used to scan Libre sensors.";
+
+/* Privacy - Bluetooth Always Usage Description */
+"NSBluetoothAlwaysUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+
+/* Privacy - Bluetooth Peripheral Usage Description */
+"NSBluetoothPeripheralUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+
+/* Privacy - Face ID Usage Description */
+"NSFaceIDUsageDescription" = "For authorized acces to bolus";
+
+/* Privacy - Calendars Usage Description */
+"NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events.";
+
+/* Privacy - Health Update Usage Description */
+"NSHealthUpdateUsageDescription" = "Health App is used to store blood glucose data";
+
+/* Privacy - Health Share Usage Description */
+"NSHealthShareUsageDescription" = "Health App is used to store blood glucose data";

+ 6 - 0
FreeAPS/Resources/sv.lproj/InfoPlist.strings

@@ -12,3 +12,9 @@
 
 /* Privacy - Calendars Usage Description */
 "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 etc.";
+
+/* Privacy - Health Share Usage Description */
+"NSHealthShareUsageDescription" = "Appen Hälsa används för att lagra blodsockervärden etc.";

+ 6 - 0
FreeAPS/Resources/tr.lproj/InfoPlist.strings

@@ -12,3 +12,9 @@
 
 /* Privacy - Calendars Usage Description */
 "NSCalendarsUsageDescription" = "Takvim, yeni bir glikoz olayı oluşturmak için kullanılır.";
+
+/* Privacy - Health Update Usage Description */
+"NSHealthUpdateUsageDescription" = "Health Uygulaması, KŞ verilerini depolamak için kullanılır";
+
+/* Privacy - Health Share Usage Description */
+"NSHealthShareUsageDescription" = "Health Uygulaması, KŞ verilerini depolamak için kullanılır";

+ 6 - 0
FreeAPS/Resources/uk.lproj/InfoPlist.strings

@@ -12,3 +12,9 @@
 
 /* Privacy - Calendars Usage Description */
 "NSCalendarsUsageDescription" = "Для створення нових подій глюкози використовується календар.";
+
+/* Privacy - Health Update Usage Description */
+"NSHealthUpdateUsageDescription" = "Health App is used to store blood glucose data";
+
+/* Privacy - Health Share Usage Description */
+"NSHealthShareUsageDescription" = "Health App is used to store blood glucose data";

+ 6 - 0
FreeAPS/Resources/zh-Hans.lproj/InfoPlist.strings

@@ -12,3 +12,9 @@
 
 /* Privacy - Calendars Usage Description */
 "NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events.";
+
+/* Privacy - Health Update Usage Description */
+"NSHealthUpdateUsageDescription" = "Health App is used to store blood glucose data";
+
+/* Privacy - Health Share Usage Description */
+"NSHealthShareUsageDescription" = "Health App is used to store blood glucose data";

+ 1 - 1
FreeAPS/Sources/APS/APSManager.swift

@@ -288,7 +288,7 @@ final class BaseAPSManager: APSManager, Injectable {
     func roundBolus(amount: Decimal) -> Decimal {
         guard let pump = pumpManager else { return amount }
         let rounded = Decimal(pump.roundToSupportedBolusVolume(units: Double(amount)))
-        let maxBolus = Decimal(pump.roundToSupportedBolusVolume(units: Double(settingsManager.pumpSettings.maxBolus)))
+        let maxBolus = Decimal(pump.roundToSupportedBolusVolume(units: Double(settingsManager.pumpSettings.maxBolus))) 
         return min(rounded, maxBolus)
     }
 

+ 5 - 1
FreeAPS/Sources/APS/CGM/CGMType.swift

@@ -10,6 +10,7 @@ enum CGMType: String, JSON, CaseIterable, Identifiable {
     case simulator
     case libreTransmitter
     case glucoseDirect
+    case enlite
 
     var displayName: String {
         switch self {
@@ -27,12 +28,15 @@ enum CGMType: String, JSON, CaseIterable, Identifiable {
             return NSLocalizedString("Glucose Simulator", comment: "Glucose Simulator CGM type")
         case .libreTransmitter:
             return NSLocalizedString("Libre Transmitter", comment: "Libre Transmitter type")
+        case .enlite:
+            return "Medtronic Enlite"
         }
     }
 
     var appURL: URL? {
         switch self {
-        case .nightscout:
+        case .enlite,
+             .nightscout:
             return nil
         case .xdrip:
             return URL(string: "xdripswift://")!

+ 6 - 4
FreeAPS/Sources/APS/DeviceDataManager.swift

@@ -1,3 +1,4 @@
+import Algorithms
 import Combine
 import Foundation
 import LoopKit
@@ -9,7 +10,7 @@ import SwiftDate
 import Swinject
 import UserNotifications
 
-protocol DeviceDataManager {
+protocol DeviceDataManager: GlucoseSource {
     var pumpManager: PumpManagerUI? { get set }
     var pumpDisplayState: CurrentValueSubject<PumpDisplayState?, Never> { get }
     var recommendsLoop: PassthroughSubject<Void, Never> { get }
@@ -165,17 +166,18 @@ final class BaseDeviceDataManager: DeviceDataManager, Injectable {
             return Just([]).eraseToAnyPublisher()
         }
 
-        medtronic.cgmManagerDelegate = self
-
-        guard lastFetchGlucoseDate.addingTimeInterval(4.5 * 60) < Date() else {
+        guard lastFetchGlucoseDate.addingTimeInterval(5.minutes.timeInterval) < Date() else {
             return Just([]).eraseToAnyPublisher()
         }
 
+        medtronic.cgmManagerDelegate = self
+
         return Future<[BloodGlucose], Error> { promise in
             self.processQueue.async {
                 medtronic.fetchNewDataIfNeeded { result in
                     switch result {
                     case .noData:
+                        debug(.deviceManager, "Minilink glucose is empty")
                         promise(.success([]))
                     case let .newData(glucose):
                         let directions: [BloodGlucose.Direction?] = [nil]

+ 17 - 11
FreeAPS/Sources/APS/FetchGlucoseManager.swift

@@ -13,6 +13,7 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
     @Injected() var settingsManager: SettingsManager!
     @Injected() var libreTransmitter: LibreTransmitterSource!
     @Injected() var healthKitManager: HealthKitManager!
+    @Injected() var deviceDataManager: DeviceDataManager!
 
     private var lifetime = Lifetime()
     private let timer = DispatchTimer(timeInterval: 1.minutes.timeInterval)
@@ -44,6 +45,8 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
             glucoseSource = libreTransmitter
         case .glucoseDirect:
             glucoseSource = appGroupSource
+        case .enlite:
+            glucoseSource = deviceDataManager
         }
 
         if settingsManager.settings.cgm != .libreTransmitter {
@@ -67,19 +70,22 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
                 .eraseToAnyPublisher()
             }
             .sink { date, syncDate, glucose, glucoseFromHealth in
+                let allGlucose = glucose + glucoseFromHealth
+                guard allGlucose.isNotEmpty else { return }
                 // Because of Spike dosn't respect a date query
-                let filteredByDate = (glucose + glucoseFromHealth).filter { $0.dateString > syncDate }
+                let filteredByDate = allGlucose.filter { $0.dateString > syncDate }
                 let filtered = self.glucoseStorage.filterTooFrequentGlucose(filteredByDate, at: syncDate)
-                if filtered.isNotEmpty {
-                    debug(.nightscout, "New glucose found")
-                    self.glucoseStorage.storeGlucose(filtered)
-                    self.apsManager.heartbeat(date: date, force: false)
-                    self.nightscoutManager.uploadGlucose()
-                    let glucoseForHealth = filteredByDate.filter { !glucoseFromHealth.contains($0) }
-                    if glucoseForHealth.isNotEmpty {
-                        self.healthKitManager.save(bloodGlucoses: glucoseForHealth, completion: nil)
-                    }
-                }
+
+                guard filtered.isNotEmpty else { return }
+                debug(.nightscout, "New glucose found")
+
+                self.glucoseStorage.storeGlucose(filtered)
+                self.apsManager.heartbeat(date: date, force: false)
+                self.nightscoutManager.uploadGlucose()
+                let glucoseForHealth = filteredByDate.filter { !glucoseFromHealth.contains($0) }
+
+                guard glucoseForHealth.isNotEmpty else { return }
+                self.healthKitManager.save(bloodGlucoses: glucoseForHealth, completion: nil)
             }
             .store(in: &lifetime)
         timer.fire()

+ 5 - 22
FreeAPS/Sources/APS/Storage/GlucoseStorage.swift

@@ -4,8 +4,7 @@ import Swinject
 
 protocol GlucoseStorage {
     func storeGlucose(_ glucose: [BloodGlucose])
-    func removeGlucose(byID id: String)
-    func removeGlucose(byIDCollection ids: [String])
+    func removeGlucose(ids: [String])
     func recent() -> [BloodGlucose]
     func syncDate() -> Date
     func filterTooFrequentGlucose(_ glucose: [BloodGlucose], at: Date) -> [BloodGlucose]
@@ -50,29 +49,13 @@ final class BaseGlucoseStorage: GlucoseStorage, Injectable {
         }
     }
 
-    func removeGlucose(byIDCollection ids: [String]) {
+    func removeGlucose(ids: [String]) {
         processQueue.sync {
             let file = OpenAPS.Monitor.glucose
             self.storage.transaction { storage in
-                let BGInStorage = storage.retrieve(file, as: [BloodGlucose].self)
-                let filteredBG = BGInStorage?.filter { !ids.contains($0.id) } ?? []
-                storage.save(filteredBG, as: file)
-
-                DispatchQueue.main.async {
-                    self.broadcaster.notify(GlucoseObserver.self, on: .main) {
-                        $0.glucoseDidUpdate(filteredBG.reversed())
-                    }
-                }
-            }
-        }
-    }
-
-    func removeGlucose(byID id: String) {
-        processQueue.sync {
-            let file = OpenAPS.Monitor.glucose
-            self.storage.transaction { storage in
-                let BGInStorage = storage.retrieve(file, as: [BloodGlucose].self)
-                let filteredBG = BGInStorage?.filter { $0.id != id } ?? []
+                let bgInStorage = storage.retrieve(file, as: [BloodGlucose].self)
+                let filteredBG = bgInStorage?.filter { !ids.contains($0.id) } ?? []
+                guard bgInStorage != filteredBG else { return }
                 storage.save(filteredBG, as: file)
 
                 DispatchQueue.main.async {

Разлика између датотеке није приказан због своје велике величине
+ 72 - 9
FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings


Разлика између датотеке није приказан због своје велике величине
+ 55 - 11
FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings


Разлика између датотеке није приказан због своје велике величине
+ 55 - 11
FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings


Разлика између датотеке није приказан због своје велике величине
+ 133 - 89
FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings


Разлика између датотеке није приказан због своје велике величине
+ 33 - 11
FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings


+ 55 - 11
FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings

@@ -2,8 +2,8 @@
   Localizable.strings
   FreeAPS X
 */
+/* -------------------------------- */
 /* Bolus screen when adding insulin */
-
 "Add insulin without actually bolusing" = "Añadir insulinar sin administrar bolo";
 
 /* Add insulin from source outside of pump */
@@ -67,6 +67,9 @@
 /* Add carbs screen */
 "Add Carbs" = "Añadir Carbohidratos";
 
+/* Add carbs header and button in Watch app. You can skip the last " " space. It's just for differentiation */
+"Add Carbs " = "Add Carbs ";
+
 /*  */
 "Amount Carbs" = "Cantidad de Carbohidratos";
 
@@ -326,6 +329,9 @@ Enact a temp Basal or a temp target */
 /* grams */
 " g" = " g";
 
+/* The short unit display string for grams */
+"g" = "g";
+
 /* when 0 U/hr */
 "0 U/hr" = "0 U/hora";
 
@@ -395,10 +401,19 @@ Enact a temp Basal or a temp target */
 /* Other CGM setting */
 "Other" = "Otros";
 
+/* Whatch app alert */
+"Set temp targets presets on iPhone first" = "Set temp targets presets on iPhone first";
 
-/* Calendar and Libre transmitter settings --------------*/
-/* */
+/* Updating Watch app */
+"Updating..." = "Updating...";
 
+/* Header for Temp targets in Watch app */
+"Temp Targets" = "Temp Targets";
+
+
+/* Calendar and Libre transmitter settings ---------------
+ */
+/* */
 "Configure Libre Transmitter" = "Configure Libre Transmitter";
 
 /* */
@@ -468,9 +483,6 @@ Enact a temp Basal or a temp target */
 "Remove All" = "Remove All";
 
 /* */
-"Calibrations" = "Calibrations";
-
-/* */
 "About the Process" = "About the Process";
 
 /* */
@@ -655,6 +667,7 @@ Enact a temp Basal or a temp target */
 
 /* */
 "Delete CGM" = "Delete CGM";
+
 /* */
 "Are you sure you want to remove this cgm from loop?" = "Are you sure you want to remove this cgm from loop?";
 
@@ -841,10 +854,11 @@ Enact a temp Basal or a temp target */
 /* */
 "Backfill glucose" = "Backfill glucose";
 
-
-/* Headers for settings ------------------- */
+/* About this source */
+"About this source" = "About this source";
 
 
+/* Headers for settings ----------------------- */
 "OpenAPS main settings" = "OpenAPS main settings";
 
 "OpenAPS SMB settings" = "OpenAPS SMB settings";
@@ -853,15 +867,45 @@ Enact a temp Basal or a temp target */
 
 "OpenAPS other settings" = "OpenAPS other settings";
 
-
 /* Glucose Simulator CGM */
 "Glucose Simulator" = "Glucose Simulator";
 
 /* Restored state message */
 "Bluetooth State restored (APS restarted?). Found %d peripherals, and connected to %@ with identifier %@" = "Bluetooth State restored (APS restarted?). Found %d peripherals, and connected to %@ with identifier %@";
 
+/* Shared app group */
+"Shared app group" = "Shared app group";
+
+/* Native G6 app */
+"Native G6 app" = "Native G6 app";
+
+/* Native G5 app */
+"Native G5 app" = "Native G5 app";
+
+/* Minilink transmitter */
+"Minilink transmitter" = "Minilink transmitter";
+
+/* Simple simulator */
+"Simple simulator" = "Simple simulator";
+
+/* Direct connection with Libre 1 transmitters or Libre 2 */
+"Direct connection with Libre 1 transmitters or Libre 2" = "Direct connection with Libre 1 transmitters or Libre 2";
+
+/* Online or internal server */
+"Online or internal server" = "Online or internal server";
+
+/* HealthKit intergration --------------------*/
+/* */
+"Apple Health" = "Apple Health";
+
+/* */
+"Connect to Apple Health" = "Connect to Apple Health";
+
+/* Show when have not permissions for writing to Health */
+"For write data to Apple Health you must give permissions in Settings > Health > Data Access" = "For write data to Apple Health you must give permissions in Settings > Health > Data Access";
+/* --------------------------------------------
+
 
-/*
   Infotexts from openaps.docs and androidaps.docs
   FreeAPS X
 */
@@ -976,7 +1020,7 @@ Un 1.0 de valor permite un ajuste completo con el nuevo factor de sensibilidad d
 "Smallest possible bolus amount" = "Cantidad de bolo más pequeña posible";
 
 /* "Insulin Peak Time" */
-"Time of maximum blood glucose lowering effect of insulin, in minutes. Beware: Oref assumes for ultra-papid (Lyumjev) & rapid-acting (Fiasp) curves minimal (35 & 50 min) and maximal (100 & 120 min) applicable insulinPeakTimes. Using a custom insulinPeakTime outside these bounds will result in issues with FreeAPS-X, longer loop calculations and possible red loops." = "Tiempo del máximo efecto de disminución de glucosa de la insulina, en minutos";
+"Time of maximum blood glucose lowering effect of insulin, in minutes. Beware: Oref assumes for ultra-rapid (Lyumjev) & rapid-acting (Fiasp) curves minimal (35 & 50 min) and maximal (100 & 120 min) applicable insulinPeakTimes. Using a custom insulinPeakTime outside these bounds will result in issues with FreeAPS-X, longer loop calculations and possible red loops." = "Tiempo del máximo efecto de disminución de glucosa de la insulina, en minutos";
 
 /* "Carbs Req Threshold" */
 "Grams of carbsReq to trigger a pushover. Defaults to 1 (for 1 gram of carbohydrate). Can be increased if you only want to get Pushover for carbsReq at X threshold." = "Gramos de carbsReq para activar un Pushover. Por defecto es 1 (para 1 gramo de hidratos de carbono). Se puede aumentar si sólo quiere obtener Pushovers con carbsReq en X umbral.";

Разлика између датотеке није приказан због своје велике величине
+ 55 - 11
FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings


Разлика између датотеке није приказан због своје велике величине
+ 55 - 11
FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings


Разлика између датотеке није приказан због своје велике величине
+ 55 - 11
FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings


Разлика између датотеке није приказан због своје велике величине
+ 109 - 65
FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings


Разлика између датотеке није приказан због своје велике величине
+ 78 - 34
FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings


Разлика између датотеке није приказан због своје велике величине
+ 55 - 11
FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings


Разлика између датотеке није приказан због своје велике величине
+ 55 - 11
FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings


Разлика између датотеке није приказан због своје велике величине
+ 55 - 11
FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings


Разлика између датотеке није приказан због своје велике величине
+ 592 - 141
FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings


Разлика између датотеке није приказан због своје велике величине
+ 56 - 12
FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings


Разлика између датотеке није приказан због своје велике величине
+ 40 - 11
FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings


Разлика између датотеке није приказан због своје велике величине
+ 39 - 14
FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings


Разлика између датотеке није приказан због своје велике величине
+ 83 - 39
FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings


Разлика између датотеке није приказан због своје велике величине
+ 55 - 11
FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings


+ 55 - 11
FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings

@@ -2,8 +2,8 @@
   Localizable.strings
   FreeAPS X
 */
+/* -------------------------------- */
 /* Bolus screen when adding insulin */
-
 "Add insulin without actually bolusing" = "仅添加胰岛素 没有实际注射";
 
 /* Add insulin from source outside of pump */
@@ -67,6 +67,9 @@
 /* Add carbs screen */
 "Add Carbs" = "添加碳水化合物";
 
+/* Add carbs header and button in Watch app. You can skip the last " " space. It's just for differentiation */
+"Add Carbs " = "Add Carbs ";
+
 /*  */
 "Amount Carbs" = "碳水化合物含量";
 
@@ -326,6 +329,9 @@ Enact a temp Basal or a temp target */
 /* grams */
 " g" = " 克";
 
+/* The short unit display string for grams */
+"g" = "g";
+
 /* when 0 U/hr */
 "0 U/hr" = "0 U/小时";
 
@@ -395,10 +401,19 @@ Enact a temp Basal or a temp target */
 /* Other CGM setting */
 "Other" = "Other";
 
+/* Whatch app alert */
+"Set temp targets presets on iPhone first" = "Set temp targets presets on iPhone first";
 
-/* Calendar and Libre transmitter settings --------------*/
-/* */
+/* Updating Watch app */
+"Updating..." = "Updating...";
 
+/* Header for Temp targets in Watch app */
+"Temp Targets" = "Temp Targets";
+
+
+/* Calendar and Libre transmitter settings ---------------
+ */
+/* */
 "Configure Libre Transmitter" = "Configure Libre Transmitter";
 
 /* */
@@ -468,9 +483,6 @@ Enact a temp Basal or a temp target */
 "Remove All" = "Remove All";
 
 /* */
-"Calibrations" = "Calibrations";
-
-/* */
 "About the Process" = "About the Process";
 
 /* */
@@ -655,6 +667,7 @@ Enact a temp Basal or a temp target */
 
 /* */
 "Delete CGM" = "Delete CGM";
+
 /* */
 "Are you sure you want to remove this cgm from loop?" = "Are you sure you want to remove this cgm from loop?";
 
@@ -841,10 +854,11 @@ Enact a temp Basal or a temp target */
 /* */
 "Backfill glucose" = "Backfill glucose";
 
-
-/* Headers for settings ------------------- */
+/* About this source */
+"About this source" = "About this source";
 
 
+/* Headers for settings ----------------------- */
 "OpenAPS main settings" = "OpenAPS main settings";
 
 "OpenAPS SMB settings" = "OpenAPS SMB settings";
@@ -853,15 +867,45 @@ Enact a temp Basal or a temp target */
 
 "OpenAPS other settings" = "OpenAPS other settings";
 
-
 /* Glucose Simulator CGM */
 "Glucose Simulator" = "Glucose Simulator";
 
 /* Restored state message */
 "Bluetooth State restored (APS restarted?). Found %d peripherals, and connected to %@ with identifier %@" = "Bluetooth State restored (APS restarted?). Found %d peripherals, and connected to %@ with identifier %@";
 
+/* Shared app group */
+"Shared app group" = "Shared app group";
+
+/* Native G6 app */
+"Native G6 app" = "Native G6 app";
+
+/* Native G5 app */
+"Native G5 app" = "Native G5 app";
+
+/* Minilink transmitter */
+"Minilink transmitter" = "Minilink transmitter";
+
+/* Simple simulator */
+"Simple simulator" = "Simple simulator";
+
+/* Direct connection with Libre 1 transmitters or Libre 2 */
+"Direct connection with Libre 1 transmitters or Libre 2" = "Direct connection with Libre 1 transmitters or Libre 2";
+
+/* Online or internal server */
+"Online or internal server" = "Online or internal server";
+
+/* HealthKit intergration --------------------*/
+/* */
+"Apple Health" = "Apple Health";
+
+/* */
+"Connect to Apple Health" = "Connect to Apple Health";
+
+/* Show when have not permissions for writing to Health */
+"For write data to Apple Health you must give permissions in Settings > Health > Data Access" = "For write data to Apple Health you must give permissions in Settings > Health > Data Access";
+/* --------------------------------------------
+
 
-/*
   Infotexts from openaps.docs and androidaps.docs
   FreeAPS X
 */
@@ -972,7 +1016,7 @@ Enact a temp Basal or a temp target */
 "Smallest possible bolus amount" = "可能的最小大剂量输注";
 
 /* "Insulin Peak Time" */
-"Time of maximum blood glucose lowering effect of insulin, in minutes. Beware: Oref assumes for ultra-papid (Lyumjev) & rapid-acting (Fiasp) curves minimal (35 & 50 min) and maximal (100 & 120 min) applicable insulinPeakTimes. Using a custom insulinPeakTime outside these bounds will result in issues with FreeAPS-X, longer loop calculations and possible red loops." = "胰岛素的最大降血糖作用,以分钟为单位";
+"Time of maximum blood glucose lowering effect of insulin, in minutes. Beware: Oref assumes for ultra-rapid (Lyumjev) & rapid-acting (Fiasp) curves minimal (35 & 50 min) and maximal (100 & 120 min) applicable insulinPeakTimes. Using a custom insulinPeakTime outside these bounds will result in issues with FreeAPS-X, longer loop calculations and possible red loops." = "胰岛素的最大降血糖作用,以分钟为单位";
 
 /* "Carbs Req Threshold" */
 "Grams of carbsReq to trigger a pushover. Defaults to 1 (for 1 gram of carbohydrate). Can be increased if you only want to get Pushover for carbsReq at X threshold." = "触发Pushover的碳水化合物的克数。默认为1(对于1克碳水化合物)。如果你只想在X阈值时得到碳水化合物需求的Pushover通知,可以增加。";

+ 0 - 10
FreeAPS/Sources/Models/FreeAPSSettings.swift

@@ -14,10 +14,7 @@ struct FreeAPSSettings: JSON, Equatable {
     var cgm: CGMType = .nightscout
     var uploadGlucose: Bool = false
     var useCalendar: Bool = false
-    // Apple Health Integration
     var useAppleHealth: Bool = false
-    var needShowInformationTextForSetPermissions: Bool = false
-    // ---
     var glucoseBadge: Bool = false
     var glucoseNotificationsAlways: Bool = false
     var useAlarmSound: Bool = false
@@ -89,13 +86,6 @@ extension FreeAPSSettings: Decodable {
             settings.useAppleHealth = useAppleHealth
         }
 
-        if let needShowInformationTextForSetPermissions = try? container.decode(
-            Bool.self,
-            forKey: .needShowInformationTextForSetPermissions
-        ) {
-            settings.needShowInformationTextForSetPermissions = needShowInformationTextForSetPermissions
-        }
-
         if let glucoseBadge = try? container.decode(Bool.self, forKey: .glucoseBadge) {
             settings.glucoseBadge = glucoseBadge
         }

+ 10 - 2
FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift

@@ -10,8 +10,16 @@ extension CGM {
             Form {
                 Section {
                     Picker("Type", selection: $state.cgm) {
-                        ForEach(CGMType.allCases) {
-                            Text($0.displayName).tag($0)
+                        ForEach(CGMType.allCases) { type in
+                            VStack(alignment: .leading) {
+                                Text(type.displayName)
+                                Text(type.subtitle).font(.caption).foregroundColor(.secondary)
+                            }.tag(type)
+                        }
+                    }
+                    if let link = state.cgm.externalLink {
+                        Button("About this source") {
+                            UIApplication.shared.open(link, options: [:], completionHandler: nil)
                         }
                     }
                 }

+ 18 - 22
FreeAPS/Sources/Modules/HealthKit/HealthKitStateModel.swift

@@ -10,35 +10,31 @@ extension AppleHealthKit {
 
         override func subscribe() {
             useAppleHealth = settingsManager.settings.useAppleHealth
-            needShowInformationTextForSetPermissions = settingsManager.settings.needShowInformationTextForSetPermissions
 
-            subscribeSetting(\.needShowInformationTextForSetPermissions, on: $needShowInformationTextForSetPermissions) { _ in }
+            needShowInformationTextForSetPermissions = healthKitManager.areAllowAllPermissions
 
-            $useAppleHealth
-                .removeDuplicates()
-                .sink { [weak self] value in
-                    guard let self = self else { return }
-                    guard value else {
-                        self.settingsManager.settings.useAppleHealth = false
-                        self.needShowInformationTextForSetPermissions = false
+            subscribeSetting(\.useAppleHealth, on: $useAppleHealth) {
+                useAppleHealth = $0
+            } didSet: { [weak self] value in
+                guard let self = self else { return }
+
+                guard value else {
+                    self.needShowInformationTextForSetPermissions = false
+                    return
+                }
+
+                self.healthKitManager.requestPermission { _, error in
+                    guard error == nil else {
                         return
                     }
 
-                    self.healthKitManager.requestPermission { status, error in
-                        guard error == nil else {
-                            return
-                        }
-                        self.settingsManager.settings.useAppleHealth = status
-                        self.healthKitManager.enableBackgroundDelivery()
-                        self.healthKitManager.createObserver()
-                        DispatchQueue.main.async {
-                            if !self.healthKitManager.areAllowAllPermissions {
-                                self.needShowInformationTextForSetPermissions = true
-                            }
-                        }
+                    self.healthKitManager.enableBackgroundDelivery()
+                    self.healthKitManager.createObserver()
+                    DispatchQueue.main.async {
+                        self.needShowInformationTextForSetPermissions = !self.healthKitManager.areAllowAllPermissions
                     }
                 }
-                .store(in: &lifetime)
+            }
         }
     }
 }

+ 1 - 5
FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift

@@ -380,7 +380,6 @@ extension MainChartView {
         calculateBolusDots(fullSize: fullSize)
         calculateCarbsDots(fullSize: fullSize)
         calculateTempTargetsRects(fullSize: fullSize)
-        calculateTempTargetsRects(fullSize: fullSize)
         calculateBasalPoints(fullSize: fullSize)
         calculateSuspensions(fullSize: fullSize)
     }
@@ -800,10 +799,7 @@ extension MainChartView {
     }
 
     private func timeToXCoordinate(_ time: TimeInterval, fullSize: CGSize) -> CGFloat {
-        let xOffset = -(
-            glucose.first?.dateString.timeIntervalSince1970 ?? Date()
-                .addingTimeInterval(-1.days.timeInterval).timeIntervalSince1970
-        )
+        let xOffset = -Date().addingTimeInterval(-1.days.timeInterval).timeIntervalSince1970
         let stepXFraction = fullGlucoseWidth(viewWidth: fullSize.width) / CGFloat(hours.hours.timeInterval)
         let x = CGFloat(time + xOffset) * stepXFraction
         return x

+ 1 - 1
FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift

@@ -279,7 +279,7 @@ extension PreferencesEditor {
                     displayName: "Insulin Peak Time",
                     type: .decimal(keypath: \.insulinPeakTime),
                     infoText: NSLocalizedString(
-                        "Time of maximum blood glucose lowering effect of insulin, in minutes. Beware: Oref assumes for ultra-papid (Lyumjev) & rapid-acting (Fiasp) curves minimal (35 & 50 min) and maximal (100 & 120 min) applicable insulinPeakTimes. Using a custom insulinPeakTime outside these bounds will result in issues with FreeAPS-X, longer loop calculations and possible red loops.",
+                        "Time of maximum blood glucose lowering effect of insulin, in minutes. Beware: Oref assumes for ultra-rapid (Lyumjev) & rapid-acting (Fiasp) curves minimal (35 & 50 min) and maximal (100 & 120 min) applicable insulinPeakTimes. Using a custom insulinPeakTime outside these bounds will result in issues with FreeAPS-X, longer loop calculations and possible red loops.",
                         comment: "Insulin Peak Time"
                     ),
                     settable: self

+ 25 - 21
FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift

@@ -1,8 +1,9 @@
+import Combine
 import Foundation
 import HealthKit
 import Swinject
 
-protocol HealthKitManager {
+protocol HealthKitManager: GlucoseSource {
     /// Check availability HealthKit on current device and user's permissions
     var isAvailableOnCurrentDevice: Bool { get }
     /// Check all needed permissions
@@ -24,6 +25,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable {
     @Injected() private var fileStorage: FileStorage!
     @Injected() private var glucoseStorage: GlucoseStorage!
     @Injected() private var healthKitStore: HKHealthStore!
+    @Injected() private var settingsManager: SettingsManager!
 
     private enum Config {
         // unwraped HKObjects
@@ -42,6 +44,8 @@ final class BaseHealthKitManager: HealthKitManager, Injectable {
         static let frequencyBackgroundDeliveryBloodGlucoseFromHealth = HKUpdateFrequency(rawValue: 10)!
     }
 
+    private var newGlucose: [BloodGlucose] = []
+
     var isAvailableOnCurrentDevice: Bool {
         HKHealthStore.isHealthDataAvailable()
     }
@@ -131,6 +135,8 @@ final class BaseHealthKitManager: HealthKitManager, Injectable {
     }
 
     func createObserver() {
+        guard settingsManager.settings.useAppleHealth else { return }
+
         guard let bgType = Config.healthBGObject else {
             warning(
                 .service,
@@ -168,6 +174,8 @@ final class BaseHealthKitManager: HealthKitManager, Injectable {
     }
 
     func enableBackgroundDelivery() {
+        guard settingsManager.settings.useAppleHealth else { return }
+
         guard let bgType = Config.healthBGObject else {
             warning(
                 .service,
@@ -202,13 +210,8 @@ final class BaseHealthKitManager: HealthKitManager, Injectable {
             }
 
             DispatchQueue.global(qos: .utility).async {
-                var removingBGID = [String]()
-                samples.forEach {
-                    if let idString = $0.metadata?["HKMetadataKeySyncIdentifier"] as? String {
-                        removingBGID.append(idString)
-                    } else {
-                        removingBGID.append($0.uuid.uuidString)
-                    }
+                let removingBGID = samples.map {
+                    $0.metadata?["HKMetadataKeySyncIdentifier"] as? String ?? $0.uuid.uuidString
                 }
                 glucoseStorage.removeGlucose(ids: removingBGID)
                 newGlucose = newGlucose.filter { !removingBGID.contains($0.id) }
@@ -225,29 +228,29 @@ final class BaseHealthKitManager: HealthKitManager, Injectable {
             sortDescriptors: nil
         ) { [unowned self] _, results, _ in
 
-            guard let samples = results as? [HKQuantitySample] else {
+            guard let samples = results as? [HKQuantitySample], samples.isNotEmpty else {
                 return
             }
 
             let oldSamples: [HealthKitSample] = fileStorage
                 .retrieve(OpenAPS.HealthKit.downloadedGlucose, as: [HealthKitSample].self) ?? []
 
-            var newSamples = [HealthKitSample]()
-            for sample in samples {
-                if sample.wasUserEntered {
-                    newSamples.append(HealthKitSample(
+            let newSamples = samples
+                .compactMap { sample -> HealthKitSample? in
+                    let fromFAX = sample.metadata?["fromFreeAPSX"] as? Bool ?? false
+                    guard !fromFAX else { return nil }
+                    return HealthKitSample(
                         healthKitId: sample.uuid.uuidString,
                         date: sample.startDate,
                         glucose: Int(round(sample.quantity.doubleValue(for: .milligramsPerDeciliter)))
-                    ))
+                    )
                 }
-            }
-
-            newSamples = newSamples
                 .filter { !oldSamples.contains($0) }
 
-            newSamples.forEach({ sample in
-                let glucose = BloodGlucose(
+            guard newSamples.isNotEmpty else { return }
+
+            let newGlucose = newSamples.map { sample in
+                BloodGlucose(
                     _id: sample.healthKitId,
                     sgv: sample.glucose,
                     direction: nil,
@@ -259,8 +262,9 @@ final class BaseHealthKitManager: HealthKitManager, Injectable {
                     glucose: sample.glucose,
                     type: "sgv"
                 )
-                glucoseStorage.storeGlucose([glucose])
-            })
+            }
+
+            self.newGlucose = newGlucose
 
             let savingSamples = (newSamples + oldSamples)
                 .removeDublicates()

+ 1 - 1
FreeAPS/Sources/Services/UserNotifiactions/UserNotificationsManager.swift

@@ -240,7 +240,7 @@ final class BaseUserNotificationsManager: NSObject, UserNotificationsManager, In
                     "\n"
                         + String(
                             format: NSLocalizedString("Transmitter: %@%%", comment: "Transmitter: %@%%"),
-                            transmitterBattery
+                            "\(transmitterBattery)"
                         )
                 )
             }

+ 20 - 1
FreeAPS/Sources/Services/WatchManager/WatchManager.swift

@@ -51,7 +51,8 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable {
             self.state.trend = glucoseValues.trend
             self.state.delta = glucoseValues.delta
             self.state.glucoseDate = self.glucoseStorage.recent().last?.dateString
-            self.state.lastLoopDate = self.enactedSuggestion?.deliverAt
+            self.state.lastLoopDate = self.enactedSuggestion?.recieved == true ? self.enactedSuggestion?.deliverAt : self
+                .apsManager.lastLoopDate
             self.state.bolusIncrement = self.settingsManager.preferences.bolusIncrement
             self.state.maxCOB = self.settingsManager.preferences.maxCOB
             self.state.maxBolus = self.settingsManager.pumpSettings.maxBolus
@@ -78,6 +79,7 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable {
                     )
                 }
             self.state.bolusAfterCarbs = !self.settingsManager.settings.skipBolusScreenAfterCarbs
+            self.state.eventualBG = self.evetualBGStraing()
 
             self.sendState()
         }
@@ -138,6 +140,16 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable {
         return description
     }
 
+    private func evetualBGStraing() -> String? {
+        guard let eventualBG = suggestion?.eventualBG else {
+            return nil
+        }
+        let units = settingsManager.settings.units
+        return "⇢ " + eventualFormatter.string(
+            from: (units == .mmolL ? eventualBG.asMmolL : Decimal(eventualBG)) as NSNumber
+        )!
+    }
+
     private var glucoseFormatter: NumberFormatter {
         let formatter = NumberFormatter()
         formatter.numberStyle = .decimal
@@ -150,6 +162,13 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable {
         return formatter
     }
 
+    private var eventualFormatter: NumberFormatter {
+        let formatter = NumberFormatter()
+        formatter.numberStyle = .decimal
+        formatter.maximumFractionDigits = 2
+        return formatter
+    }
+
     private var deltaFormatter: NumberFormatter {
         let formatter = NumberFormatter()
         formatter.numberStyle = .decimal

+ 1 - 0
FreeAPSWatch WatchKit Extension/ComplicationController.swift

@@ -11,6 +11,7 @@ class ComplicationController: NSObject, CLKComplicationDataSource {
                 displayName: "FreeAPS X",
                 supportedFamilies: [
                     .graphicCorner,
+                    .graphicCircular,
                     .modularSmall,
                     .utilitarianSmall,
                     .circularSmall

+ 1 - 0
FreeAPSWatch WatchKit Extension/DataFlow.swift

@@ -15,6 +15,7 @@ struct WatchState: Codable {
     var cob: Decimal?
     var tempTargets: [TempTargetWatchPreset] = []
     var bolusAfterCarbs: Bool?
+    var eventualBG: String?
 }
 
 struct TempTargetWatchPreset: Codable, Identifiable {

+ 23 - 6
FreeAPSWatch WatchKit Extension/Views/MainView.swift

@@ -64,6 +64,8 @@ struct MainView: View {
                     HStack {
                         Text(state.glucose).font(.largeTitle)
                         Text(state.trend)
+                            .scaledToFill()
+                            .minimumScaleFactor(0.5)
                     }
                     Text(state.delta).font(.caption2).foregroundColor(.gray)
                 }
@@ -101,7 +103,7 @@ struct MainView: View {
     }
 
     var buttons: some View {
-        HStack {
+        HStack(alignment: .center) {
             NavigationLink(isActive: $state.isCarbsViewActive) {
                 CarbsView()
                     .environmentObject(state)
@@ -135,7 +137,9 @@ struct MainView: View {
                         .frame(width: 24, height: 24)
                         .foregroundColor(.loopYellow)
                     if let until = state.tempTargets.compactMap(\.until).first, until > Date() {
-                        Text(until, style: .timer).font(.system(size: 8))
+                        Text(until, style: .timer)
+                            .scaledToFill()
+                            .font(.system(size: 8))
                     }
                 }
             }
@@ -217,9 +221,22 @@ struct MainView: View {
 
 struct ContentView_Previews: PreviewProvider {
     static var previews: some View {
-        Group {
-            MainView().environmentObject(WatchStateModel())
-            MainView().previewDevice("Apple Watch Series 5 - 40mm").environmentObject(WatchStateModel())
-        }
+        let state = WatchStateModel()
+
+        state.glucose = "15,8"
+        state.delta = "+888"
+        state.iob = 100.38
+        state.cob = 112.123
+        state.eventualBG = "⇢ 8,888"
+        state.lastLoopDate = Date().addingTimeInterval(-200)
+        state
+            .tempTargets =
+            [TempTargetWatchPreset(name: "Test", id: "test", description: "", until: Date().addingTimeInterval(3600 * 3))]
+
+        return Group {
+            MainView()
+            MainView().previewDevice("Apple Watch Series 5 - 40mm")
+            MainView().previewDevice("Apple Watch Series 3 - 38mm")
+        }.environmentObject(state)
     }
 }

+ 1 - 0
crowdin.yml

@@ -18,6 +18,7 @@ export_languages:
   - zh-CN
   - pt-PT
   - pt-BR
+  - sk
 files:
   - source: /FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings
     translation: /FreeAPS/Sources/Localizations/Main/%osx_locale%.lproj/Localizable.strings