ソースを参照

Merge branch 'Crowdin_2' into XPM

Jon B.M 4 年 前
コミット
fe4de2a46b
67 ファイル変更3449 行追加193 行削除
  1. 98 0
      Dependencies/rileylink_ios/MinimedKit/tr.lproj/Localizable.strings
  2. 209 0
      Dependencies/rileylink_ios/MinimedKitUI/tr.lproj/Localizable.strings
  3. 69 0
      Dependencies/rileylink_ios/MinimedKitUI/tr.lproj/MinimedPumpManager.strings
  4. 178 0
      Dependencies/rileylink_ios/OmniKit/tr.lproj/Localizable.strings
  5. 178 0
      Dependencies/rileylink_ios/OmniKitPacketParser/tr.lproj/Localizable.strings
  6. 66 66
      Dependencies/rileylink_ios/OmniKitUI/tr.lproj/Localizable.strings
  7. 63 0
      Dependencies/rileylink_ios/OmniKitUI/tr.lproj/OmnipodPumpManager.strings
  8. 19 1
      Dependencies/rileylink_ios/RileyLink.xcodeproj/project.pbxproj
  9. 51 0
      Dependencies/rileylink_ios/RileyLink/tr.lproj/Localizable.strings
  10. 30 0
      Dependencies/rileylink_ios/RileyLinkBLEKit/tr.lproj/Localizable.strings
  11. 25 25
      Dependencies/rileylink_ios/RileyLinkKitUI/tr.lproj/Localizable.strings
  12. 64 2
      FreeAPS.xcodeproj/project.pbxproj
  13. 2 2
      FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved
  14. 15 0
      FreeAPS/Resources/Base.lproj/InfoPlist.strings
  15. 4 0
      FreeAPS/Resources/Info.plist
  16. 12 0
      FreeAPS/Resources/ar.lproj/infoPlist.strings
  17. 13 0
      FreeAPS/Resources/ca.lproj/InfoPlist.strings
  18. 12 0
      FreeAPS/Resources/da.lproj/infoPlist.strings
  19. 12 0
      FreeAPS/Resources/de.lproj/infoPlist.strings
  20. 16 0
      FreeAPS/Resources/en.lproj/infoPlist.strings
  21. 12 0
      FreeAPS/Resources/es.lproj/infoPlist.strings
  22. 12 0
      FreeAPS/Resources/fi.lproj/infoPlist.strings
  23. 12 0
      FreeAPS/Resources/fr.lproj/infoPlist.strings
  24. 12 0
      FreeAPS/Resources/he.lproj/infoPlist.strings
  25. 13 0
      FreeAPS/Resources/it.lproj/InfoPlist.strings
  26. 2 1
      FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json
  27. 12 0
      FreeAPS/Resources/nb.lproj/infoPlist.strings
  28. 12 0
      FreeAPS/Resources/nl.lproj/infoPlist.strings
  29. 12 0
      FreeAPS/Resources/pl.lproj/infoPlist.strings
  30. 12 0
      FreeAPS/Resources/pt-BR.lproj/infoPlist.strings
  31. 12 0
      FreeAPS/Resources/pt-PT.lproj/infoPlist.strings
  32. 13 0
      FreeAPS/Resources/pt.lproj/InfoPlist.strings
  33. 12 0
      FreeAPS/Resources/ru.lproj/infoPlist.strings
  34. 13 0
      FreeAPS/Resources/sv.lproj/InfoPlist.strings
  35. 12 0
      FreeAPS/Resources/tr.lproj/infoPlist.strings
  36. 12 0
      FreeAPS/Resources/uk.lproj/infoPlist.strings
  37. 13 0
      FreeAPS/Resources/zh-Hans.lproj/InfoPlist.strings
  38. 1 1
      FreeAPS/Sources/APS/CGM/CGMType.swift
  39. 1 0
      FreeAPS/Sources/Assemblies/ServiceAssembly.swift
  40. 91 1
      FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings
  41. 91 1
      FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings
  42. 91 1
      FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings
  43. 91 1
      FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings
  44. 91 1
      FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings
  45. 91 1
      FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings
  46. 91 1
      FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings
  47. 91 1
      FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings
  48. 91 1
      FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings
  49. 91 1
      FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings
  50. 91 1
      FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings
  51. 91 1
      FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings
  52. 91 1
      FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings
  53. 91 1
      FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings
  54. 91 1
      FreeAPS/Sources/Localizations/Main/pt.lproj/Localizable.strings
  55. 91 1
      FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings
  56. 92 2
      FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings
  57. 160 70
      FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings
  58. 91 1
      FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings
  59. 91 1
      FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings
  60. 1 0
      FreeAPS/Sources/Models/FreeAPSSettings.swift
  61. 41 0
      FreeAPS/Sources/Modules/CGM/CGMStateModel.swift
  62. 11 0
      FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift
  63. 3 3
      FreeAPS/Sources/Modules/CREditor/CREditorStateModel.swift
  64. 2 0
      FreeAPS/Sources/Modules/Home/HomeStateModel.swift
  65. 2 2
      FreeAPS/Sources/Modules/ISFEditor/ISFEditorStateModel.swift
  66. 161 0
      FreeAPS/Sources/Services/Calendar/CalendarManager.swift
  67. 2 0
      crowdin.yml

+ 98 - 0
Dependencies/rileylink_ios/MinimedKit/tr.lproj/Localizable.strings

@@ -0,0 +1,98 @@
+/* Communications error for a bolus currently running */
+"A bolus is already in progress" = "A bolus is already in progress";
+
+/* The description of AlarmClockReminderPumpEvent */
+"AlarmClockReminder" = "AlarmClockReminder";
+
+/* The description of AlarmSensorPumpEvent */
+"AlarmSensor" = "AlarmSensor";
+
+/* Describing the battery chemistry as Alkaline */
+"Alkaline" = "Alkaline";
+
+/* The format string description of a BasalProfileStartPumpEvent. (1: The index of the profile)(2: The basal rate) */
+"Basal Profile %1$@: %2$@ U/hour" = "Basal Profile %1$@: %2$@ U/hour";
+
+/* Pump error code when bolus is in progress */
+"Bolus in progress" = "Bolus in progress";
+
+/* Suggestions for diagnosing a command refused pump error */
+"Check that the pump is not suspended or priming, or has a percent temp basal type" = "Check that the pump is not suspended or priming, or has a percent temp basal type";
+
+/* Pump error code returned when command refused */
+"Command refused" = "Command refused";
+
+/* No comment provided by engineer. */
+"Comms with another pump detected" = "Comms with another pump detected.";
+
+/* Error description */
+"Decoding Error" = "Decoding Error";
+
+/* Error description */
+"Device Error" = "Device Error";
+
+/* Describing the pump history insulin data source */
+"Event History" = "Event History";
+
+/* Format string for failure reason. (1: The operation being performed) (2: The response data) */
+"Invalid response during %1$@: %2$@" = "Invalid response during %1$@: %2$@";
+
+/* Describing the battery chemistry as Lithium */
+"Lithium" = "Lithium";
+
+/* Recovery suggestion */
+"Make sure your RileyLink is nearby and powered on" = "Make sure your RileyLink is nearby and powered on";
+
+/* Pump error code describing max setting exceeded */
+"Max setting exceeded" = "Max setting exceeded";
+
+/* Pump title (1: model number) */
+"Minimed %@" = "Minimed %@";
+
+/* Generic title of the minimed pump manager */
+"Minimed 500/700 Series" = "Minimed 500/700 Series";
+
+/* Describing the North America pump region */
+"North America" = "North America";
+
+/* No comment provided by engineer. */
+"Pump did not respond" = "Pump did not respond";
+
+/* Error description */
+"Pump Error" = "Pump Error";
+
+/* No comment provided by engineer. */
+"Pump is suspended" = "Pump is suspended";
+
+/* No comment provided by engineer. */
+"Pump responded unexpectedly" = "Pump responded unexpectedly";
+
+/* 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$@)" = "PumpMessage(%1$@, %2$@, %3$@, %4$@)";
+
+/* Describing the reservoir insulin data source */
+"Reservoir" = "Reservoir";
+
+/* Error description */
+"RileyLink radio tune failed" = "RileyLink radio tune failed";
+
+/* The format string description of a TempBasalPumpEvent. (1: The rate of the temp basal in minutes) */
+"Temporary Basal: %1$.3f U/hour" = "Temporary Basal: %1$.3f U/hour";
+
+/* The format string description of a TempBasalDurationPumpEvent. (1: The duration of the temp basal in minutes) */
+"Temporary Basal: %1$d min" = "Temporary Basal: %1$d min";
+
+/* The format string description of a TempBasalPumpEvent. (1: The rate of the temp basal in percent) */
+"Temporary Basal: %1$d%%" = "Temporary Basal: %1$d%%";
+
+/* The format string description of an unknown pump error code. (1: The specific error code raw value) */
+"Unknown pump error code: %1$@" = "Unknown pump error code: %1$@";
+
+/* No comment provided by engineer. */
+"Unknown pump model: %@" = "Unknown pump model: %@";
+
+/* Format string for an unknown response. (1: The operation being performed) (2: The response data) */
+"Unknown response during %1$@: %2$@" = "Unknown response during %1$@: %2$@";
+
+/* Describing the worldwide pump region */
+"World-Wide" = "World-Wide";

ファイルの差分が大きいため隠しています
+ 209 - 0
Dependencies/rileylink_ios/MinimedKitUI/tr.lproj/Localizable.strings


+ 69 - 0
Dependencies/rileylink_ios/MinimedKitUI/tr.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 = "UITableViewController"; title = "Pump Clock"; ObjectID = "Fps-h3-V4K"; */
+"Fps-h3-V4K.title" = "Pump Clock";
+
+/* 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 = "UITableViewController"; title = "Setup Complete"; ObjectID = "Nwf-TJ-KmJ"; */
+"Nwf-TJ-KmJ.title" = "Setup Complete";
+
+/* Class = "UITableViewController"; title = "Pump Setup"; ObjectID = "OZk-Db-KCs"; */
+"OZk-Db-KCs.title" = "Pump Setup";
+
+/* Class = "UINavigationItem"; title = "Pump Setup"; ObjectID = "V47-Nq-7ew"; */
+"V47-Nq-7ew.title" = "Pump Setup";
+
+/* Class = "UITableViewSection"; headerTitle = "Main Menu"; ObjectID = "ZnF-zy-5gR"; */
+"ZnF-zy-5gR.headerTitle" = "Main 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 = "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 = "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 = "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 = "UILabel"; text = "Enter the pump region"; ObjectID = "tGa-FP-JqD"; */
+"tGa-FP-JqD.text" = "Enter the pump region";
+
+/* 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:";

+ 178 - 0
Dependencies/rileylink_ios/OmniKit/tr.lproj/Localizable.strings

@@ -0,0 +1,178 @@
+/* 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" = "Temp basal in progress";
+
+/* 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$@";
+
+/* String describing a dose that was possibly scheduled */
+"Uncertain" = "Uncertain";
+
+/* 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";

+ 178 - 0
Dependencies/rileylink_ios/OmniKitPacketParser/tr.lproj/Localizable.strings

@@ -0,0 +1,178 @@
+/* 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" = "Temp basal in progress";
+
+/* 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$@";
+
+/* String describing a dose that was possibly scheduled */
+"Uncertain" = "Uncertain";
+
+/* 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";

+ 66 - 66
Dependencies/rileylink_ios/OmniKitUI/tr.lproj/Localizable.strings

@@ -9,28 +9,28 @@
 
 /* Format string for delivered insulin. (1: The localized amount)
    Format string for insulin remaining in reservoir. (1: The localized amount) */
-"%@ U" = "%@ U";
+"%@ U" = "%@ Ü";
 
 /* Format string for bolus progress when finished. (1: The localized amount) */
-"%@ U (Finished)" = "%@ U (Finished)";
+"%@ U (Finished)" = "%@ Ü (Tamamlandı)";
 
 /* Format string for bolus progress. (1: The delivered amount) (2: The programmed amount) (3: the percent progress) */
 "%@ U of %@ U (%@)" = "%1$@ U of %2$@ U (%3$@)";
 
 /* Format string for temp basal rate. (1: The localized amount) */
-"%@ U/hour" = "%@ U/hour";
+"%@ U/hour" = "%@ Ü/Sa";
 
 /* 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" = "%@+ U";
+"%@+ U" = "%@+ Ü";
 
 /* Appends a full-stop to a statement */
 "%@." = "%@.";
 
 /* Format string for reservoir volume. (1: The localized volume) */
-"%@U" = "%@U";
+"%@U" = "%@Ü";
 
 /* The title of the cell showing the pod activated at time */
 "Active Time" = "Active Time";
@@ -39,59 +39,59 @@
 "Pod Active Clock" = "Pod Active Clock";
 
 /* The title of the cell showing alarm status */
-"Alarms" = "Alarms";
+"Alarms" = "Alarmlar";
 
 /* Confirmation message for shutting down a pod */
-"Are you sure you want to shutdown this pod?" = "Are you sure you want to shutdown this pod?";
+"Are you sure you want to shutdown this pod?" = "Bu pod'u iptal etmek istediğinizden emin misiniz?";
 
 /* Confirmation message for removing Omnipod PumpManager */
 "Are you sure you want to stop using Omnipod?" = "Are you sure you want to stop using Omnipod?";
 
 /* The title text for the address assigned to the pod */
-"Assigned Address" = "Assigned Address";
+"Assigned Address" = "Adress Atandı";
 
 /* The title of the cell showing pod basal status */
-"Basal Delivery" = "Basal Delivery";
+"Basal Delivery" = "Bazal İletimi";
 
 /* The title text for the basal rate schedule */
-"Basal Rates" = "Basal Rates";
+"Basal Rates" = "Bazal Oranları";
 
 /* The title of the cell showing pod bolus status */
-"Bolus Delivery" = "Bolus Delivery";
+"Bolus Delivery" = "Bolus İletimi";
 
 /* The title of the cancel action in an action sheet */
-"Cancel" = "Cancel";
+"Cancel" = "Vazgeç";
 
 /* The title of the command to change pump time zone */
-"Change Time Zone" = "Change Time Zone";
+"Change Time Zone" = "Zaman dilimini Değiştir";
 
 /* Progress message for changing pod time. */
-"Changing time…" = "Changing time…";
+"Changing time…" = "Zaman değiştir…";
 
 /* The title of the configuration section in settings */
-"Configuration" = "Configuration";
+"Configuration" = "Yapılandırma";
 
 /* The title of the Insulin Type */
-"Insulin Type" = "Insulin Type";
+"Insulin Type" = "İnsülin Tipi";
 
 /* The title of the continue action in an action sheet */
-"Continue" = "Continue";
+"Continue" = "Devam et";
 
 /* Button title to deactivate pod because of fault during setup */
-"Deactivate" = "Deactivate";
+"Deactivate" = "Devredışı bırak";
 
 /* Button title for pod deactivation
    Button title to deactivate pod */
-"Deactivate Pod" = "Deactivate Pod";
+"Deactivate Pod" = "Pod'u devredışı bırak";
 
 /* Button title to delete Omnipod PumpManager */
-"Delete Omnipod" = "Delete Omnipod";
+"Delete Omnipod" = "Omnipod'u Sill";
 
 /* Title text for delivery limits */
-"Delivery Limits" = "Delivery Limits";
+"Delivery Limits" = "İletim Kısıtlamaları";
 
 /* The title of the device information section in settings */
-"Device Information" = "Device Information";
+"Device Information" = "Cihaz Bilgileri";
 
 /* Title text for button to disable bolus beeps */
 "Disable Bolus Beeps" = "Disable Bolus Beeps";
@@ -118,25 +118,25 @@
 "Disable Automatic Bolus Beeps" = "Disable Automatic Bolus Beeps";
 
 /* The alert title for a resume error */
-"Error Resuming" = "Error Resuming";
+"Error Resuming" = "Devam ederken hata oluştu";
 
 /* The alert title for a suspend error */
-"Error Suspending" = "Error Suspending";
+"Error Suspending" = "İptal Ederken Hata Oluştu";
 
 /* The title of the cell showing the pod expiration reminder date */
-"Expiration Reminder" = "Expiration Reminder";
+"Expiration Reminder" = "Süre Sonu Hatırlatıcısı";
 
 /* The title of the cell showing the pod expiration after expiry */
-"Expired" = "Expired";
+"Expired" = "Süresi doldu";
 
 /* The title of the cell showing the pod expiration */
-"Expires" = "Expires";
+"Expires" = "Bitiyor";
 
 /* Pod life HUD view label */
-"Fault" = "Fault";
+"Fault" = "Hata";
 
 /* The title of the command to finish pod setup */
-"Finish pod setup" = "Finish pod setup";
+"Finish pod setup" = "Pod kurulumu bitir";
 
 /* Accessibility format string for (1: localized volume)(2: time) */
 "Greater than %1$@ units remaining at %2$@" = "Greater than %1$@ units remaining at %2$@";
@@ -148,114 +148,114 @@
 "Incompletely set up pod must be deactivated before pairing with a new one. Please deactivate and remove pod." = "Incompletely set up pod must be deactivated before pairing with a new one. Please deactivate and remove pod.";
 
 /* Button title to insert cannula during setup */
-"Insert Cannula" = "Insert Cannula";
+"Insert Cannula" = "Kanül Yerleştir";
 
 /* The title of the cell showing delivered insulin */
-"Insulin Delivered" = "Insulin Delivered";
+"Insulin Delivered" = "İnsülin Gönderildi";
 
 /* The error message shown when Loop's basal schedule has an unsupported rate */
-"Invalid entry" = "Invalid entry";
+"Invalid entry" = "Geçersiz girdi";
 
 /* The title of the cell showing the pod lot id */
-"Lot" = "Lot";
+"Lot" = "Parti";
 
 /* The detail text for bolus delivery when no bolus is being delivered */
-"None" = "None";
+"None" = "Hiçbiri";
 
 /* Button title to pair with pod during setup */
-"Pair" = "Pair";
+"Pair" = "Eşleştir";
 
 /* The title of the command to pair new pod */
-"Pair New Pod" = "Pair New Pod";
+"Pair New Pod" = "Yeni Pod Eşle";
 
 /* The text of the loading label when pairing */
-"Pairing…" = "Pairing…";
+"Pairing…" = "Eşlestiriliyor…";
 
 /* The title of the cell showing the pod pi version */
-"PI Version" = "PI Version";
+"PI Version" = "PI Sürümü";
 
 /* The title of the command to play test beeps */
-"Play Test Beeps" = "Play Test Beeps";
+"Play Test Beeps" = "Test Bip Sesi Çal";
 
 /* Progress message for play test beeps. */
-"Play Test Beeps…" = "Play Test Beeps…";
+"Play Test Beeps…" = "Test Bip Sesi Çal…";
 
 /* The title of the cell showing the pod pm version */
-"PM Version" = "PM Version";
+"PM Version" = "PM Sürümü";
 
 /* Label describing pod age view */
-"Pod Age" = "Pod Age";
+"Pod Age" = "Pod Yaşı";
 
 /* Title of the pod settings view controller */
-"Pod Settings" = "Pod Settings";
+"Pod Settings" = "Pod Ayarları";
 
 /* The text of the loading label when pod is primed */
-"Primed" = "Primed";
+"Primed" = "Hazırlandı";
 
 /* The text of the loading label when priming */
-"Priming…" = "Priming…";
+"Priming…" = "Hazırlanıyor…";
 
 /* Label describing time remaining view */
-"Remaining" = "Remaining";
+"Remaining" = "Geri Kalan";
 
 /* Label indicating pod replacement necessary
    The title of the command to replace pod */
-"Replace Pod" = "Replace Pod";
+"Replace Pod" = "Pod'u değiştir";
 
 /* The title of the command to replace pod when there is a pod fault */
-"Replace Pod Now" = "Replace Pod Now";
+"Replace Pod Now" = "Pod'u şimdi değiştir";
 
 /* The title of the cell showing reservoir status */
-"Reservoir" = "Reservoir";
+"Reservoir" = "Rezervuar";
 
 /* Button title for retrying pod deactivation */
-"Retry Pod Deactivation" = "Retry Pod Deactivation";
+"Retry Pod Deactivation" = "Pod Devre Dışı Bırakmayı Tekrar Dene";
 
 /* Title of button to save delivery limit settings
    Title of button to sync basal profile when no pod paired */
-"Save" = "Save";
+"Save" = "Kaydet";
 
 /* The detail text of the basal row when pod is running scheduled basal */
-"Schedule" = "Schedule";
+"Schedule" = "Planlama";
 
 /* The title of the status section in settings */
-"Status" = "Status";
+"Status" = "Durum";
 
 /* A message indicating a command succeeded */
-"Succeeded" = "Succeeded";
+"Succeeded" = "Başarılı oldu";
 
 /* The detail text of the basal row when pod is suspended */
-"Suspended" = "Suspended";
+"Suspended" = "İptal edildi";
 
 /* Title text for the button to delete Omnipod PumpManager */
-"Switch from Omnipod Pumps" = "Switch from Omnipod Pumps";
+"Switch from Omnipod Pumps" = "Omnipod'u kullanmayı bırak";
 
 /* Title of button to sync basal profile from pod */
-"Sync With Pod" = "Sync With Pod";
+"Sync With Pod" = "Pod'la eşitle";
 
 /* The title of the command to run the test command */
-"Test Command" = "Test Command";
+"Test Command" = "Komut dene";
 
 /* Progress message for testing commands. */
-"Testing Commands…" = "Testing Commands…";
+"Testing Commands…" = "Komutlar deneniyor…";
 
 /* The error message shown when Loop's basal schedule has more entries than the pod can support */
-"Too many entries" = "Too many entries";
+"Too many entries" = "Çok fazla sayıda giriş";
 
 /* 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.";
+"Unable to deactivate pod. Please continue and pair a new one." = "Pod devre dışı bırakılamıyor. Lütfen devam edin ve yeni bir tanesi ile eşleştirin.";
 
 /* The detail text for delivered insulin when no measurement is available */
-"Unknown" = "Unknown";
+"Unknown" = "Bilinmiyor";
 
 /* The title of the diagnostics section in settings */
-"Diagnostics" = "Diagnostics";
+"Diagnostics" = "Teşhis";
 
 /* The diagnostic command Read Pod Status */
-"Read Pod Status" = "Read Pod Status";
+"Read Pod Status" = "Pod Durumunu Oku";
 
 /* The diagnostic command Read Pulse Log */
-"Read Pulse Log" = "Read Pulse Log";
+"Read Pulse Log" = "Nabız Kaydını Oku";
 
 /* The title of the pod details section in settings */
-"Pod Details" = "Pod Details";
+"Pod Details" = "Pod Ayrıntıları";

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

@@ -0,0 +1,63 @@
+
+/* Class = "UITableViewSection"; headerTitle = "Remove POD"; ObjectID = "1LF-te-Bdd"; */
+"1LF-te-Bdd.headerTitle" = "Remove POD";
+
+/* Class = "UINavigationItem"; title = "RileyLink Setup"; ObjectID = "3HH-eJ-lRh"; */
+"3HH-eJ-lRh.title" = "RileyLink Setup";
+
+/* Class = "UITableViewController"; title = "Pump Setup"; ObjectID = "91O-Un-vKc"; */
+"91O-Un-vKc.title" = "Pump Setup";
+
+/* Class = "UITableViewSection"; footerTitle = "NOTE: Do not remove the pod's needle cap at this time."; ObjectID = "EUt-xk-Rmp"; */
+"EUt-xk-Rmp.footerTitle" = "NOTE: Do not remove the pod's needle cap at this time.";
+
+/* Class = "UITableViewSection"; headerTitle = "Prepare Pod"; ObjectID = "EUt-xk-Rmp"; */
+"EUt-xk-Rmp.headerTitle" = "Prepare Pod";
+
+/* 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 will remind you to change your pod before it expires. You can change this to a time convenient for you.";
+
+/* Class = "UILabel"; text = "Please deactivate the pod. When deactivation is complete, remove pod from body."; ObjectID = "GK7-jb-tyY"; */
+"GK7-jb-tyY.text" = "Please deactivate the pod. When deactivation is complete, remove pod from body.";
+
+/* Class = "UINavigationItem"; title = "Insert Cannula"; ObjectID = "HwT-30-f0y"; */
+"HwT-30-f0y.title" = "Insert Cannula";
+
+/* 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" = "Prepare site. Remove the pod's needle cap and adhesive backing. If pod is OK, apply to site.";
+
+/* Class = "UITableViewController"; title = "Pump Setup"; ObjectID = "aNg-mm-Uuy"; */
+"aNg-mm-Uuy.title" = "Pump Setup";
+
+/* Class = "UITableViewController"; title = "Pump Setup"; ObjectID = "ack-ra-XH6"; */
+"ack-ra-XH6.title" = "Pump Setup";
+
+/* Class = "UILabel"; text = "Your Pod is ready for use."; ObjectID = "bJ5-iH-fnF"; */
+"bJ5-iH-fnF.text" = "Your Pod is ready for use.";
+
+/* Class = "UILabel"; text = "Reminder"; ObjectID = "ePA-6p-q8C"; */
+"ePA-6p-q8C.text" = "Reminder";
+
+/* Class = "UINavigationItem"; title = "Pod Pairing"; ObjectID = "jVO-Ut-MhL"; */
+"jVO-Ut-MhL.title" = "Pod Pairing";
+
+/* Class = "UITableViewController"; title = "Pump Setup"; ObjectID = "k1Y-x4-m0a"; */
+"k1Y-x4-m0a.title" = "Pump Setup";
+
+/* Class = "UINavigationItem"; title = "Setup Complete"; ObjectID = "nDb-R5-e02"; */
+"nDb-R5-e02.title" = "Setup Complete";
+
+/* Class = "UITableViewSection"; footerTitle = "NOTE: If cannula sticks out, press cancel."; ObjectID = "rcC-ke-lUP"; */
+"rcC-ke-lUP.footerTitle" = "NOTE: If cannula sticks out, press cancel.";
+
+/* Class = "UITableViewSection"; headerTitle = "Apply POD"; ObjectID = "rcC-ke-lUP"; */
+"rcC-ke-lUP.headerTitle" = "Apply 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" = "Replace Pod";

+ 19 - 1
Dependencies/rileylink_ios/RileyLink.xcodeproj/project.pbxproj

@@ -881,7 +881,15 @@
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
-		198AA26127295EDC00FB87CE /* CommandResponseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommandResponseViewController.swift; 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>"; };
+		19E85E22273EA8F6000CCFAE /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = "<group>"; };
+		19E85E23273EA8F6000CCFAE /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = "<group>"; };
+		19E85E24273EA8F6000CCFAE /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = "<group>"; };
+		19E85E25273EA8F6000CCFAE /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = "<group>"; };
+		19E85E26273EA8F7000CCFAE /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = "<group>"; };
+		19E85E27273EA94B000CCFAE /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = "<group>"; };
 		2B19B9871DF3EF68006AB65F /* NewTimePumpEvent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewTimePumpEvent.swift; sourceTree = "<group>"; };
 		2F962EBE1E678BAA0070EFBD /* PumpOpsSynchronousTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = PumpOpsSynchronousTests.swift; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
 		2F962EC01E6872170070EFBD /* TimestampedHistoryEventTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TimestampedHistoryEventTests.swift; sourceTree = "<group>"; };
@@ -3204,6 +3212,7 @@
 				fi,
 				"pt-BR",
 				ro,
+				tr,
 			);
 			mainGroup = C12EA22E198B436800309FA4;
 			productRefGroup = C12EA238198B436800309FA4 /* Products */;
@@ -4346,6 +4355,7 @@
 				7D9BF02D2336A2FB005DCFD6 /* fi */,
 				7D9BF0352336A304005DCFD6 /* pt-BR */,
 				7D9BF14D23371407005DCFD6 /* ro */,
+				19E85E21273EA8F6000CCFAE /* tr */,
 			);
 			name = MinimedPumpManager.storyboard;
 			sourceTree = "<group>";
@@ -4370,6 +4380,7 @@
 				7D9BF0302336A2FB005DCFD6 /* fi */,
 				7D9BF0382336A304005DCFD6 /* pt-BR */,
 				7D9BF15123371408005DCFD6 /* ro */,
+				19E85E24273EA8F6000CCFAE /* tr */,
 			);
 			name = Localizable.strings;
 			sourceTree = "<group>";
@@ -4418,6 +4429,7 @@
 				7D9BF02F2336A2FB005DCFD6 /* fi */,
 				7D9BF0372336A304005DCFD6 /* pt-BR */,
 				7D9BF15023371408005DCFD6 /* ro */,
+				19E85E23273EA8F6000CCFAE /* tr */,
 			);
 			name = Localizable.strings;
 			sourceTree = "<group>";
@@ -4443,6 +4455,7 @@
 				7D9BF02E2336A2FB005DCFD6 /* fi */,
 				7D9BF0362336A304005DCFD6 /* pt-BR */,
 				7D9BF14F23371407005DCFD6 /* ro */,
+				19E85E22273EA8F6000CCFAE /* tr */,
 			);
 			name = Localizable.strings;
 			sourceTree = "<group>";
@@ -4467,6 +4480,7 @@
 				7D9BF0332336A2FB005DCFD6 /* fi */,
 				7D9BF03B2336A305005DCFD6 /* pt-BR */,
 				7D9BF15423371408005DCFD6 /* ro */,
+				19E85E25273EA8F6000CCFAE /* tr */,
 			);
 			name = Localizable.strings;
 			sourceTree = "<group>";
@@ -4491,6 +4505,7 @@
 				7D9BF0342336A2FB005DCFD6 /* fi */,
 				7D9BF03C2336A305005DCFD6 /* pt-BR */,
 				7D9BF15523371408005DCFD6 /* ro */,
+				19E85E27273EA94B000CCFAE /* tr */,
 			);
 			name = Localizable.strings;
 			sourceTree = "<group>";
@@ -4516,6 +4531,7 @@
 				7D9BF05D2336AE58005DCFD6 /* sv */,
 				7D9BF05F2336AE5A005DCFD6 /* vi */,
 				7D9BF14E23371407005DCFD6 /* ro */,
+				19E85E1F273EA8F2000CCFAE /* tr */,
 			);
 			name = OmnipodPumpManager.storyboard;
 			sourceTree = "<group>";
@@ -4540,6 +4556,7 @@
 				C1B9E0FE256AF076008E8B84 /* es */,
 				C1B9E0FF256AF078008E8B84 /* sv */,
 				C1B9E100256AF07B008E8B84 /* vi */,
+				19E85E26273EA8F7000CCFAE /* tr */,
 			);
 			name = Localizable.strings;
 			sourceTree = "<group>";
@@ -4564,6 +4581,7 @@
 				7D9BF0322336A2FB005DCFD6 /* fi */,
 				7D9BF03A2336A305005DCFD6 /* pt-BR */,
 				7D9BF15323371408005DCFD6 /* ro */,
+				19E85E20273EA8F4000CCFAE /* tr */,
 			);
 			name = Localizable.strings;
 			sourceTree = "<group>";

+ 51 - 0
Dependencies/rileylink_ios/RileyLink/tr.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/tr.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";
+

+ 25 - 25
Dependencies/rileylink_ios/RileyLinkKitUI/tr.lproj/Localizable.strings

@@ -1,71 +1,71 @@
 /* The title of the section describing commands */
-"Commands" = "Commands";
+"Commands" = "Komutlar";
 
 /* The connected state */
-"Connected" = "Connected";
+"Connected" = "Bağlanıldı";
 
 /* The in-progress connecting state */
-"Connecting" = "Connecting";
+"Connecting" = "Bağlanıyor";
 
 /* The title of the cell showing BLE connection state */
-"Connection State" = "Connection State";
+"Connection State" = "Bağlantı Durumu";
 
 /* The title of the section describing the device */
-"Device" = "Device";
+"Device" = "Cihaz";
 
 /* The title of the devices table section in RileyLink settings */
-"Devices" = "Devices";
+"Devices" = "Cihazlar";
 
 /* The disconnected state */
-"Disconnected" = "Disconnected";
+"Disconnected" = "Bağlantı kesildi";
 
 /* The in-progress disconnecting state */
-"Disconnecting" = "Disconnecting";
+"Disconnecting" = "Bağlantı kesiliyor";
 
 /* The title of the cell showing firmware version */
 "Firmware" = "Firmware";
 
 /* The title of the cell showing current rileylink frequency */
-"Frequency" = "Frequency";
+"Frequency" = "Frekans";
 
 /* The title of the cell showing device name */
-"Name" = "Name";
+"Name" = "Ad";
 
 /* 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.";
+"RileyLink allows for communication with the pump over Bluetooth Low Energy." = "RileyLink, Bluetooth Low Energy üzerinden pompa ile iletişime izin verir.";
 
 /* The title of the cell showing BLE signal strength (RSSI) */
-"Signal Strength" = "Signal Strength";
+"Signal Strength" = "Sinyal Gücü";
 
 /* The header of the cells showing connection monitoring */
-"Connection Monitoring" = "Connection Monitoring";
+"Connection Monitoring" = "Bağlantı İzleme";
 
 /* The title of the cell showing uptime */
 "Uptime" = "Uptime";
 
 /* The title of the cell showing battery level */
-"Battery level" = "Battery level";
+"Battery level" = "Pil seviyesi";
 
 /* The title of the cell showing Voltage */
-"Voltage" = "Voltage";
+"Voltage" = "Voltaj";
 
 /* "The title of the section for alerts" */
-"Alert" = "Alert";
+"Alert" = "Uyarı";
 
 /* The title of the cell showing Low Battery Alert */
-"Low Battery Alert" = "Low Battery Alert";
+"Low Battery Alert" = "Düşük Pil Uyarısı";
 
 /* Header of list showing battery level alert options */
-"Battery level Alert" = "Battery level Alert";
+"Battery level Alert" = "Pil seviyesi Uyarısı";
 
 /* Battery level alert OFF in list of options */
-"OFF" = "OFF";
+"OFF" = "KAPA";
 
 /* 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";
+"Get RileyLink Statistics" = "RileyLink İstatistiklerini Al";
 
 /* The title of the command to invert BLE connection LED logic */
 "Invert LED Logic" = "Invert LED Logic";
@@ -80,16 +80,16 @@
 "Lighten Red LED" = "Lighten Red LED";
 
 /* The title of the cell showing Test Vibration */
-"Test Vibration" = "Test Vibration";
+"Test Vibration" = "Titreşimi Dene";
 
 /* The title of the cell for sounding device finding piezo */
-"Find Device" = "Find Device";
+"Find Device" = "Cihazı Bul";
 
 /* The title of the cell for connection LED */
-"Connection LED" = "Connection LED";
+"Connection LED" = "Bağlantı LED'i";
 
 /* The title of the cell for connection vibration */
-"Connection Vibration" = "Connection Vibration";
+"Connection Vibration" = "Bağlanıldığında Titreş";
 
 /* Detail text when battery alert disabled. */
 "Off" = "Off";
@@ -101,4 +101,4 @@
 "Off" = "Off";
 
 /* Text indicating LED Mode is auto */
-"Auto" = "Auto";
+"Auto" = "Oto";

+ 64 - 2
FreeAPS.xcodeproj/project.pbxproj

@@ -11,6 +11,7 @@
 		0CEA2EA070AB041AF3E3745B /* BolusRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10A0C32B0DAB52726EF9B6D9 /* BolusRootView.swift */; };
 		0D9A5E34A899219C5C4CDFAF /* DataTableStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9455FA2D92E77A6C4AFED8A3 /* DataTableStateModel.swift */; };
 		17A9D0899046B45E87834820 /* CREditorProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C8D5F457B5AFF763F8CF3DF /* CREditorProvider.swift */; };
+		1927C8E62744606D00347C69 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1927C8E82744606D00347C69 /* InfoPlist.strings */; };
 		198377D2266BFFF6004DE65E /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 198377D4266BFFF6004DE65E /* Localizable.strings */; };
 		1BBB001DAD60F3B8CEA4B1C7 /* ISFEditorStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 505E09DC17A0C3D0AF4B66FE /* ISFEditorStateModel.swift */; };
 		1D845DF2E3324130E1D95E67 /* DataTableProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60744C3E9BB3652895C908CC /* DataTableProvider.swift */; };
@@ -80,6 +81,7 @@
 		385CEAC425F2F154002D6D5B /* AnnouncementsStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 385CEAC325F2F154002D6D5B /* AnnouncementsStorage.swift */; };
 		3862CC05273D152B00BF832C /* CalibrationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3862CC04273D152B00BF832C /* CalibrationService.swift */; };
 		3862CC1F273FDC9200BF832C /* CalibrationsChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3862CC1E273FDC9200BF832C /* CalibrationsChart.swift */; };
+		3862CC2E2743F9F700BF832C /* CalendarManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3862CC2D2743F9F700BF832C /* CalendarManager.swift */; };
 		386A124C271704DA00DDC61C /* CGMBLEKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 386A124B271704DA00DDC61C /* CGMBLEKit.framework */; };
 		386A124D271704DA00DDC61C /* CGMBLEKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 386A124B271704DA00DDC61C /* CGMBLEKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		386A124F271707F000DDC61C /* DexcomSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 386A124E271707F000DDC61C /* DexcomSource.swift */; };
@@ -296,6 +298,26 @@
 		10A0C32B0DAB52726EF9B6D9 /* BolusRootView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BolusRootView.swift; sourceTree = "<group>"; };
 		12204445D7632AF09264A979 /* PreferencesEditorDataFlow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PreferencesEditorDataFlow.swift; sourceTree = "<group>"; };
 		1918333A26ADA46800F45722 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Localizable.strings; sourceTree = "<group>"; };
+		1927C8E92744611700347C69 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		1927C8EA2744611800347C69 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		1927C8EB2744611900347C69 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
+		1927C8EC2744611A00347C69 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		1927C8ED2744611B00347C69 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		1927C8EE2744611C00347C69 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		1927C8EF2744611D00347C69 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		1927C8F02744611E00347C69 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		1927C8F12744611E00347C69 /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		1927C8F22744611F00347C69 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		1927C8F32744612000347C69 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		1927C8F42744612100347C69 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		1927C8F52744612100347C69 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
+		1927C8F62744612200347C69 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
+		1927C8F72744612300347C69 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		1927C8F82744612400347C69 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		1927C8F92744612400347C69 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		1927C8FA2744612500347C69 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		1927C8FB2744612600347C69 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		1927C8FE274489BA00347C69 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = "<group>"; };
 		198377D3266BFFF6004DE65E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
 		198377D5266C0A05004DE65E /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Localizable.strings; sourceTree = "<group>"; };
 		198377D6266C0A0A004DE65E /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/Localizable.strings; sourceTree = "<group>"; };
@@ -377,6 +399,7 @@
 		385CEAC325F2F154002D6D5B /* AnnouncementsStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnnouncementsStorage.swift; sourceTree = "<group>"; };
 		3862CC04273D152B00BF832C /* CalibrationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalibrationService.swift; sourceTree = "<group>"; };
 		3862CC1E273FDC9200BF832C /* CalibrationsChart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalibrationsChart.swift; sourceTree = "<group>"; };
+		3862CC2D2743F9F700BF832C /* CalendarManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarManager.swift; sourceTree = "<group>"; };
 		386A124B271704DA00DDC61C /* CGMBLEKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CGMBLEKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		386A124E271707F000DDC61C /* DexcomSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DexcomSource.swift; sourceTree = "<group>"; };
 		3870FF4225EC13F40088248F /* BloodGlucose.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BloodGlucose.swift; sourceTree = "<group>"; };
@@ -770,6 +793,7 @@
 		3811DE9125C9D88200A708ED /* Services */ = {
 			isa = PBXGroup;
 			children = (
+				3862CC2C2743F9DC00BF832C /* Calendar */,
 				38AEE75025F021F10013F05B /* SettingsManager */,
 				38B4F3C425E5016800E76A18 /* Notifications */,
 				3811DE9225C9D88200A708ED /* Appearance */,
@@ -845,6 +869,7 @@
 				388E596E25AD96040019842D /* javascript */,
 				3811DEC725C9DA7300A708ED /* FreeAPS.entitlements */,
 				388E596425AD948E0019842D /* Info.plist */,
+				1927C8E82744606D00347C69 /* InfoPlist.strings */,
 				388E595F25AD948E0019842D /* Assets.xcassets */,
 				38F3783A2613555C009DB701 /* Config.xcconfig */,
 			);
@@ -924,6 +949,14 @@
 			path = Calibrations;
 			sourceTree = "<group>";
 		};
+		3862CC2C2743F9DC00BF832C /* Calendar */ = {
+			isa = PBXGroup;
+			children = (
+				3862CC2D2743F9F700BF832C /* CalendarManager.swift */,
+			);
+			path = Calendar;
+			sourceTree = "<group>";
+		};
 		3883582E25EEAFC000E024B2 /* Views */ = {
 			isa = PBXGroup;
 			children = (
@@ -1594,6 +1627,7 @@
 				198377D2266BFFF6004DE65E /* Localizable.strings in Resources */,
 				388E597225AD9CF10019842D /* json in Resources */,
 				388E596F25AD96040019842D /* javascript in Resources */,
+				1927C8E62744606D00347C69 /* InfoPlist.strings in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -1642,6 +1676,7 @@
 				38FCF3FD25E997A80078B0D1 /* PumpHistoryStorage.swift in Sources */,
 				38D0B3B625EBE24900CB6E88 /* Battery.swift in Sources */,
 				38C4D33725E9A1A300D30B77 /* DispatchQueue+Extensions.swift in Sources */,
+				3862CC2E2743F9F700BF832C /* CalendarManager.swift in Sources */,
 				38B4F3C325E2A20B00E76A18 /* PumpSetupView.swift in Sources */,
 				382C134B25F14E3700715CE1 /* BGTargets.swift in Sources */,
 				38AEE75725F0F18E0013F05B /* CarbsStorage.swift in Sources */,
@@ -1856,6 +1891,33 @@
 /* End PBXTargetDependency section */
 
 /* Begin PBXVariantGroup section */
+		1927C8E82744606D00347C69 /* InfoPlist.strings */ = {
+			isa = PBXVariantGroup;
+			children = (
+				1927C8E92744611700347C69 /* ar */,
+				1927C8EA2744611800347C69 /* ca */,
+				1927C8EB2744611900347C69 /* zh-Hans */,
+				1927C8EC2744611A00347C69 /* da */,
+				1927C8ED2744611B00347C69 /* fi */,
+				1927C8EE2744611C00347C69 /* nl */,
+				1927C8EF2744611D00347C69 /* fr */,
+				1927C8F02744611E00347C69 /* de */,
+				1927C8F12744611E00347C69 /* he */,
+				1927C8F22744611F00347C69 /* it */,
+				1927C8F32744612000347C69 /* nb */,
+				1927C8F42744612100347C69 /* pl */,
+				1927C8F52744612100347C69 /* pt-BR */,
+				1927C8F62744612200347C69 /* pt-PT */,
+				1927C8F72744612300347C69 /* ru */,
+				1927C8F82744612400347C69 /* es */,
+				1927C8F92744612400347C69 /* sv */,
+				1927C8FA2744612500347C69 /* tr */,
+				1927C8FB2744612600347C69 /* uk */,
+				1927C8FE274489BA00347C69 /* Base */,
+			);
+			name = InfoPlist.strings;
+			sourceTree = "<group>";
+		};
 		198377D4266BFFF6004DE65E /* Localizable.strings */ = {
 			isa = PBXVariantGroup;
 			children = (
@@ -2011,7 +2073,7 @@
 		388E596825AD948E0019842D /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				APP_GROUP_ID = group.com.T7VZ6LU6H3.aps.JBMgroup;
+				APP_GROUP_ID = "group.com.${DEVELOPMENT_TEAM}.loopkit.LoopGroup";
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_ENTITLEMENTS = FreeAPS/Resources/FreeAPS.entitlements;
@@ -2037,7 +2099,7 @@
 		388E596925AD948E0019842D /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				APP_GROUP_ID = group.com.T7VZ6LU6H3.aps.JBMgroup;
+				APP_GROUP_ID = "group.com.${DEVELOPMENT_TEAM}.loopkit.LoopGroup";
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_ENTITLEMENTS = FreeAPS/Resources/FreeAPS.entitlements;

+ 2 - 2
FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved

@@ -24,8 +24,8 @@
         "repositoryURL": "https://github.com/ivalkou/LibreTransmitterX",
         "state": {
           "branch": null,
-          "revision": "97301803d0c9be325d5c31c0f0ecbc3c2c24a1da",
-          "version": "1.0.5"
+          "revision": "966c96777d801b4cd4b59bf293ed3c70160f006e",
+          "version": "1.0.6"
         }
       },
       {

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

@@ -0,0 +1,15 @@
+
+/* 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";
+
+"NSBluetoothPeripheralUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+
+/* Privacy - Calendars Usage Description */
+"NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events.";
+
+/* Privacy - Face ID Usage Description */
+"NSFaceIDUsageDescription" = "For authorized acces to bolus";
+

+ 4 - 0
FreeAPS/Resources/Info.plist

@@ -49,6 +49,8 @@
 	<true/>
 	<key>LSSupportsOpeningDocumentsInPlace</key>
 	<true/>
+	<key>NFCReaderUsageDescription</key>
+	<string>NFC is used to scan Libre sensors.</string>
 	<key>NSAppTransportSecurity</key>
 	<dict>
 		<key>NSAllowsArbitraryLoads</key>
@@ -69,6 +71,8 @@
 	<true/>
 	<key>NFCReaderUsageDescription</key>
 	<string>NFC is used to scan Libre sensors.</string>
+	<key>NSCalendarsUsageDescription</key>
+	<string>Calendar is used to create a new glucose events.</string>
 	<key>UIBackgroundModes</key>
 	<array>
 		<string>bluetooth-central</string>

+ 12 - 0
FreeAPS/Resources/ar.lproj/infoPlist.strings

@@ -0,0 +1,12 @@
+/* Privacy - Bluetooth Always Usage Description */
+"Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+
+/* Privacy - Face ID Usage Description */
+"For authorized acces to bolus" = "For authorized acces to bolus";
+
+/* Privacy - NFC Scan Usage Description */
+"NFC is used to scan Libre sensors." = "NFC is used to scan Libre sensors.";
+
+/* Privacy - Calendars Usage Description */
+"Calendar is used to create a new glucose events." = "Calendar is used to create a new glucose events.";
+

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

@@ -0,0 +1,13 @@
+/* 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";
+
+"NSBluetoothPeripheralUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+
+/* Privacy - Calendars Usage Description */
+"NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events.";
+
+/* Privacy - Face ID Usage Description */
+"NSFaceIDUsageDescription" = "For authorized acces to bolus";

+ 12 - 0
FreeAPS/Resources/da.lproj/infoPlist.strings

@@ -0,0 +1,12 @@
+/* Privacy - Bluetooth Always Usage Description */
+"Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+
+/* Privacy - Face ID Usage Description */
+"For authorized acces to bolus" = "For authorized acces to bolus";
+
+/* Privacy - NFC Scan Usage Description */
+"NFC is used to scan Libre sensors." = "NFC is used to scan Libre sensors.";
+
+/* Privacy - Calendars Usage Description */
+"Calendar is used to create a new glucose events." = "Calendar is used to create a new glucose events.";
+

+ 12 - 0
FreeAPS/Resources/de.lproj/infoPlist.strings

@@ -0,0 +1,12 @@
+/* Privacy - Bluetooth Always Usage Description */
+"Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+
+/* Privacy - Face ID Usage Description */
+"For authorized acces to bolus" = "For authorized acces to bolus";
+
+/* Privacy - NFC Scan Usage Description */
+"NFC is used to scan Libre sensors." = "NFC is used to scan Libre sensors.";
+
+/* Privacy - Calendars Usage Description */
+"Calendar is used to create a new glucose events." = "Calendar is used to create a new glucose events.";
+

+ 16 - 0
FreeAPS/Resources/en.lproj/infoPlist.strings

@@ -0,0 +1,16 @@
+
+/* Privacy - Bluetooth Always Usage Description */
+"NSBluetoothAlwaysUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+
+"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 - NFC Scan Usage Description */
+"NFCReaderUsageDescription" = "NFC is used to scan Libre sensors.";
+
+/* Privacy - Calendars Usage Description */
+"NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events.";
+
+

+ 12 - 0
FreeAPS/Resources/es.lproj/infoPlist.strings

@@ -0,0 +1,12 @@
+/* Privacy - Bluetooth Always Usage Description */
+"Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+
+/* Privacy - Face ID Usage Description */
+"For authorized acces to bolus" = "For authorized acces to bolus";
+
+/* Privacy - NFC Scan Usage Description */
+"NFC is used to scan Libre sensors." = "NFC is used to scan Libre sensors.";
+
+/* Privacy - Calendars Usage Description */
+"Calendar is used to create a new glucose events." = "Calendar is used to create a new glucose events.";
+

+ 12 - 0
FreeAPS/Resources/fi.lproj/infoPlist.strings

@@ -0,0 +1,12 @@
+/* Privacy - Bluetooth Always Usage Description */
+"Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+
+/* Privacy - Face ID Usage Description */
+"For authorized acces to bolus" = "For authorized acces to bolus";
+
+/* Privacy - NFC Scan Usage Description */
+"NFC is used to scan Libre sensors." = "NFC is used to scan Libre sensors.";
+
+/* Privacy - Calendars Usage Description */
+"Calendar is used to create a new glucose events." = "Calendar is used to create a new glucose events.";
+

+ 12 - 0
FreeAPS/Resources/fr.lproj/infoPlist.strings

@@ -0,0 +1,12 @@
+/* Privacy - Bluetooth Always Usage Description */
+"Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+
+/* Privacy - Face ID Usage Description */
+"For authorized acces to bolus" = "For authorized acces to bolus";
+
+/* Privacy - NFC Scan Usage Description */
+"NFC is used to scan Libre sensors." = "NFC is used to scan Libre sensors.";
+
+/* Privacy - Calendars Usage Description */
+"Calendar is used to create a new glucose events." = "Calendar is used to create a new glucose events.";
+

+ 12 - 0
FreeAPS/Resources/he.lproj/infoPlist.strings

@@ -0,0 +1,12 @@
+/* Privacy - Bluetooth Always Usage Description */
+"Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+
+/* Privacy - Face ID Usage Description */
+"For authorized acces to bolus" = "For authorized acces to bolus";
+
+/* Privacy - NFC Scan Usage Description */
+"NFC is used to scan Libre sensors." = "NFC is used to scan Libre sensors.";
+
+/* Privacy - Calendars Usage Description */
+"Calendar is used to create a new glucose events." = "Calendar is used to create a new glucose events.";
+

+ 13 - 0
FreeAPS/Resources/it.lproj/InfoPlist.strings

@@ -0,0 +1,13 @@
+/* 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";
+
+"NSBluetoothPeripheralUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+
+/* Privacy - Calendars Usage Description */
+"NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events.";
+
+/* Privacy - Face ID Usage Description */
+"NSFaceIDUsageDescription" = "For authorized acces to bolus";

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

@@ -10,5 +10,6 @@
     "insulinReqFraction": 0.7,
     "skipBolusScreenAfterCarbs": false,
     "cgm": "nightscout",
-    "uploadGlucose": false
+    "uploadGlucose": false,
+    "useCalendar": false
 }

+ 12 - 0
FreeAPS/Resources/nb.lproj/infoPlist.strings

@@ -0,0 +1,12 @@
+/* Privacy - Bluetooth Always Usage Description */
+"Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+
+/* Privacy - Face ID Usage Description */
+"For authorized acces to bolus" = "For authorized acces to bolus";
+
+/* Privacy - NFC Scan Usage Description */
+"NFC is used to scan Libre sensors." = "NFC is used to scan Libre sensors.";
+
+/* Privacy - Calendars Usage Description */
+"Calendar is used to create a new glucose events." = "Calendar is used to create a new glucose events.";
+

+ 12 - 0
FreeAPS/Resources/nl.lproj/infoPlist.strings

@@ -0,0 +1,12 @@
+/* Privacy - Bluetooth Always Usage Description */
+"Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+
+/* Privacy - Face ID Usage Description */
+"For authorized acces to bolus" = "For authorized acces to bolus";
+
+/* Privacy - NFC Scan Usage Description */
+"NFC is used to scan Libre sensors." = "NFC is used to scan Libre sensors.";
+
+/* Privacy - Calendars Usage Description */
+"Calendar is used to create a new glucose events." = "Calendar is used to create a new glucose events.";
+

+ 12 - 0
FreeAPS/Resources/pl.lproj/infoPlist.strings

@@ -0,0 +1,12 @@
+/* Privacy - Bluetooth Always Usage Description */
+"Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+
+/* Privacy - Face ID Usage Description */
+"For authorized acces to bolus" = "For authorized acces to bolus";
+
+/* Privacy - NFC Scan Usage Description */
+"NFC is used to scan Libre sensors." = "NFC is used to scan Libre sensors.";
+
+/* Privacy - Calendars Usage Description */
+"Calendar is used to create a new glucose events." = "Calendar is used to create a new glucose events.";
+

+ 12 - 0
FreeAPS/Resources/pt-BR.lproj/infoPlist.strings

@@ -0,0 +1,12 @@
+/* Privacy - Bluetooth Always Usage Description */
+"Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+
+/* Privacy - Face ID Usage Description */
+"For authorized acces to bolus" = "For authorized acces to bolus";
+
+/* Privacy - NFC Scan Usage Description */
+"NFC is used to scan Libre sensors." = "NFC is used to scan Libre sensors.";
+
+/* Privacy - Calendars Usage Description */
+"Calendar is used to create a new glucose events." = "Calendar is used to create a new glucose events.";
+

+ 12 - 0
FreeAPS/Resources/pt-PT.lproj/infoPlist.strings

@@ -0,0 +1,12 @@
+/* Privacy - Bluetooth Always Usage Description */
+"Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+
+/* Privacy - Face ID Usage Description */
+"For authorized acces to bolus" = "For authorized acces to bolus";
+
+/* Privacy - NFC Scan Usage Description */
+"NFC is used to scan Libre sensors." = "NFC is used to scan Libre sensors.";
+
+/* Privacy - Calendars Usage Description */
+"Calendar is used to create a new glucose events." = "Calendar is used to create a new glucose events.";
+

+ 13 - 0
FreeAPS/Resources/pt.lproj/InfoPlist.strings

@@ -0,0 +1,13 @@
+/* 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";
+
+"NSBluetoothPeripheralUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+
+/* Privacy - Calendars Usage Description */
+"NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events.";
+
+/* Privacy - Face ID Usage Description */
+"NSFaceIDUsageDescription" = "For authorized acces to bolus";

+ 12 - 0
FreeAPS/Resources/ru.lproj/infoPlist.strings

@@ -0,0 +1,12 @@
+/* Privacy - Bluetooth Always Usage Description */
+"Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+
+/* Privacy - Face ID Usage Description */
+"For authorized acces to bolus" = "For authorized acces to bolus";
+
+/* Privacy - NFC Scan Usage Description */
+"NFC is used to scan Libre sensors." = "NFC is used to scan Libre sensors.";
+
+/* Privacy - Calendars Usage Description */
+"Calendar is used to create a new glucose events." = "Calendar is used to create a new glucose events.";
+

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

@@ -0,0 +1,13 @@
+/* Privacy - NFC Scan Usage Description */
+"NFCReaderUsageDescription" = "NFC används för att skanna Libre-sensorer.";
+
+/* Privacy - Bluetooth Always Usage Description */
+"NSBluetoothAlwaysUsageDescription" = "Bluetooth används för att kommunicera med insulinpumpen och kontinuerlig glukosmätare";
+
+"NSBluetoothPeripheralUsageDescription" = "Bluetooth används för att kommunicera med insulinpumpen och kontinuerlig glukosmätare";
+
+/* Privacy - Calendars Usage Description */
+"NSCalendarsUsageDescription" = "Kalendern används för att skapa kalenderhändelser för glukosvärden.";
+
+/* Privacy - Face ID Usage Description */
+"NSFaceIDUsageDescription" = "För auktoriserad åtkomst till bolus";

+ 12 - 0
FreeAPS/Resources/tr.lproj/infoPlist.strings

@@ -0,0 +1,12 @@
+/* Privacy - Bluetooth Always Usage Description */
+"Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+
+/* Privacy - Face ID Usage Description */
+"For authorized acces to bolus" = "For authorized acces to bolus";
+
+/* Privacy - NFC Scan Usage Description */
+"NFC is used to scan Libre sensors." = "NFC is used to scan Libre sensors.";
+
+/* Privacy - Calendars Usage Description */
+"Calendar is used to create a new glucose events." = "Calendar is used to create a new glucose events.";
+

+ 12 - 0
FreeAPS/Resources/uk.lproj/infoPlist.strings

@@ -0,0 +1,12 @@
+/* Privacy - Bluetooth Always Usage Description */
+"Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+
+/* Privacy - Face ID Usage Description */
+"For authorized acces to bolus" = "For authorized acces to bolus";
+
+/* Privacy - NFC Scan Usage Description */
+"NFC is used to scan Libre sensors." = "NFC is used to scan Libre sensors.";
+
+/* Privacy - Calendars Usage Description */
+"Calendar is used to create a new glucose events." = "Calendar is used to create a new glucose events.";
+

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

@@ -0,0 +1,13 @@
+/* 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";
+
+"NSBluetoothPeripheralUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
+
+/* Privacy - Calendars Usage Description */
+"NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events.";
+
+/* Privacy - Face ID Usage Description */
+"NSFaceIDUsageDescription" = "For authorized acces to bolus";

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

@@ -20,7 +20,7 @@ enum CGMType: String, JSON, CaseIterable, Identifiable {
         case .dexcomG5:
             return "Dexcom G5"
         case .libreTransmitter:
-            return "Libre Transmitter"
+            return NSLocalizedString("Libre Transmitter", comment: "Libre Transmitter type")
         }
     }
 

+ 1 - 0
FreeAPS/Sources/Assemblies/ServiceAssembly.swift

@@ -13,5 +13,6 @@ final class ServiceAssembly: Assembly {
             reporter.setup()
             return reporter
         }
+        container.register(CalendarManager.self) { r in BaseCalendarManager(resilver: r) }
     }
 }

ファイルの差分が大きいため隠しています
+ 91 - 1
FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings


ファイルの差分が大きいため隠しています
+ 91 - 1
FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings


ファイルの差分が大きいため隠しています
+ 91 - 1
FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings


ファイルの差分が大きいため隠しています
+ 91 - 1
FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings


ファイルの差分が大きいため隠しています
+ 91 - 1
FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings


ファイルの差分が大きいため隠しています
+ 91 - 1
FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings


ファイルの差分が大きいため隠しています
+ 91 - 1
FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings


ファイルの差分が大きいため隠しています
+ 91 - 1
FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings


ファイルの差分が大きいため隠しています
+ 91 - 1
FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings


ファイルの差分が大きいため隠しています
+ 91 - 1
FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings


ファイルの差分が大きいため隠しています
+ 91 - 1
FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings


ファイルの差分が大きいため隠しています
+ 91 - 1
FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings


ファイルの差分が大きいため隠しています
+ 91 - 1
FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings


ファイルの差分が大きいため隠しています
+ 91 - 1
FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings


ファイルの差分が大きいため隠しています
+ 91 - 1
FreeAPS/Sources/Localizations/Main/pt.lproj/Localizable.strings


ファイルの差分が大きいため隠しています
+ 91 - 1
FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings


+ 92 - 2
FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings

@@ -399,11 +399,101 @@ Enact a temp Basal or a temp target */
 "Transmitter ID" = "Sändar-ID";
 
 /* Other CGM setting */
-"Other" = "Annan inställning";
+"Other" = "Annan";
+
+
+/* Calendar and Libre transmitter settings */
+
+"Configure Libre Transmitter" = "Ställ in en Libre-sändare";
+
+"Calibrations" = "Kalibreringar";
+
+"Create events in calendar" = "Skapa kalenderhändelser";
+
+"Calendar" = "Kalender";
+
+"Other" = "Annan";
+
+"Libre Transmitter" = "Libre-sändare";
+
+"Libre Transmitters" = "Libre-sändare";
+
+"Bluetooth Transmitters" = "Bluetooth-sändare";
+
+"Modes" = "Lägen";
+
+"Libre 2 Direct" = "Libre 2 Direkt";
+
+"Select the third party transmitter you want to connect to" = "Välj vilken sändare du vill ansluta till";
+
+/* The short unit display string for millimoles of glucose per liter */
+"mmol/L" = "mmol/l";
+
+/* The short unit display string for milligrams of glucose per decilter */
+"mg/dL" = "mg/dl";
+
+"Add calibration" = "Lägg till kalibrering";
+
+"Meter glucose" = "Glukosmätarvärde";
+
+"Info" = "Info";
+
+"Slope" = "Lutning";
+
+"Intercept" = "Skärningspunkt";
+
+"Chart" = "Diagram";
+
+"Remove" = "Ta bort";
+
+"Remove Last" = "Ta bort senaste";
+
+"Remove All" = "Ta bort alla";
+
+"Calibrations" = "Kalibreringar";
+
+"About the Process" = "Om processen";
+
+"Please make sure that your Libre 2 sensor is already activated and finished warming up. If you have other apps connecting to the sensor via bluetooth, these need to be shut down or uninstalled. \n\n You can only have one app communicating with the sensor via bluetooth. Then press the \"pariring and connection\" button below to start the process. Please note that the bluetooth connection might take up to a couple of minutes before it starts working." = "Bla bla";
+
+"Pairinginfo" = "Parkopplingsinfo";
+
+"PatchInfo" = "Patchinformation";
+
+"Calibrationinfo" = "Kalibreringsinfo";
+
+"Unknown" = "Okänd";
+
+"Not paired yet" = "Inte parkopplad ännu";
+
+"Pair Sensor & connect" = "Parkoppla sensor och anslut ";
+
+"Phone NFC required!" = "Telefon med NFC krävs!";
+
+"Your phone or app is not enabled for NFC communications, which is needed to pair to libre2 sensors" = "Din telefon eller app är inte aktiverad med NFC, vilket krävs för att parkoppla med Libre2-sensorer";
+
+"Bluetooth Power Off" = "Bluetooth är av";
+
+"Please turn on Bluetooth" = "Sätt på Bluetooth";
+
+"No Libre Transmitter Selected" = "Ingen Libre-sändare vald";
+
+"Delete CGMManager and start anew. Your libreoopweb credentials will be preserved" = "Ta bort CGM och börja om. Dina libreoopweb-inställningar kommer att sparas";
+
+
+/* Headers for settings */
+
+"OpenAPS main settings" = "OpenAPS huvudsakliga inställningar";
+
+"OpenAPS SMB settings" = "OpenAPS SMB-inställningar";
+
+"OpenAPS targets settings" = "OpenAPS målvärdesinställningar";
+
+"OpenAPS other settings" = "OpenAPS andra inställningar";
 
 /*
   Infotexts from openaps.docs and androidaps.docs
-  FreeAPS
+  FreeAPS X
 */
 /* ”Rewind Resets Autosens” */
 

ファイルの差分が大きいため隠しています
+ 160 - 70
FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings


ファイルの差分が大きいため隠しています
+ 91 - 1
FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings


ファイルの差分が大きいため隠しています
+ 91 - 1
FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings


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

@@ -13,4 +13,5 @@ struct FreeAPSSettings: JSON, Equatable {
     var skipBolusScreenAfterCarbs: Bool?
     var cgm: CGMType?
     var uploadGlucose: Bool?
+    var useCalendar: Bool?
 }

+ 41 - 0
FreeAPS/Sources/Modules/CGM/CGMStateModel.swift

@@ -1,18 +1,27 @@
+import Combine
 import SwiftUI
 
 extension CGM {
     final class StateModel: BaseStateModel<Provider> {
         @Injected() var settingsManager: SettingsManager!
         @Injected() var libreSource: LibreTransmitterSource!
+        @Injected() var calendarManager: CalendarManager!
 
         @Published var cgm: CGMType = .nightscout
         @Published var transmitterID = ""
         @Published var uploadGlucose = false
+        @Published var createCalendarEvents = false
+        @Published var calendarIDs: [String] = []
+        @Published var currentCalendarID: String = ""
+        @Persisted(key: "CalendarManager.currentCalendarID") var storedCalendarID: String? = nil
 
         override func subscribe() {
             cgm = settingsManager.settings.cgm ?? .nightscout
             uploadGlucose = settingsManager.settings.uploadGlucose ?? false
             transmitterID = UserDefaults.standard.dexcomTransmitterID ?? ""
+            currentCalendarID = storedCalendarID ?? ""
+            calendarIDs = calendarManager.calendarIDs()
+            createCalendarEvents = settingsManager.settings.useCalendar ?? false
 
             $cgm
                 .removeDuplicates()
@@ -28,6 +37,38 @@ extension CGM {
                     self?.settingsManager.settings.uploadGlucose = value
                 }
                 .store(in: &lifetime)
+
+            $createCalendarEvents
+                .removeDuplicates()
+                .flatMap { [weak self] ok -> AnyPublisher<Bool, Never> in
+                    guard ok, let self = self else { return Just(false).eraseToAnyPublisher() }
+                    return self.calendarManager.requestAccessIfNeeded()
+                }
+                .map { [weak self] ok -> [String] in
+                    guard ok, let self = self else { return [] }
+                    return self.calendarManager.calendarIDs()
+                }
+                .receive(on: DispatchQueue.main)
+                .weakAssign(to: \.calendarIDs, on: self)
+                .store(in: &lifetime)
+
+            $createCalendarEvents
+                .removeDuplicates()
+                .sink { [weak self] use in
+                    self?.settingsManager.settings.useCalendar = use
+                }
+                .store(in: &lifetime)
+
+            $currentCalendarID
+                .removeDuplicates()
+                .sink { [weak self] id in
+                    guard id.isNotEmpty else {
+                        self?.calendarManager.currentCalendarID = nil
+                        return
+                    }
+                    self?.calendarManager.currentCalendarID = id
+                }
+                .store(in: &lifetime)
         }
 
         func onChangeID() {

+ 11 - 0
FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift

@@ -37,6 +37,17 @@ extension CGM {
                     Text("Calibrations").navigationLink(to: .calibrations, from: self)
                 }
 
+                Section(header: Text("Calendar")) {
+                    Toggle("Create events in calendar", isOn: $state.createCalendarEvents)
+                    if state.calendarIDs.isNotEmpty {
+                        Picker("Calendar", selection: $state.currentCalendarID) {
+                            ForEach(state.calendarIDs, id: \.self) {
+                                Text($0).tag($0)
+                            }
+                        }
+                    }
+                }
+
                 Section(header: Text("Other")) {
                     Toggle("Upload glucose to Nightscout", isOn: $state.uploadGlucose)
                 }

+ 3 - 3
FreeAPS/Sources/Modules/CREditor/CREditorStateModel.swift

@@ -7,7 +7,7 @@ extension CREditor {
 
         let timeValues = stride(from: 0.0, to: 1.days.timeInterval, by: 30.minutes.timeInterval).map { $0 }
 
-        let rateValues = stride(from: 3, to: 50.01, by: 0.1).map { $0 }
+        let rateValues = stride(from: 3, to: 50.01, by: 0.1).map { Decimal($0) }
 
         var canAdd: Bool {
             guard let lastItem = items.last else { return true }
@@ -17,7 +17,7 @@ extension CREditor {
         override func subscribe() {
             items = provider.profile.schedule.map { value in
                 let timeIndex = timeValues.firstIndex(of: Double(value.offset * 60)) ?? 0
-                let rateIndex = rateValues.firstIndex(of: Double(value.ratio)) ?? 0
+                let rateIndex = rateValues.firstIndex(of: value.ratio) ?? 0
                 return Item(rateIndex: rateIndex, timeIndex: timeIndex)
             }
 
@@ -44,7 +44,7 @@ extension CREditor {
                 fotmatter.dateFormat = "HH:mm:ss"
                 let date = Date(timeIntervalSince1970: self.timeValues[item.timeIndex])
                 let minutes = Int(date.timeIntervalSince1970 / 60)
-                let rate = Decimal(self.rateValues[item.rateIndex])
+                let rate = self.rateValues[item.rateIndex]
                 return CarbRatioEntry(start: fotmatter.string(from: date), offset: minutes, ratio: rate)
             }
             let profile = CarbRatios(units: .grams, schedule: schedule)

+ 2 - 0
FreeAPS/Sources/Modules/Home/HomeStateModel.swift

@@ -8,6 +8,7 @@ extension Home {
         @Injected() var settingsManager: SettingsManager!
         @Injected() var apsManager: APSManager!
         @Injected() var nightscoutManager: NightscoutManager!
+        @Injected() var calendarManager: CalendarManager!
         private let timer = DispatchTimer(timeInterval: 5)
         private(set) var filteredHours = 24
 
@@ -145,6 +146,7 @@ extension Home {
                 } else {
                     self.glucoseDelta = nil
                 }
+                self.calendarManager.createEvent(for: self.recentGlucose, delta: self.glucoseDelta)
             }
         }
 

+ 2 - 2
FreeAPS/Sources/Modules/ISFEditor/ISFEditorStateModel.swift

@@ -13,9 +13,9 @@ extension ISFEditor {
         var rateValues: [Decimal] {
             switch units {
             case .mgdL:
-                return stride(from: 9, to: 540.01, by: 1.0).map { $0 }
+                return stride(from: 9, to: 540.01, by: 1.0).map { Decimal($0) }
             case .mmolL:
-                return stride(from: 0.1, to: 30.01, by: 0.1).map { $0 }
+                return stride(from: 0.1, to: 30.01, by: 0.1).map { Decimal($0) }
             }
         }
 

+ 161 - 0
FreeAPS/Sources/Services/Calendar/CalendarManager.swift

@@ -0,0 +1,161 @@
+import Combine
+import EventKit
+import Swinject
+
+protocol CalendarManager {
+    func requestAccessIfNeeded() -> AnyPublisher<Bool, Never>
+    func calendarIDs() -> [String]
+    var currentCalendarID: String? { get set }
+    func createEvent(for glucose: BloodGlucose?, delta: Int?)
+}
+
+final class BaseCalendarManager: CalendarManager, Injectable {
+    private lazy var eventStore: EKEventStore = { EKEventStore() }()
+
+    @Persisted(key: "CalendarManager.currentCalendarID") var currentCalendarID: String? = nil
+    @Injected() private var settingsManager: SettingsManager!
+
+    init(resilver: Resolver) {
+        injectServices(resilver)
+    }
+
+    func requestAccessIfNeeded() -> AnyPublisher<Bool, Never> {
+        Future { promise in
+            let status = EKEventStore.authorizationStatus(for: .event)
+            switch status {
+            case .notDetermined:
+                EKEventStore().requestAccess(to: .event) { granted, error in
+                    if let error = error {
+                        warning(.service, "Calendar access not granded", error: error)
+                    }
+                    promise(.success(granted))
+                }
+            case .denied,
+                 .restricted:
+                promise(.success(false))
+            case .authorized:
+                promise(.success(true))
+            @unknown default:
+                warning(.service, "Unknown calendar access status")
+                promise(.success(false))
+            }
+        }.eraseToAnyPublisher()
+    }
+
+    func calendarIDs() -> [String] {
+        EKEventStore().calendars(for: .event).map(\.title)
+    }
+
+    func createEvent(for glucose: BloodGlucose?, delta: Int?) {
+        guard settingsManager.settings.useCalendar ?? false else { return }
+
+        guard let calendar = currentCalendar else { return }
+
+        deleteAllEvents(in: calendar)
+
+        guard let glucose = glucose, let glucoseValue = glucose.glucose else { return }
+
+        // create an event now
+        let event = EKEvent(eventStore: eventStore)
+
+        let glucoseText = glucoseFormatter
+            .string(from: Double(
+                settingsManager.settings.units == .mmolL ?glucoseValue
+                    .asMmolL : Decimal(glucoseValue)
+            ) as NSNumber)!
+        let directionText = glucose.direction?.symbol ?? "↔︎"
+        let deltaText = delta
+            .map {
+                deltaFormatter
+                    .string(from: Double(settingsManager.settings.units == .mmolL ? $0.asMmolL : Decimal($0)) as NSNumber)!
+            } ?? "--"
+
+        let title = glucoseText + " " + directionText + " " + deltaText
+
+        event.title = title
+        event.notes = "FreeAPS X"
+        event.startDate = Date()
+        event.endDate = Date(timeIntervalSinceNow: 60 * 10)
+        event.calendar = calendar
+
+        do {
+            try eventStore.save(event, span: .thisEvent)
+        } catch {
+            warning(.service, "Cannot create calendar event", error: error)
+        }
+    }
+
+    var currentCalendar: EKCalendar? {
+        let calendars = eventStore.calendars(for: .event)
+        guard calendars.isNotEmpty else { return nil }
+        return calendars.first { $0.title == self.currentCalendarID }
+    }
+
+    private func deleteAllEvents(in calendar: EKCalendar) {
+        let predicate = eventStore.predicateForEvents(
+            withStart: Date(timeIntervalSinceNow: -24 * 3600),
+            end: Date(),
+            calendars: [calendar]
+        )
+
+        let events = eventStore.events(matching: predicate)
+
+        for event in events {
+            do {
+                try eventStore.remove(event, span: .thisEvent)
+            } catch {
+                warning(.service, "Cannot remove calendar events", error: error)
+            }
+        }
+    }
+
+    private var glucoseFormatter: NumberFormatter {
+        let formatter = NumberFormatter()
+        formatter.numberStyle = .decimal
+        formatter.maximumFractionDigits = 0
+        if settingsManager.settings.units == .mmolL {
+            formatter.minimumFractionDigits = 1
+            formatter.maximumFractionDigits = 1
+        }
+        return formatter
+    }
+
+    private var deltaFormatter: NumberFormatter {
+        let formatter = NumberFormatter()
+        formatter.numberStyle = .decimal
+        formatter.maximumFractionDigits = 2
+        formatter.positivePrefix = "+"
+        return formatter
+    }
+}
+
+extension BloodGlucose.Direction {
+    var symbol: String {
+        switch self {
+        case .tripleUp:
+            return "↑↑↑"
+        case .doubleUp:
+            return "↑↑"
+        case .singleUp:
+            return "↑"
+        case .fortyFiveUp:
+            return "↗︎"
+        case .flat:
+            return "→"
+        case .fortyFiveDown:
+            return "↘︎"
+        case .singleDown:
+            return "↓"
+        case .doubleDown:
+            return "↓↓"
+        case .tripleDown:
+            return "↓↓↓"
+        case .none:
+            return "↔︎"
+        case .notComputable:
+            return "↔︎"
+        case .rateOutOfRange:
+            return "↔︎"
+        }
+    }
+}

+ 2 - 0
crowdin.yml

@@ -25,3 +25,5 @@ files:
     translation: /Dependencies/rileylink_ios/RileyLinkKitUI/%osx_locale%.lproj/Localizable.strings
   - source: /Dependencies/rileylink_ios/OmniKitUI/en.lproj/Localizable.strings
     translation: /Dependencies/rileylink_ios/OmniKitUI/%osx_locale%.lproj/Localizable.strings
+  - source: /FreeAPS/Resources/Base.lproj/InfoPlist.strings
+    translation: /FreeAPS/Resources/%osx_locale%.lproj/InfoPlist.strings