diff --git a/.travis.yml b/.travis.yml
index 3eebe4222a..a40ca44135 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,5 +1,5 @@
language: objective-c
-osx_image: xcode9.1
+osx_image: xcode9.2
# xcode_sdk: iphonesimulator11
# xcode_project: Loop.xcodeproj
# xcode_scheme: Loop
diff --git a/Cartfile b/Cartfile
index 6022caf1d4..bea90f7004 100644
--- a/Cartfile
+++ b/Cartfile
@@ -1,6 +1,6 @@
-github "LoopKit/LoopKit" == 1.5.1
+github "LoopKit/LoopKit" == 1.5.3
github "LoopKit/xDripG5" ~> 0.8.1
-github "i-schuetz/SwiftCharts" "master"
+github "i-schuetz/SwiftCharts" == 0.6.1
github "mddub/dexcom-share-client-swift" == 0.4.1
github "mddub/G4ShareSpy" == 0.3.3
github "ps2/rileylink_ios" == 1.2.2
diff --git a/Cartfile.resolved b/Cartfile.resolved
index 55c2b25ca6..a3a62368dd 100644
--- a/Cartfile.resolved
+++ b/Cartfile.resolved
@@ -1,4 +1,4 @@
-github "LoopKit/LoopKit" "v1.5.1"
+github "LoopKit/LoopKit" "v1.5.3"
github "LoopKit/xDripG5" "v0.8.1"
github "amplitude/Amplitude-iOS" "v3.14.1"
github "i-schuetz/SwiftCharts" "6b55a26a7b0b95e49202ddc1db5404702fce114f"
diff --git a/Carthage/Build/.LoopKit.version b/Carthage/Build/.LoopKit.version
index 8a15f64dec..238f7b1ee7 100644
--- a/Carthage/Build/.LoopKit.version
+++ b/Carthage/Build/.LoopKit.version
@@ -8,23 +8,23 @@
"tvOS" : [
],
- "commitish" : "v1.5.1",
+ "commitish" : "v1.5.3",
"iOS" : [
{
"name" : "GlucoseKit",
- "hash" : "dafe89babb3c04b0d0562d61d23a1bdace71e5d0bb9dab9f4ad7edace906c4f4"
+ "hash" : "8fac3396a616113069f61fb316e981a9b0c226dc3cba0bfea6e6211b652a0318"
},
{
- "name" : "InsulinKit",
- "hash" : "096c5dc0ccbf8b2ea041816273cb37cc2e8db6fd7fad4c2caec45964928cbd04"
+ "name" : "LoopKit",
+ "hash" : "86fd067163789beed0090e667a7af07b3b8d085bdee0d305c8c1bc8b0113c330"
},
{
- "name" : "CarbKit",
- "hash" : "305afc1c4652fec0f4f1a68b417042d919ad502fc8532ebf728dfbdfd87d1bf9"
+ "name" : "InsulinKit",
+ "hash" : "ee21c02849ba0205dd31ed500c5b9758e17c34ab0ce2f7cab8b0e6be12efcba2"
},
{
- "name" : "LoopKit",
- "hash" : "f1f4789465b16727921aee60a9ce7e287d4f46146a116dc05827621aee0ccaf9"
+ "name" : "CarbKit",
+ "hash" : "ab000d3c58680c658562ada78fa0fbc30c657bdd818938919a9e542652770bf1"
}
]
}
\ No newline at end of file
diff --git a/Carthage/Build/iOS/CarbKit.framework/Assets.car b/Carthage/Build/iOS/CarbKit.framework/Assets.car
index eae959b1c6..ffa7ce350e 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/Assets.car and b/Carthage/Build/iOS/CarbKit.framework/Assets.car differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/CarbKit b/Carthage/Build/iOS/CarbKit.framework/CarbKit
index ac1bae95db..cae9bbb6dd 100755
Binary files a/Carthage/Build/iOS/CarbKit.framework/CarbKit and b/Carthage/Build/iOS/CarbKit.framework/CarbKit differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbAbsorptionInputController.nib/objects-11.0+.nib b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbAbsorptionInputController.nib/objects-11.0+.nib
index b3c7fefdd1..a21ac7bd46 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbAbsorptionInputController.nib/objects-11.0+.nib and b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbAbsorptionInputController.nib/objects-11.0+.nib differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbAbsorptionInputController.nib/runtime.nib b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbAbsorptionInputController.nib/runtime.nib
index ead440f6a8..462b2a64a9 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbAbsorptionInputController.nib/runtime.nib and b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbAbsorptionInputController.nib/runtime.nib differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbEntryEditViewController.nib/objects-11.0+.nib b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbEntryEditViewController.nib/objects-11.0+.nib
index 4aa6894386..e4f7054c2e 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbEntryEditViewController.nib/objects-11.0+.nib and b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbEntryEditViewController.nib/objects-11.0+.nib differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbEntryEditViewController.nib/runtime.nib b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbEntryEditViewController.nib/runtime.nib
index f94f26a6a3..3c1d7c24c4 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbEntryEditViewController.nib/runtime.nib and b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbEntryEditViewController.nib/runtime.nib differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbEntryTableViewController.nib/objects-11.0+.nib b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbEntryTableViewController.nib/objects-11.0+.nib
index c638fe8172..17f1bcff75 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbEntryTableViewController.nib/objects-11.0+.nib and b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbEntryTableViewController.nib/objects-11.0+.nib differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbEntryTableViewController.nib/runtime.nib b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbEntryTableViewController.nib/runtime.nib
index cd4cb2d527..3451e2bf3d 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbEntryTableViewController.nib/runtime.nib and b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbEntryTableViewController.nib/runtime.nib differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/LyL-9U-twn-view-9Ci-XW-6nA.nib/objects-11.0+.nib b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/LyL-9U-twn-view-9Ci-XW-6nA.nib/objects-11.0+.nib
index 3e5d5fb803..e172c7eb7b 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/LyL-9U-twn-view-9Ci-XW-6nA.nib/objects-11.0+.nib and b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/LyL-9U-twn-view-9Ci-XW-6nA.nib/objects-11.0+.nib differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/LyL-9U-twn-view-9Ci-XW-6nA.nib/runtime.nib b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/LyL-9U-twn-view-9Ci-XW-6nA.nib/runtime.nib
index 605dabbf28..1841b73321 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/LyL-9U-twn-view-9Ci-XW-6nA.nib/runtime.nib and b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/LyL-9U-twn-view-9Ci-XW-6nA.nib/runtime.nib differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/QAc-uE-L5K-view-ZAF-8o-e2g.nib/objects-11.0+.nib b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/QAc-uE-L5K-view-ZAF-8o-e2g.nib/objects-11.0+.nib
index 9f546f082b..ce121eeb94 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/QAc-uE-L5K-view-ZAF-8o-e2g.nib/objects-11.0+.nib and b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/QAc-uE-L5K-view-ZAF-8o-e2g.nib/objects-11.0+.nib differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/QAc-uE-L5K-view-ZAF-8o-e2g.nib/runtime.nib b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/QAc-uE-L5K-view-ZAF-8o-e2g.nib/runtime.nib
index 159a376f1c..968143d84a 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/QAc-uE-L5K-view-ZAF-8o-e2g.nib/runtime.nib and b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/QAc-uE-L5K-view-ZAF-8o-e2g.nib/runtime.nib differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/UINavigationController-wgu-gT-TgV.nib/objects-11.0+.nib b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/UINavigationController-wgu-gT-TgV.nib/objects-11.0+.nib
index 7fe52aec85..10f9b1ed17 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/UINavigationController-wgu-gT-TgV.nib/objects-11.0+.nib and b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/UINavigationController-wgu-gT-TgV.nib/objects-11.0+.nib differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/UINavigationController-wgu-gT-TgV.nib/runtime.nib b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/UINavigationController-wgu-gT-TgV.nib/runtime.nib
index ae31b9655a..dfa758ee82 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/UINavigationController-wgu-gT-TgV.nib/runtime.nib and b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/UINavigationController-wgu-gT-TgV.nib/runtime.nib differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/rUL-yg-cFX-view-b1s-8o-0Wp.nib/objects-11.0+.nib b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/rUL-yg-cFX-view-b1s-8o-0Wp.nib/objects-11.0+.nib
index 25d26660fe..ea19f72ce1 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/rUL-yg-cFX-view-b1s-8o-0Wp.nib/objects-11.0+.nib and b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/rUL-yg-cFX-view-b1s-8o-0Wp.nib/objects-11.0+.nib differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/rUL-yg-cFX-view-b1s-8o-0Wp.nib/runtime.nib b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/rUL-yg-cFX-view-b1s-8o-0Wp.nib/runtime.nib
index b3b05c4d78..7fce46147d 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/rUL-yg-cFX-view-b1s-8o-0Wp.nib/runtime.nib and b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/rUL-yg-cFX-view-b1s-8o-0Wp.nib/runtime.nib differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/DatePickerTableViewCell.nib b/Carthage/Build/iOS/CarbKit.framework/DatePickerTableViewCell.nib
index 0c8725ccd8..f21034dc3a 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/DatePickerTableViewCell.nib and b/Carthage/Build/iOS/CarbKit.framework/DatePickerTableViewCell.nib differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/Headers/CarbKit-Swift.h b/Carthage/Build/iOS/CarbKit.framework/Headers/CarbKit-Swift.h
index e9a9213c89..e0de98045c 100644
--- a/Carthage/Build/iOS/CarbKit.framework/Headers/CarbKit-Swift.h
+++ b/Carthage/Build/iOS/CarbKit.framework/Headers/CarbKit-Swift.h
@@ -1,4 +1,4 @@
-// Generated by Apple Swift version 4.0.2 (swiftlang-900.0.69.2 clang-900.0.38)
+// Generated by Apple Swift version 4.0.3 (swiftlang-900.0.74.1 clang-900.0.39.2)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wgcc-compat"
diff --git a/Carthage/Build/iOS/CarbKit.framework/Info.plist b/Carthage/Build/iOS/CarbKit.framework/Info.plist
index 01d1f3bfdb..28515f3abd 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/Info.plist and b/Carthage/Build/iOS/CarbKit.framework/Info.plist differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/arm.swiftdoc b/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/arm.swiftdoc
index 9fd24acf2f..05465544cd 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/arm.swiftdoc and b/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/arm.swiftdoc differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/arm.swiftmodule b/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/arm.swiftmodule
index f87e817fe8..26c75f5b3d 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/arm.swiftmodule and b/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/arm.swiftmodule differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/arm64.swiftdoc b/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/arm64.swiftdoc
index 563747199b..c6a08c1ce9 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/arm64.swiftdoc and b/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/arm64.swiftdoc differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/arm64.swiftmodule b/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/arm64.swiftmodule
index 2f4dc612ba..19f7facfb4 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/arm64.swiftmodule and b/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/arm64.swiftmodule differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/i386.swiftdoc b/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/i386.swiftdoc
index 32daddd4ae..8a5189af06 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/i386.swiftdoc and b/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/i386.swiftdoc differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/i386.swiftmodule b/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/i386.swiftmodule
index 8823cce7ff..781f08b808 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/i386.swiftmodule and b/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/i386.swiftmodule differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/x86_64.swiftdoc b/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/x86_64.swiftdoc
index e84216c0c2..363c27266c 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/x86_64.swiftdoc and b/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/x86_64.swiftdoc differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/x86_64.swiftmodule b/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/x86_64.swiftmodule
index 241102adfa..7cbaf7a7f1 100644
Binary files a/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/x86_64.swiftmodule and b/Carthage/Build/iOS/CarbKit.framework/Modules/CarbKit.swiftmodule/x86_64.swiftmodule differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/es.lproj/CarbKit.strings b/Carthage/Build/iOS/CarbKit.framework/es.lproj/CarbKit.strings
new file mode 100644
index 0000000000..416c782565
Binary files /dev/null and b/Carthage/Build/iOS/CarbKit.framework/es.lproj/CarbKit.strings differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/es.lproj/InfoPlist.strings b/Carthage/Build/iOS/CarbKit.framework/es.lproj/InfoPlist.strings
new file mode 100644
index 0000000000..d2dea409a2
Binary files /dev/null and b/Carthage/Build/iOS/CarbKit.framework/es.lproj/InfoPlist.strings differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/es.lproj/Localizable.strings b/Carthage/Build/iOS/CarbKit.framework/es.lproj/Localizable.strings
new file mode 100644
index 0000000000..cbbb4a4c85
Binary files /dev/null and b/Carthage/Build/iOS/CarbKit.framework/es.lproj/Localizable.strings differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/ru.lproj/CarbKit.strings b/Carthage/Build/iOS/CarbKit.framework/ru.lproj/CarbKit.strings
new file mode 100644
index 0000000000..953c993704
Binary files /dev/null and b/Carthage/Build/iOS/CarbKit.framework/ru.lproj/CarbKit.strings differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/ru.lproj/InfoPlist.strings b/Carthage/Build/iOS/CarbKit.framework/ru.lproj/InfoPlist.strings
new file mode 100644
index 0000000000..d3426a0c14
Binary files /dev/null and b/Carthage/Build/iOS/CarbKit.framework/ru.lproj/InfoPlist.strings differ
diff --git a/Carthage/Build/iOS/CarbKit.framework/ru.lproj/Localizable.strings b/Carthage/Build/iOS/CarbKit.framework/ru.lproj/Localizable.strings
new file mode 100644
index 0000000000..5b642c8d9c
Binary files /dev/null and b/Carthage/Build/iOS/CarbKit.framework/ru.lproj/Localizable.strings differ
diff --git a/Carthage/Build/iOS/GlucoseKit.framework/GlucoseKit b/Carthage/Build/iOS/GlucoseKit.framework/GlucoseKit
index ae828075b2..f56feab348 100755
Binary files a/Carthage/Build/iOS/GlucoseKit.framework/GlucoseKit and b/Carthage/Build/iOS/GlucoseKit.framework/GlucoseKit differ
diff --git a/Carthage/Build/iOS/GlucoseKit.framework/Headers/GlucoseKit-Swift.h b/Carthage/Build/iOS/GlucoseKit.framework/Headers/GlucoseKit-Swift.h
index d98532e754..e7ffcfda16 100644
--- a/Carthage/Build/iOS/GlucoseKit.framework/Headers/GlucoseKit-Swift.h
+++ b/Carthage/Build/iOS/GlucoseKit.framework/Headers/GlucoseKit-Swift.h
@@ -1,4 +1,4 @@
-// Generated by Apple Swift version 4.0.2 (swiftlang-900.0.69.2 clang-900.0.38)
+// Generated by Apple Swift version 4.0.3 (swiftlang-900.0.74.1 clang-900.0.39.2)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wgcc-compat"
diff --git a/Carthage/Build/iOS/GlucoseKit.framework/Info.plist b/Carthage/Build/iOS/GlucoseKit.framework/Info.plist
index b8dc1231e9..43bfeee160 100644
Binary files a/Carthage/Build/iOS/GlucoseKit.framework/Info.plist and b/Carthage/Build/iOS/GlucoseKit.framework/Info.plist differ
diff --git a/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/arm.swiftdoc b/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/arm.swiftdoc
index 74ab005803..2b816425c3 100644
Binary files a/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/arm.swiftdoc and b/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/arm.swiftdoc differ
diff --git a/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/arm.swiftmodule b/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/arm.swiftmodule
index 077ed3ca4a..7288446593 100644
Binary files a/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/arm.swiftmodule and b/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/arm.swiftmodule differ
diff --git a/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/arm64.swiftdoc b/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/arm64.swiftdoc
index 2b6d42df69..dbf3191cc7 100644
Binary files a/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/arm64.swiftdoc and b/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/arm64.swiftdoc differ
diff --git a/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/arm64.swiftmodule b/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/arm64.swiftmodule
index 5c06c8cd1d..86927ef576 100644
Binary files a/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/arm64.swiftmodule and b/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/arm64.swiftmodule differ
diff --git a/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/i386.swiftdoc b/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/i386.swiftdoc
index 7c0c2012f6..4c9af1652c 100644
Binary files a/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/i386.swiftdoc and b/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/i386.swiftdoc differ
diff --git a/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/i386.swiftmodule b/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/i386.swiftmodule
index 2504e24f9f..764b3f3c73 100644
Binary files a/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/i386.swiftmodule and b/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/i386.swiftmodule differ
diff --git a/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/x86_64.swiftdoc b/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/x86_64.swiftdoc
index 352d7d52f5..635b3e1d0f 100644
Binary files a/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/x86_64.swiftdoc and b/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/x86_64.swiftdoc differ
diff --git a/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/x86_64.swiftmodule b/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/x86_64.swiftmodule
index 447af1c6ef..1e9c74bb30 100644
Binary files a/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/x86_64.swiftmodule and b/Carthage/Build/iOS/GlucoseKit.framework/Modules/GlucoseKit.swiftmodule/x86_64.swiftmodule differ
diff --git a/Carthage/Build/iOS/GlucoseKit.framework/es.lproj/InfoPlist.strings b/Carthage/Build/iOS/GlucoseKit.framework/es.lproj/InfoPlist.strings
new file mode 100644
index 0000000000..2ffe97f57b
Binary files /dev/null and b/Carthage/Build/iOS/GlucoseKit.framework/es.lproj/InfoPlist.strings differ
diff --git a/Carthage/Build/iOS/GlucoseKit.framework/es.lproj/Localizable.strings b/Carthage/Build/iOS/GlucoseKit.framework/es.lproj/Localizable.strings
new file mode 100644
index 0000000000..9391e38612
Binary files /dev/null and b/Carthage/Build/iOS/GlucoseKit.framework/es.lproj/Localizable.strings differ
diff --git a/Carthage/Build/iOS/GlucoseKit.framework/ru.lproj/InfoPlist.strings b/Carthage/Build/iOS/GlucoseKit.framework/ru.lproj/InfoPlist.strings
new file mode 100644
index 0000000000..f78572ada5
Binary files /dev/null and b/Carthage/Build/iOS/GlucoseKit.framework/ru.lproj/InfoPlist.strings differ
diff --git a/Carthage/Build/iOS/GlucoseKit.framework/ru.lproj/Localizable.strings b/Carthage/Build/iOS/GlucoseKit.framework/ru.lproj/Localizable.strings
new file mode 100644
index 0000000000..3cd59451fd
Binary files /dev/null and b/Carthage/Build/iOS/GlucoseKit.framework/ru.lproj/Localizable.strings differ
diff --git a/Carthage/Build/iOS/InsulinKit.framework/Base.lproj/InsulinKit.storyboardc/UITableViewController-jGX-GA-nlH.nib b/Carthage/Build/iOS/InsulinKit.framework/Base.lproj/InsulinKit.storyboardc/UITableViewController-jGX-GA-nlH.nib
index 3c652d764c..542bdbf2c2 100644
Binary files a/Carthage/Build/iOS/InsulinKit.framework/Base.lproj/InsulinKit.storyboardc/UITableViewController-jGX-GA-nlH.nib and b/Carthage/Build/iOS/InsulinKit.framework/Base.lproj/InsulinKit.storyboardc/UITableViewController-jGX-GA-nlH.nib differ
diff --git a/Carthage/Build/iOS/InsulinKit.framework/Base.lproj/InsulinKit.storyboardc/jGX-GA-nlH-view-ccM-3y-LQM.nib b/Carthage/Build/iOS/InsulinKit.framework/Base.lproj/InsulinKit.storyboardc/jGX-GA-nlH-view-ccM-3y-LQM.nib
index 0d91edfb6c..bb68f6662a 100644
Binary files a/Carthage/Build/iOS/InsulinKit.framework/Base.lproj/InsulinKit.storyboardc/jGX-GA-nlH-view-ccM-3y-LQM.nib and b/Carthage/Build/iOS/InsulinKit.framework/Base.lproj/InsulinKit.storyboardc/jGX-GA-nlH-view-ccM-3y-LQM.nib differ
diff --git a/Carthage/Build/iOS/InsulinKit.framework/Headers/InsulinKit-Swift.h b/Carthage/Build/iOS/InsulinKit.framework/Headers/InsulinKit-Swift.h
index 8ba4972e12..70f2c5fb15 100644
--- a/Carthage/Build/iOS/InsulinKit.framework/Headers/InsulinKit-Swift.h
+++ b/Carthage/Build/iOS/InsulinKit.framework/Headers/InsulinKit-Swift.h
@@ -1,4 +1,4 @@
-// Generated by Apple Swift version 4.0.2 (swiftlang-900.0.69.2 clang-900.0.38)
+// Generated by Apple Swift version 4.0.3 (swiftlang-900.0.74.1 clang-900.0.39.2)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wgcc-compat"
diff --git a/Carthage/Build/iOS/InsulinKit.framework/Info.plist b/Carthage/Build/iOS/InsulinKit.framework/Info.plist
index e003703466..381e270e08 100644
Binary files a/Carthage/Build/iOS/InsulinKit.framework/Info.plist and b/Carthage/Build/iOS/InsulinKit.framework/Info.plist differ
diff --git a/Carthage/Build/iOS/InsulinKit.framework/InsulinKit b/Carthage/Build/iOS/InsulinKit.framework/InsulinKit
index 4cc896e253..cce267e727 100755
Binary files a/Carthage/Build/iOS/InsulinKit.framework/InsulinKit and b/Carthage/Build/iOS/InsulinKit.framework/InsulinKit differ
diff --git a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm.swiftdoc b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm.swiftdoc
index d91f8f4ddf..9048028fde 100644
Binary files a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm.swiftdoc and b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm.swiftdoc differ
diff --git a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm.swiftmodule b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm.swiftmodule
index ecef36efca..1b13df718c 100644
Binary files a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm.swiftmodule and b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm.swiftmodule differ
diff --git a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm64.swiftdoc b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm64.swiftdoc
index b1778e3548..5c0c5be58d 100644
Binary files a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm64.swiftdoc and b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm64.swiftdoc differ
diff --git a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm64.swiftmodule b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm64.swiftmodule
index 61849148d4..4363387e72 100644
Binary files a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm64.swiftmodule and b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm64.swiftmodule differ
diff --git a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/i386.swiftdoc b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/i386.swiftdoc
index 4f3b29d3b3..0a618cbf9e 100644
Binary files a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/i386.swiftdoc and b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/i386.swiftdoc differ
diff --git a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/i386.swiftmodule b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/i386.swiftmodule
index e2dea44dcf..a972f21d39 100644
Binary files a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/i386.swiftmodule and b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/i386.swiftmodule differ
diff --git a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/x86_64.swiftdoc b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/x86_64.swiftdoc
index a1e08c1584..093ad3740d 100644
Binary files a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/x86_64.swiftdoc and b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/x86_64.swiftdoc differ
diff --git a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/x86_64.swiftmodule b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/x86_64.swiftmodule
index 77067423de..56966ec21e 100644
Binary files a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/x86_64.swiftmodule and b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/x86_64.swiftmodule differ
diff --git a/Carthage/Build/iOS/InsulinKit.framework/es.lproj/InfoPlist.strings b/Carthage/Build/iOS/InsulinKit.framework/es.lproj/InfoPlist.strings
new file mode 100644
index 0000000000..1ee4318d4f
Binary files /dev/null and b/Carthage/Build/iOS/InsulinKit.framework/es.lproj/InfoPlist.strings differ
diff --git a/Carthage/Build/iOS/InsulinKit.framework/es.lproj/InsulinKit.strings b/Carthage/Build/iOS/InsulinKit.framework/es.lproj/InsulinKit.strings
new file mode 100644
index 0000000000..95b5d697c7
--- /dev/null
+++ b/Carthage/Build/iOS/InsulinKit.framework/es.lproj/InsulinKit.strings
@@ -0,0 +1,30 @@
+/* Class = "UILabel"; text = "Title"; ObjectID = "7Fi-wD-gf2"; */
+"7Fi-wD-gf2.text" = "Título";
+
+/* Class = "UILabel"; text = "..."; ObjectID = "7Fy-gG-Zof"; */
+"7Fy-gG-Zof.text" = "...";
+
+/* Class = "UILabel"; text = "Detail"; ObjectID = "9jm-X6-3QA"; */
+"9jm-X6-3QA.text" = "Detalle";
+
+/* Class = "UILabel"; text = "..."; ObjectID = "PZQ-gO-084"; */
+"PZQ-gO-084.text" = "...";
+
+/* Class = "UISegmentedControl"; TyZ-xm-mVN.segmentTitles[0] = "Reservoir"; ObjectID = "TyZ-xm-mVN"; */
+"TyZ-xm-mVN.segmentTitles[0]" = "Reservorio";
+
+/* Class = "UISegmentedControl"; TyZ-xm-mVN.segmentTitles[1] = "Event History"; ObjectID = "TyZ-xm-mVN"; */
+"TyZ-xm-mVN.segmentTitles[1]" = "Historia de eventos";
+
+/* Class = "UILabel"; text = "U IOB"; ObjectID = "dZi-Ta-IHm"; */
+"dZi-Ta-IHm.text" = "U IOB";
+
+/* Class = "UILabel"; text = "No pump configured"; ObjectID = "jSc-64-2tZ"; */
+"jSc-64-2tZ.text" = "No hay microinfusadora configurada";
+
+/* Class = "UILabel"; text = "U Total"; ObjectID = "kys-by-14s"; */
+"kys-by-14s.text" = "U Total";
+
+/* Class = "UINavigationItem"; title = "Insulin Delivery"; ObjectID = "vls-EW-uwI"; */
+"vls-EW-uwI.title" = "Administración de insulina";
+
diff --git a/Carthage/Build/iOS/InsulinKit.framework/es.lproj/Localizable.strings b/Carthage/Build/iOS/InsulinKit.framework/es.lproj/Localizable.strings
new file mode 100644
index 0000000000..48d76fe554
Binary files /dev/null and b/Carthage/Build/iOS/InsulinKit.framework/es.lproj/Localizable.strings differ
diff --git a/Carthage/Build/iOS/InsulinKit.framework/ru.lproj/InfoPlist.strings b/Carthage/Build/iOS/InsulinKit.framework/ru.lproj/InfoPlist.strings
new file mode 100644
index 0000000000..3967e063f9
Binary files /dev/null and b/Carthage/Build/iOS/InsulinKit.framework/ru.lproj/InfoPlist.strings differ
diff --git a/Carthage/Build/iOS/InsulinKit.framework/ru.lproj/InsulinKit.strings b/Carthage/Build/iOS/InsulinKit.framework/ru.lproj/InsulinKit.strings
new file mode 100644
index 0000000000..98b4eadf6a
--- /dev/null
+++ b/Carthage/Build/iOS/InsulinKit.framework/ru.lproj/InsulinKit.strings
@@ -0,0 +1,30 @@
+/* Class = "UILabel"; text = "Title"; ObjectID = "7Fi-wD-gf2"; */
+"7Fi-wD-gf2.text" = "Название";
+
+/* Class = "UILabel"; text = "..."; ObjectID = "7Fy-gG-Zof"; */
+"7Fy-gG-Zof.text" = "...";
+
+/* Class = "UILabel"; text = "Detail"; ObjectID = "9jm-X6-3QA"; */
+"9jm-X6-3QA.text" = "Детали";
+
+/* Class = "UILabel"; text = "..."; ObjectID = "PZQ-gO-084"; */
+"PZQ-gO-084.text" = "...";
+
+/* Class = "UISegmentedControl"; TyZ-xm-mVN.segmentTitles[0] = "Reservoir"; ObjectID = "TyZ-xm-mVN"; */
+"TyZ-xm-mVN.segmentTitles[0]" = "Резервуар";
+
+/* Class = "UISegmentedControl"; TyZ-xm-mVN.segmentTitles[1] = "Event History"; ObjectID = "TyZ-xm-mVN"; */
+"TyZ-xm-mVN.segmentTitles[1]" = "История событий";
+
+/* Class = "UILabel"; text = "U IOB"; ObjectID = "dZi-Ta-IHm"; */
+"dZi-Ta-IHm.text" = "ед IOB";
+
+/* Class = "UILabel"; text = "No pump configured"; ObjectID = "jSc-64-2tZ"; */
+"jSc-64-2tZ.text" = "Нет сконфигурированной помпы";
+
+/* Class = "UILabel"; text = "U Total"; ObjectID = "kys-by-14s"; */
+"kys-by-14s.text" = "ед Всего";
+
+/* Class = "UINavigationItem"; title = "Insulin Delivery"; ObjectID = "vls-EW-uwI"; */
+"vls-EW-uwI.title" = "Подача инсулина";
+
diff --git a/Carthage/Build/iOS/InsulinKit.framework/ru.lproj/Localizable.strings b/Carthage/Build/iOS/InsulinKit.framework/ru.lproj/Localizable.strings
new file mode 100644
index 0000000000..d847043320
Binary files /dev/null and b/Carthage/Build/iOS/InsulinKit.framework/ru.lproj/Localizable.strings differ
diff --git a/Carthage/Build/iOS/LoopKit.framework/Assets.car b/Carthage/Build/iOS/LoopKit.framework/Assets.car
index 7c98cb3894..57091a2ea2 100644
Binary files a/Carthage/Build/iOS/LoopKit.framework/Assets.car and b/Carthage/Build/iOS/LoopKit.framework/Assets.car differ
diff --git a/Carthage/Build/iOS/LoopKit.framework/GlucoseRangeOverrideTableViewCell.nib b/Carthage/Build/iOS/LoopKit.framework/GlucoseRangeOverrideTableViewCell.nib
index 541a04032e..f22053ee26 100644
Binary files a/Carthage/Build/iOS/LoopKit.framework/GlucoseRangeOverrideTableViewCell.nib and b/Carthage/Build/iOS/LoopKit.framework/GlucoseRangeOverrideTableViewCell.nib differ
diff --git a/Carthage/Build/iOS/LoopKit.framework/GlucoseRangeTableViewCell.nib b/Carthage/Build/iOS/LoopKit.framework/GlucoseRangeTableViewCell.nib
index 74e782f280..effb6721a1 100644
Binary files a/Carthage/Build/iOS/LoopKit.framework/GlucoseRangeTableViewCell.nib and b/Carthage/Build/iOS/LoopKit.framework/GlucoseRangeTableViewCell.nib differ
diff --git a/Carthage/Build/iOS/LoopKit.framework/Headers/LoopKit-Swift.h b/Carthage/Build/iOS/LoopKit.framework/Headers/LoopKit-Swift.h
index bc78e56ba5..fcfe96210d 100644
--- a/Carthage/Build/iOS/LoopKit.framework/Headers/LoopKit-Swift.h
+++ b/Carthage/Build/iOS/LoopKit.framework/Headers/LoopKit-Swift.h
@@ -1,4 +1,4 @@
-// Generated by Apple Swift version 4.0.2 (swiftlang-900.0.69.2 clang-900.0.38)
+// Generated by Apple Swift version 4.0.3 (swiftlang-900.0.74.1 clang-900.0.39.2)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wgcc-compat"
diff --git a/Carthage/Build/iOS/LoopKit.framework/Info.plist b/Carthage/Build/iOS/LoopKit.framework/Info.plist
index b11f7609b7..f82a677b94 100644
Binary files a/Carthage/Build/iOS/LoopKit.framework/Info.plist and b/Carthage/Build/iOS/LoopKit.framework/Info.plist differ
diff --git a/Carthage/Build/iOS/LoopKit.framework/LoopKit b/Carthage/Build/iOS/LoopKit.framework/LoopKit
index b3e24da4ef..be38825c3a 100755
Binary files a/Carthage/Build/iOS/LoopKit.framework/LoopKit and b/Carthage/Build/iOS/LoopKit.framework/LoopKit differ
diff --git a/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/arm.swiftdoc b/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/arm.swiftdoc
index 619ad9abf4..919a0eedec 100644
Binary files a/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/arm.swiftdoc and b/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/arm.swiftdoc differ
diff --git a/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/arm.swiftmodule b/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/arm.swiftmodule
index 54b9b404f4..8583c620b2 100644
Binary files a/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/arm.swiftmodule and b/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/arm.swiftmodule differ
diff --git a/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/arm64.swiftdoc b/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/arm64.swiftdoc
index 07876d32b6..c9b6cd930e 100644
Binary files a/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/arm64.swiftdoc and b/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/arm64.swiftdoc differ
diff --git a/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/arm64.swiftmodule b/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/arm64.swiftmodule
index 0c325b7b10..e33eb55840 100644
Binary files a/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/arm64.swiftmodule and b/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/arm64.swiftmodule differ
diff --git a/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/i386.swiftdoc b/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/i386.swiftdoc
index ab7f5e68b8..dbbe0581a7 100644
Binary files a/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/i386.swiftdoc and b/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/i386.swiftdoc differ
diff --git a/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/i386.swiftmodule b/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/i386.swiftmodule
index 552bc78171..25e65151d5 100644
Binary files a/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/i386.swiftmodule and b/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/i386.swiftmodule differ
diff --git a/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/x86_64.swiftdoc b/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/x86_64.swiftdoc
index c1876b8628..24b912ed49 100644
Binary files a/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/x86_64.swiftdoc and b/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/x86_64.swiftdoc differ
diff --git a/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/x86_64.swiftmodule b/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/x86_64.swiftmodule
index 14a0375f08..7fcd86b8a6 100644
Binary files a/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/x86_64.swiftmodule and b/Carthage/Build/iOS/LoopKit.framework/Modules/LoopKit.swiftmodule/x86_64.swiftmodule differ
diff --git a/Carthage/Build/iOS/LoopKit.framework/RepeatingScheduleValueTableViewCell.nib b/Carthage/Build/iOS/LoopKit.framework/RepeatingScheduleValueTableViewCell.nib
index cc2204a3cb..896da6d4e6 100644
Binary files a/Carthage/Build/iOS/LoopKit.framework/RepeatingScheduleValueTableViewCell.nib and b/Carthage/Build/iOS/LoopKit.framework/RepeatingScheduleValueTableViewCell.nib differ
diff --git a/Carthage/Build/iOS/LoopKit.framework/TextFieldTableViewCell.nib b/Carthage/Build/iOS/LoopKit.framework/TextFieldTableViewCell.nib
index 7af60760e2..265a4f82d7 100644
Binary files a/Carthage/Build/iOS/LoopKit.framework/TextFieldTableViewCell.nib and b/Carthage/Build/iOS/LoopKit.framework/TextFieldTableViewCell.nib differ
diff --git a/Carthage/Build/iOS/LoopKit.framework/es.lproj/InfoPlist.strings b/Carthage/Build/iOS/LoopKit.framework/es.lproj/InfoPlist.strings
new file mode 100644
index 0000000000..1ee4318d4f
Binary files /dev/null and b/Carthage/Build/iOS/LoopKit.framework/es.lproj/InfoPlist.strings differ
diff --git a/Carthage/Build/iOS/LoopKit.framework/es.lproj/Localizable.strings b/Carthage/Build/iOS/LoopKit.framework/es.lproj/Localizable.strings
new file mode 100644
index 0000000000..b380a13ae7
Binary files /dev/null and b/Carthage/Build/iOS/LoopKit.framework/es.lproj/Localizable.strings differ
diff --git a/Carthage/Build/iOS/LoopKit.framework/es.lproj/LoopKit.strings b/Carthage/Build/iOS/LoopKit.framework/es.lproj/LoopKit.strings
new file mode 100644
index 0000000000..4f978a1855
Binary files /dev/null and b/Carthage/Build/iOS/LoopKit.framework/es.lproj/LoopKit.strings differ
diff --git a/Carthage/Build/iOS/LoopKit.framework/ru.lproj/InfoPlist.strings b/Carthage/Build/iOS/LoopKit.framework/ru.lproj/InfoPlist.strings
new file mode 100644
index 0000000000..1ee4318d4f
Binary files /dev/null and b/Carthage/Build/iOS/LoopKit.framework/ru.lproj/InfoPlist.strings differ
diff --git a/Carthage/Build/iOS/LoopKit.framework/ru.lproj/Localizable.strings b/Carthage/Build/iOS/LoopKit.framework/ru.lproj/Localizable.strings
new file mode 100644
index 0000000000..225fd44646
Binary files /dev/null and b/Carthage/Build/iOS/LoopKit.framework/ru.lproj/Localizable.strings differ
diff --git a/Carthage/Build/iOS/LoopKit.framework/ru.lproj/LoopKit.strings b/Carthage/Build/iOS/LoopKit.framework/ru.lproj/LoopKit.strings
new file mode 100644
index 0000000000..d40428e2a1
Binary files /dev/null and b/Carthage/Build/iOS/LoopKit.framework/ru.lproj/LoopKit.strings differ
diff --git a/Common/Models/StatusExtensionContext.swift b/Common/Models/StatusExtensionContext.swift
index 9f6896114b..9430895822 100644
--- a/Common/Models/StatusExtensionContext.swift
+++ b/Common/Models/StatusExtensionContext.swift
@@ -266,7 +266,7 @@ extension DatedRangeContext: RawRepresentable {
struct StatusExtensionContext: RawRepresentable {
typealias RawValue = [String: Any]
- private let version = 3
+ private let version = 4
var glucose: [GlucoseContext]?
var predictedGlucose: PredictedGlucoseContext?
@@ -274,6 +274,7 @@ struct StatusExtensionContext: RawRepresentable {
var loop: LoopContext?
var netBasal: NetBasalContext?
var batteryPercentage: Double?
+ var activeInsulin: Double?
var targetRanges: [DatedRangeContext]?
var temporaryOverride: DatedRangeContext?
var sensor: SensorDisplayableContext?
@@ -307,6 +308,8 @@ struct StatusExtensionContext: RawRepresentable {
batteryPercentage = rawValue["batteryPercentage"] as? Double
+ activeInsulin = rawValue["activeInsulin"] as? Double
+
if let rawValue = rawValue["targetRanges"] as? [DatedRangeContext.RawValue] {
targetRanges = rawValue.flatMap({return DatedRangeContext(rawValue: $0)})
}
@@ -331,6 +334,7 @@ struct StatusExtensionContext: RawRepresentable {
raw["loop"] = loop?.rawValue
raw["netBasal"] = netBasal?.rawValue
raw["batteryPercentage"] = batteryPercentage
+ raw["activeInsulin"] = activeInsulin
raw["targetRanges"] = targetRanges?.map({return $0.rawValue})
raw["temporaryOverride"] = temporaryOverride?.rawValue
raw["sensor"] = sensor?.rawValue
diff --git a/DoseMathTests/Info.plist b/DoseMathTests/Info.plist
index f5727e9a94..2fdd26a501 100644
--- a/DoseMathTests/Info.plist
+++ b/DoseMathTests/Info.plist
@@ -15,7 +15,7 @@
CFBundlePackageTypeBNDLCFBundleShortVersionString
- 1.5.1dev
+ 1.5.1CFBundleSignature????CFBundleVersion
diff --git a/DoseMathTests/es.lproj/InfoPlist.strings b/DoseMathTests/es.lproj/InfoPlist.strings
new file mode 100644
index 0000000000..874e8a4532
--- /dev/null
+++ b/DoseMathTests/es.lproj/InfoPlist.strings
@@ -0,0 +1 @@
+/* No Localized Strings */
diff --git a/DoseMathTests/es.lproj/Localizable.strings b/DoseMathTests/es.lproj/Localizable.strings
new file mode 100644
index 0000000000..f891fbeef2
--- /dev/null
+++ b/DoseMathTests/es.lproj/Localizable.strings
@@ -0,0 +1,15 @@
+/* Message when offering bolus recommendation even though bg is below range. (1: glucose value) */
+"Current glucose of %1$@ is below correction range." = "Glucosa actual de %1$@ está debajo del rango correctivo.";
+
+/* Message when offering bolus recommendation even though bg is below range and minBG is in future. (1: glucose time)(2: glucose number) */
+"Predicted glucose at %1$@ is %2$@." = "Glucosa proyectada en %1$@ es %2$@.";
+
+/* Notice message when recommending bolus when BG is below the suspend threshold. (1: glucose value) */
+"Predicted glucose of %1$@ is below your suspend threshold setting." = "Glucosa proyectada de %1$@ se encuentra debajo de tu nivel de suspensión.";
+
+/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
+"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
+
+/* The unit display string for millimoles of glucose per liter */
+"mmol/L" = "mmol/L";
+
diff --git a/DoseMathTests/ru.lproj/InfoPlist.strings b/DoseMathTests/ru.lproj/InfoPlist.strings
new file mode 100644
index 0000000000..874e8a4532
--- /dev/null
+++ b/DoseMathTests/ru.lproj/InfoPlist.strings
@@ -0,0 +1 @@
+/* No Localized Strings */
diff --git a/DoseMathTests/ru.lproj/Localizable.strings b/DoseMathTests/ru.lproj/Localizable.strings
new file mode 100644
index 0000000000..4d12f14694
--- /dev/null
+++ b/DoseMathTests/ru.lproj/Localizable.strings
@@ -0,0 +1,15 @@
+/* Message when offering bolus recommendation even though bg is below range. (1: glucose value) */
+"Current glucose of %1$@ is below correction range." = " Текущая гликемия %1$@ ниже диапазона коррекции";
+
+/* Message when offering bolus recommendation even though bg is below range and minBG is in future. (1: glucose time)(2: glucose number) */
+"Predicted glucose at %1$@ is %2$@." = "Предсказываемая гликемия в %1$@ - %2$@.";
+
+/* Notice message when recommending bolus when BG is below the suspend threshold. (1: glucose value) */
+"Predicted glucose of %1$@ is below your suspend threshold setting." = "Предсказываемая гликемия %1$@ ниже установленного вами порога приостановки помпы";
+
+/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
+"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
+
+/* The unit display string for millimoles of glucose per liter */
+"mmol/L" = "ммоль/л";
+
diff --git a/Loop Status Extension/Base.lproj/MainInterface.storyboard b/Loop Status Extension/Base.lproj/MainInterface.storyboard
index 57419b7616..154bdf9b27 100644
--- a/Loop Status Extension/Base.lproj/MainInterface.storyboard
+++ b/Loop Status Extension/Base.lproj/MainInterface.storyboard
@@ -1,11 +1,11 @@
-
-
+
+
-
+
@@ -42,11 +42,24 @@
+
+
+
+
+
@@ -76,6 +89,7 @@
+
diff --git a/Loop Status Extension/Info.plist b/Loop Status Extension/Info.plist
index f74d6994b1..50155bbb0c 100644
--- a/Loop Status Extension/Info.plist
+++ b/Loop Status Extension/Info.plist
@@ -19,7 +19,7 @@
CFBundlePackageTypeXPC!CFBundleShortVersionString
- 1.5.1dev
+ 1.5.1CFBundleVersion$(CURRENT_PROJECT_VERSION)AppGroupIdentifier
diff --git a/Loop Status Extension/StatusViewController.swift b/Loop Status Extension/StatusViewController.swift
index 271b38b941..d388476b90 100644
--- a/Loop Status Extension/StatusViewController.swift
+++ b/Loop Status Extension/StatusViewController.swift
@@ -26,6 +26,7 @@ class StatusViewController: UIViewController, NCWidgetProviding {
}
}
@IBOutlet weak var subtitleLabel: UILabel!
+ @IBOutlet weak var insulinLabel: UILabel!
@IBOutlet weak var glucoseChartContentView: LoopUI.ChartContainerView!
private lazy var charts: StatusChartsManager = {
@@ -65,6 +66,8 @@ class StatusViewController: UIViewController, NCWidgetProviding {
super.viewDidLoad()
subtitleLabel.isHidden = true
subtitleLabel.textColor = .subtitleLabelColor
+ insulinLabel.isHidden = true
+ insulinLabel.textColor = .subtitleLabelColor
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(openLoopApp(_:)))
view.addGestureRecognizer(tapGestureRecognizer)
@@ -166,6 +169,7 @@ class StatusViewController: UIViewController, NCWidgetProviding {
}
subtitleLabel.isHidden = true
+ insulinLabel.isHidden = true
let dateFormatter: DateFormatter = {
let dateFormatter = DateFormatter()
@@ -175,7 +179,25 @@ class StatusViewController: UIViewController, NCWidgetProviding {
return dateFormatter
}()
+ let insulinFormatter: NumberFormatter = {
+ let numberFormatter = NumberFormatter()
+
+ numberFormatter.numberStyle = .decimal
+ numberFormatter.minimumFractionDigits = 1
+ numberFormatter.maximumFractionDigits = 1
+
+ return numberFormatter
+ }()
+ if let activeInsulin = context.activeInsulin, let valueStr = insulinFormatter.string(from:NSNumber(value:activeInsulin))
+ {
+ insulinLabel.text = String(format: NSLocalizedString(
+ "IOB %1$@ U",
+ comment: "The subtitle format describing units of active insulin. (1: localized insulin value description)"),
+ valueStr)
+ insulinLabel.isHidden = false
+ }
+
if let glucose = context.glucose,
glucose.count > 0 {
let unit = glucose[0].unit
@@ -193,6 +215,10 @@ class StatusViewController: UIViewController, NCWidgetProviding {
if let first = glucose.first {
charts.startDate = first.startDate
}
+
+ // Showing the whole history plus full prediction in the glucose plot
+ // is a little crowded, so limit it to three hours in the future:
+ charts.maxEndDate = Date().addingTimeInterval(TimeInterval(hours: 3))
if let predictedGlucose = context.predictedGlucose?.samples {
charts.predictedGlucosePoints = predictedGlucose.map {
@@ -209,7 +235,7 @@ class StatusViewController: UIViewController, NCWidgetProviding {
subtitleLabel.text = String(
format: NSLocalizedString(
"Eventually %1$@ %2$@",
- comment: "The subtitle format describing eventual glucose. (1: localized glucose value description) (2: localized glucose units description)"),
+ comment: "The subtitle format describing eventual glucose. (1: localized glucose value description) (2: localized glucose units description)"),
eventualGlucoseNumberString,
unit.glucoseUnitDisplayString
)
diff --git a/Loop Status Extension/es.lproj/InfoPlist.strings b/Loop Status Extension/es.lproj/InfoPlist.strings
new file mode 100644
index 0000000000..9250064a26
--- /dev/null
+++ b/Loop Status Extension/es.lproj/InfoPlist.strings
@@ -0,0 +1,6 @@
+/* (No Comment) */
+"CFBundleDisplayName" = "Loop";
+
+/* (No Comment) */
+"CFBundleName" = "$(PRODUCT_NAME)";
+
diff --git a/Loop Status Extension/es.lproj/Localizable.strings b/Loop Status Extension/es.lproj/Localizable.strings
new file mode 100644
index 0000000000..f3457c9c08
--- /dev/null
+++ b/Loop Status Extension/es.lproj/Localizable.strings
@@ -0,0 +1,12 @@
+/* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
+"%1$@ v%2$@" = "%1$@ v%2$@";
+
+/* The subtitle format describing eventual glucose. (1: localized glucose value description) (2: localized glucose units description) */
+"Eventually %1$@ %2$@" = "Eventualmente %1$@ %2$@";
+
+/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
+"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
+
+/* The unit display string for millimoles of glucose per liter */
+"mmol/L" = "mmol/L";
+
diff --git a/Loop Status Extension/es.lproj/MainInterface.strings b/Loop Status Extension/es.lproj/MainInterface.strings
new file mode 100644
index 0000000000..3360a8bb6f
--- /dev/null
+++ b/Loop Status Extension/es.lproj/MainInterface.strings
@@ -0,0 +1,3 @@
+/* Class = "UILabel"; text = "Eventually 92 mg/dL"; ObjectID = "9iF-xY-Bh4"; */
+"9iF-xY-Bh4.text" = "Eventualmente 92 mg/dL";
+
diff --git a/Loop Status Extension/ru.lproj/InfoPlist.strings b/Loop Status Extension/ru.lproj/InfoPlist.strings
new file mode 100644
index 0000000000..874e8a4532
--- /dev/null
+++ b/Loop Status Extension/ru.lproj/InfoPlist.strings
@@ -0,0 +1 @@
+/* No Localized Strings */
diff --git a/Loop Status Extension/ru.lproj/Localizable.strings b/Loop Status Extension/ru.lproj/Localizable.strings
new file mode 100644
index 0000000000..5dabd82453
--- /dev/null
+++ b/Loop Status Extension/ru.lproj/Localizable.strings
@@ -0,0 +1,12 @@
+/* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
+"%1$@ v%2$@" = "%1$@ v%2$@";
+
+/* The subtitle format describing eventual glucose. (1: localized glucose value description) (2: localized glucose units description) */
+"Eventually %1$@ %2$@" = "В конечном итоге %1$@ %2$@";
+
+/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
+"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
+
+/* The unit display string for millimoles of glucose per liter */
+"mmol/L" = "ммоль/л";
+
diff --git a/Loop Status Extension/ru.lproj/MainInterface.strings b/Loop Status Extension/ru.lproj/MainInterface.strings
new file mode 100644
index 0000000000..6f65da80eb
--- /dev/null
+++ b/Loop Status Extension/ru.lproj/MainInterface.strings
@@ -0,0 +1,6 @@
+/* Class = "UILabel"; text = "Eventually 92 mg/dL"; ObjectID = "9iF-xY-Bh4"; */
+"9iF-xY-Bh4.text" = "в конечном итоге 92 мг/дл";
+
+/* Class = "UILabel"; text = "IOB 1.0 U"; ObjectID = "UPi-dG-yYD"; */
+"UPi-dG-yYD.text" = "IOB 1.0 U";
+
diff --git a/Loop.xcodeproj/project.pbxproj b/Loop.xcodeproj/project.pbxproj
index 9deb8153c7..449edbde9b 100644
--- a/Loop.xcodeproj/project.pbxproj
+++ b/Loop.xcodeproj/project.pbxproj
@@ -236,6 +236,17 @@
4FF4D1001E18374700846527 /* WatchContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FF4D0FF1E18374700846527 /* WatchContext.swift */; };
4FF4D1011E18375000846527 /* WatchContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FF4D0FF1E18374700846527 /* WatchContext.swift */; };
540DED971E14C75F002B2491 /* EnliteSensorDisplayable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 540DED961E14C75F002B2491 /* EnliteSensorDisplayable.swift */; };
+ 7D7076351FE06EDE004AC8EA /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D7076371FE06EDE004AC8EA /* Localizable.strings */; };
+ 7D70763A1FE06EDF004AC8EA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D70763C1FE06EDF004AC8EA /* InfoPlist.strings */; };
+ 7D70763F1FE06EDF004AC8EA /* ckcomplication.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D7076411FE06EDF004AC8EA /* ckcomplication.strings */; };
+ 7D7076451FE06EE0004AC8EA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D7076471FE06EE0004AC8EA /* InfoPlist.strings */; };
+ 7D70764A1FE06EE1004AC8EA /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D70764C1FE06EE1004AC8EA /* Localizable.strings */; };
+ 7D70764F1FE06EE1004AC8EA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D7076511FE06EE1004AC8EA /* InfoPlist.strings */; };
+ 7D7076541FE06EE2004AC8EA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D7076561FE06EE2004AC8EA /* InfoPlist.strings */; };
+ 7D7076591FE06EE2004AC8EA /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D70765B1FE06EE2004AC8EA /* Localizable.strings */; };
+ 7D70765E1FE06EE3004AC8EA /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D7076601FE06EE3004AC8EA /* Localizable.strings */; };
+ 7D7076631FE06EE4004AC8EA /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D7076651FE06EE4004AC8EA /* Localizable.strings */; };
+ 7D7076681FE0702F004AC8EA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D70766A1FE0702F004AC8EA /* InfoPlist.strings */; };
C10428971D17BAD400DD539A /* NightscoutUploadKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C10428961D17BAD400DD539A /* NightscoutUploadKit.framework */; };
C10B28461EA9BA5E006EA1FC /* far_future_high_bg_forecast.json in Resources */ = {isa = PBXBuildFile; fileRef = C10B28451EA9BA5E006EA1FC /* far_future_high_bg_forecast.json */; };
C11C87DD1E21E53500BB71D3 /* GlucoseThreshold.swift in Sources */ = {isa = PBXBuildFile; fileRef = C178249D1E19B62300D9D25C /* GlucoseThreshold.swift */; };
@@ -582,6 +593,38 @@
4FC8C8001DEB93E400A1452E /* NSUserDefaults+StatusExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSUserDefaults+StatusExtension.swift"; sourceTree = ""; };
4FF4D0FF1E18374700846527 /* WatchContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WatchContext.swift; sourceTree = ""; };
540DED961E14C75F002B2491 /* EnliteSensorDisplayable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnliteSensorDisplayable.swift; sourceTree = ""; };
+ 7D68AAA91FE2DB0A00522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/LaunchScreen.strings; sourceTree = ""; };
+ 7D68AAAA1FE2DB0A00522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Main.strings; sourceTree = ""; };
+ 7D68AAAB1FE2DB0A00522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/MainInterface.strings; sourceTree = ""; };
+ 7D68AAAC1FE2DB0A00522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Interface.strings; sourceTree = ""; };
+ 7D68AAAD1FE2E8D400522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; };
+ 7D68AAAE1FE2E8D400522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; };
+ 7D68AAAF1FE2E8D500522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; };
+ 7D68AAB01FE2E8D500522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/ckcomplication.strings; sourceTree = ""; };
+ 7D68AAB11FE2E8D500522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; };
+ 7D68AAB21FE2E8D500522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; };
+ 7D68AAB31FE2E8D500522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; };
+ 7D68AAB41FE2E8D600522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; };
+ 7D68AAB51FE2E8D600522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; };
+ 7D68AAB61FE2E8D600522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; };
+ 7D68AAB71FE2E8D600522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; };
+ 7D68AAB81FE2E8D700522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; };
+ 7D7076361FE06EDE004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; };
+ 7D70763B1FE06EDF004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = ""; };
+ 7D7076401FE06EDF004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/ckcomplication.strings; sourceTree = ""; };
+ 7D7076421FE06EE0004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = ""; };
+ 7D7076461FE06EE0004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = ""; };
+ 7D70764B1FE06EE1004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; };
+ 7D7076501FE06EE1004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = ""; };
+ 7D7076551FE06EE2004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = ""; };
+ 7D70765A1FE06EE2004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; };
+ 7D70765F1FE06EE3004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; };
+ 7D7076641FE06EE4004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; };
+ 7D7076691FE0702F004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = ""; };
+ 7DD382761F8DBFC60071272B /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/LaunchScreen.strings; sourceTree = ""; };
+ 7DD382771F8DBFC60071272B /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Main.strings; sourceTree = ""; };
+ 7DD382781F8DBFC60071272B /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/MainInterface.strings; sourceTree = ""; };
+ 7DD382791F8DBFC60071272B /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Interface.strings; sourceTree = ""; };
C10428961D17BAD400DD539A /* NightscoutUploadKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NightscoutUploadKit.framework; path = Carthage/Build/iOS/NightscoutUploadKit.framework; sourceTree = ""; };
C10B28451EA9BA5E006EA1FC /* far_future_high_bg_forecast.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = far_future_high_bg_forecast.json; sourceTree = ""; };
C12F21A61DFA79CB00748193 /* recommend_temp_basal_very_low_end_in_range.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = recommend_temp_basal_very_low_end_in_range.json; sourceTree = ""; };
@@ -767,6 +810,8 @@
43776F8E1B8022E90074EA36 /* Loop */ = {
isa = PBXGroup;
children = (
+ 7D7076651FE06EE4004AC8EA /* Localizable.strings */,
+ 7D7076511FE06EE1004AC8EA /* InfoPlist.strings */,
C9886AE41E5B2FAD00473BB8 /* gallery.ckcomplication */,
4309786B1E73D2F500BEBC82 /* it.lproj */,
43EDEE6B1CF2E12A00393BE3 /* Loop.entitlements */,
@@ -822,6 +867,9 @@
43A943821B926B7B0051FA24 /* WatchApp Extension */ = {
isa = PBXGroup;
children = (
+ 7D7076601FE06EE3004AC8EA /* Localizable.strings */,
+ 7D7076411FE06EDF004AC8EA /* ckcomplication.strings */,
+ 7D70763C1FE06EDF004AC8EA /* InfoPlist.strings */,
43D533BB1CFD1DD7009E3085 /* WatchApp Extension.entitlements */,
43846AD41D8FA67800799272 /* Base.lproj */,
43076BF21DFDBC4B0012A723 /* it.lproj */,
@@ -847,6 +895,8 @@
43E2D8D21D20BF42004DA55F /* DoseMathTests */ = {
isa = PBXGroup;
children = (
+ 7D70766A1FE0702F004AC8EA /* InfoPlist.strings */,
+ 7D70765B1FE06EE2004AC8EA /* Localizable.strings */,
43E2D8E01D20C0CB004DA55F /* Fixtures */,
43E2D8D31D20BF42004DA55F /* DoseMathTests.swift */,
43E2D8D51D20BF42004DA55F /* Info.plist */,
@@ -985,6 +1035,8 @@
4F70C1DF1DE8DCA7006380B7 /* Loop Status Extension */ = {
isa = PBXGroup;
children = (
+ 7D7076561FE06EE2004AC8EA /* InfoPlist.strings */,
+ 7D7076371FE06EDE004AC8EA /* Localizable.strings */,
4F70C1FD1DE8E662006380B7 /* Loop Status Extension.entitlements */,
4F70C1E51DE8DCA7006380B7 /* Info.plist */,
4F08DEA21E81E12D006741EA /* DatedRangedContextCalculator.swift */,
@@ -999,6 +1051,8 @@
4F75288C1DFE1DC600C322D6 /* LoopUI */ = {
isa = PBXGroup;
children = (
+ 7D70764C1FE06EE1004AC8EA /* Localizable.strings */,
+ 7D7076471FE06EE0004AC8EA /* InfoPlist.strings */,
4FB76FC41E8C576800B39636 /* Extensions */,
4FB76FC31E8C575900B39636 /* Managers */,
4F7528A61DFE20AE00C322D6 /* Models */,
@@ -1381,8 +1435,10 @@
buildActionMask = 2147483647;
files = (
43FCBBC21E51710B00343C1B /* LaunchScreen.storyboard in Resources */,
+ 7D70764F1FE06EE1004AC8EA /* InfoPlist.strings in Resources */,
43776F991B8022E90074EA36 /* Assets.xcassets in Resources */,
434F54591D28805E002A9274 /* ButtonTableViewCell.xib in Resources */,
+ 7D7076631FE06EE4004AC8EA /* Localizable.strings in Resources */,
43776F971B8022E90074EA36 /* Main.storyboard in Resources */,
C9886AE51E5B2FAD00473BB8 /* gallery.ckcomplication in Resources */,
4309786C1E73D2F500BEBC82 /* it.lproj in Resources */,
@@ -1405,7 +1461,10 @@
buildActionMask = 2147483647;
files = (
43846AD51D8FA67800799272 /* Base.lproj in Resources */,
+ 7D70765E1FE06EE3004AC8EA /* Localizable.strings in Resources */,
+ 7D70763A1FE06EDF004AC8EA /* InfoPlist.strings in Resources */,
43076BF31DFDBC4B0012A723 /* it.lproj in Resources */,
+ 7D70763F1FE06EDF004AC8EA /* ckcomplication.strings in Resources */,
43A943901B926B7B0051FA24 /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -1414,12 +1473,14 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ 7D7076591FE06EE2004AC8EA /* Localizable.strings in Resources */,
43E2D8F21D20C0DB004DA55F /* recommend_temp_basal_no_change_glucose.json in Resources */,
43E2D8F61D20C0DB004DA55F /* recommend_temp_basal_start_low_end_in_range.json in Resources */,
C17824A31E19EAB600D9D25C /* recommend_temp_basal_start_very_low_end_high.json in Resources */,
43E2D8F41D20C0DB004DA55F /* recommend_temp_basal_start_high_end_low.json in Resources */,
43E2D8EF1D20C0DB004DA55F /* recommend_temp_basal_high_and_falling.json in Resources */,
436D9BF81F6F4EA100CFA75F /* recommended_temp_start_low_end_just_above_range.json in Resources */,
+ 7D7076681FE0702F004AC8EA /* InfoPlist.strings in Resources */,
43E2D8ED1D20C0DB004DA55F /* recommend_temp_basal_correct_low_at_min.json in Resources */,
43E2D8F01D20C0DB004DA55F /* recommend_temp_basal_high_and_rising.json in Resources */,
C12F21A71DFA79CB00748193 /* recommend_temp_basal_very_low_end_in_range.json in Resources */,
@@ -1445,6 +1506,8 @@
buildActionMask = 2147483647;
files = (
4F70C1E41DE8DCA7006380B7 /* MainInterface.storyboard in Resources */,
+ 7D7076541FE06EE2004AC8EA /* InfoPlist.strings in Resources */,
+ 7D7076351FE06EDE004AC8EA /* Localizable.strings in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1453,6 +1516,8 @@
buildActionMask = 2147483647;
files = (
4F2C15971E09E94E00E160D4 /* Assets.xcassets in Resources */,
+ 7D70764A1FE06EE1004AC8EA /* Localizable.strings in Resources */,
+ 7D7076451FE06EE0004AC8EA /* InfoPlist.strings in Resources */,
4F2C15951E09BF3C00E160D4 /* HUDView.xib in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -1775,6 +1840,8 @@
isa = PBXVariantGroup;
children = (
43776F961B8022E90074EA36 /* Base */,
+ 7DD382771F8DBFC60071272B /* es */,
+ 7D68AAAA1FE2DB0A00522C49 /* ru */,
);
name = Main.storyboard;
sourceTree = "";
@@ -1783,6 +1850,8 @@
isa = PBXVariantGroup;
children = (
43776F9B1B8022E90074EA36 /* Base */,
+ 7DD382761F8DBFC60071272B /* es */,
+ 7D68AAA91FE2DB0A00522C49 /* ru */,
);
name = LaunchScreen.storyboard;
sourceTree = "";
@@ -1791,6 +1860,8 @@
isa = PBXVariantGroup;
children = (
43A943751B926B7B0051FA24 /* Base */,
+ 7DD382791F8DBFC60071272B /* es */,
+ 7D68AAAC1FE2DB0A00522C49 /* ru */,
);
name = Interface.storyboard;
sourceTree = "";
@@ -1799,14 +1870,117 @@
isa = PBXVariantGroup;
children = (
4F70C1E31DE8DCA7006380B7 /* Base */,
+ 7DD382781F8DBFC60071272B /* es */,
+ 7D68AAAB1FE2DB0A00522C49 /* ru */,
);
name = MainInterface.storyboard;
sourceTree = "";
};
+ 7D7076371FE06EDE004AC8EA /* Localizable.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 7D7076361FE06EDE004AC8EA /* es */,
+ 7D68AAAD1FE2E8D400522C49 /* ru */,
+ );
+ name = Localizable.strings;
+ sourceTree = "";
+ };
+ 7D70763C1FE06EDF004AC8EA /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 7D70763B1FE06EDF004AC8EA /* es */,
+ 7D68AAAF1FE2E8D500522C49 /* ru */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "";
+ };
+ 7D7076411FE06EDF004AC8EA /* ckcomplication.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 7D7076401FE06EDF004AC8EA /* es */,
+ 7D68AAB01FE2E8D500522C49 /* ru */,
+ );
+ name = ckcomplication.strings;
+ sourceTree = "";
+ };
+ 7D7076471FE06EE0004AC8EA /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 7D7076461FE06EE0004AC8EA /* es */,
+ 7D68AAB21FE2E8D500522C49 /* ru */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "";
+ };
+ 7D70764C1FE06EE1004AC8EA /* Localizable.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 7D70764B1FE06EE1004AC8EA /* es */,
+ 7D68AAB31FE2E8D500522C49 /* ru */,
+ );
+ name = Localizable.strings;
+ sourceTree = "";
+ };
+ 7D7076511FE06EE1004AC8EA /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 7D7076501FE06EE1004AC8EA /* es */,
+ 7D68AAB41FE2E8D600522C49 /* ru */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "";
+ };
+ 7D7076561FE06EE2004AC8EA /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 7D7076551FE06EE2004AC8EA /* es */,
+ 7D68AAB51FE2E8D600522C49 /* ru */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "";
+ };
+ 7D70765B1FE06EE2004AC8EA /* Localizable.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 7D70765A1FE06EE2004AC8EA /* es */,
+ 7D68AAB61FE2E8D600522C49 /* ru */,
+ );
+ name = Localizable.strings;
+ sourceTree = "";
+ };
+ 7D7076601FE06EE3004AC8EA /* Localizable.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 7D70765F1FE06EE3004AC8EA /* es */,
+ 7D68AAB71FE2E8D600522C49 /* ru */,
+ );
+ name = Localizable.strings;
+ sourceTree = "";
+ };
+ 7D7076651FE06EE4004AC8EA /* Localizable.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 7D7076641FE06EE4004AC8EA /* es */,
+ 7D68AAB81FE2E8D700522C49 /* ru */,
+ );
+ name = Localizable.strings;
+ sourceTree = "";
+ };
+ 7D70766A1FE0702F004AC8EA /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 7D7076691FE0702F004AC8EA /* es */,
+ 7D68AAAE1FE2E8D400522C49 /* ru */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "";
+ };
C1C73F0F1DE3D0270022FC89 /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
C1C73F0E1DE3D0270022FC89 /* it */,
+ 7D7076421FE06EE0004AC8EA /* es */,
+ 7D68AAB11FE2E8D500522C49 /* ru */,
);
name = InfoPlist.strings;
sourceTree = "";
@@ -1844,7 +2018,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer: loudnate@gmail.com (XZN842LDLT)";
COPY_PHASE_STRIP = NO;
- CURRENT_PROJECT_VERSION = 41;
+ CURRENT_PROJECT_VERSION = 42;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
@@ -1909,7 +2083,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer: loudnate@gmail.com (XZN842LDLT)";
COPY_PHASE_STRIP = NO;
- CURRENT_PROJECT_VERSION = 41;
+ CURRENT_PROJECT_VERSION = 42;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
@@ -2149,11 +2323,11 @@
CLANG_WARN_SUSPICIOUS_MOVES = YES;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
- CURRENT_PROJECT_VERSION = 41;
+ CURRENT_PROJECT_VERSION = 42;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = "";
DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 41;
+ DYLIB_CURRENT_VERSION = 42;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = LoopUI/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -2176,11 +2350,11 @@
CLANG_WARN_SUSPICIOUS_MOVES = YES;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
- CURRENT_PROJECT_VERSION = 41;
+ CURRENT_PROJECT_VERSION = 42;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = "";
DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 41;
+ DYLIB_CURRENT_VERSION = 42;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = LoopUI/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
diff --git a/Loop.xcodeproj/xcshareddata/xcschemes/Complication - WatchApp.xcscheme b/Loop.xcodeproj/xcshareddata/xcschemes/Complication - WatchApp.xcscheme
index 3a69a9801a..2d94260fca 100644
--- a/Loop.xcodeproj/xcshareddata/xcschemes/Complication - WatchApp.xcscheme
+++ b/Loop.xcodeproj/xcshareddata/xcschemes/Complication - WatchApp.xcscheme
@@ -1,6 +1,6 @@
NewPumpEvent {
- let dose = DoseEntry(type: .bolus, startDate: date, endDate: date, value: units, unit: .units)
+ let dose = DoseEntry(
+ type: .bolus,
+ startDate: date,
+ endDate: date.addingTimeInterval(.minutes(units / NewPumpEvent.deliveryUnitsPerMinute)),
+ value: units,
+ unit: .units
+ )
return self.init(
date: date,
diff --git a/Loop/Info.plist b/Loop/Info.plist
index 68c9d91fd9..7438bc759c 100644
--- a/Loop/Info.plist
+++ b/Loop/Info.plist
@@ -19,7 +19,7 @@
CFBundlePackageTypeAPPLCFBundleShortVersionString
- 1.5.1dev
+ 1.5.1CFBundleSignature????CFBundleURLTypes
diff --git a/Loop/Managers/DeviceDataManager.swift b/Loop/Managers/DeviceDataManager.swift
index 0d3f1367eb..e96f7cb504 100644
--- a/Loop/Managers/DeviceDataManager.swift
+++ b/Loop/Managers/DeviceDataManager.swift
@@ -521,7 +521,7 @@ final class DeviceDataManager {
var pumpID = newValue
- if let pumpID = pumpID, pumpID.characters.count == 6 {
+ if let pumpID = pumpID, pumpID.count == 6 {
let pumpState = PumpState(pumpID: pumpID, pumpRegion: self.pumpState?.pumpRegion ?? .northAmerica)
if let timeZone = self.pumpState?.timeZone {
@@ -625,6 +625,8 @@ final class DeviceDataManager {
if let timeZone = UserDefaults.standard.pumpTimeZone {
pumpState.timeZone = timeZone
+ } else {
+ UserDefaults.standard.pumpTimeZone = TimeZone.current
}
if let pumpModelNumber = UserDefaults.standard.pumpModelNumber {
@@ -689,6 +691,7 @@ extension DeviceDataManager: CGMManagerDelegate {
self.assertCurrentPumpData()
}
case .noData:
+ self.assertCurrentPumpData()
break
case .error(let error):
self.setLastError(error: error)
diff --git a/Loop/Managers/DiagnosticLogger.swift b/Loop/Managers/DiagnosticLogger.swift
index e647cf21b1..bbc1dbbb1c 100644
--- a/Loop/Managers/DiagnosticLogger.swift
+++ b/Loop/Managers/DiagnosticLogger.swift
@@ -110,7 +110,7 @@ final class CategoryLogger {
}
func debug(_ message: String) {
- systemLog.error("%{public}@", message)
+ systemLog.debug("%{public}@", message)
remoteLog(.debug, message: message)
}
@@ -120,7 +120,7 @@ final class CategoryLogger {
}
func info(_ message: String) {
- systemLog.error("%{public}@", message)
+ systemLog.info("%{public}@", message)
remoteLog(.info, message: message)
}
diff --git a/Loop/Managers/StatusChartsManager+LoopKit.swift b/Loop/Managers/StatusChartsManager+LoopKit.swift
index e8ed0f1c0d..507f4941c3 100644
--- a/Loop/Managers/StatusChartsManager+LoopKit.swift
+++ b/Loop/Managers/StatusChartsManager+LoopKit.swift
@@ -84,8 +84,16 @@ extension StatusChartsManager {
var allDosePoints = [ChartPoint]()
for entry in doseEntries {
- switch entry.endDate.timeIntervalSince(entry.startDate) {
- case let time where time > 0:
+ let time = entry.endDate.timeIntervalSince(entry.startDate)
+
+ if entry.type == .bolus && entry.units > 0 && time < .minutes(5) {
+ let x = ChartAxisValueDate(date: entry.startDate, formatter: dateFormatter)
+ let y = ChartAxisValueDoubleLog(actualDouble: entry.units, unitString: "U", formatter: doseFormatter)
+
+ let point = ChartPoint(x: x, y: y)
+ bolusDosePoints.append(point)
+ allDosePoints.append(point)
+ } else if time > 0 {
// TODO: Display the DateInterval
let startX = ChartAxisValueDate(date: entry.startDate, formatter: dateFormatter)
let endX = ChartAxisValueDate(date: entry.endDate, formatter: dateFormatter)
@@ -110,15 +118,6 @@ extension StatusChartsManager {
]
allDosePoints += valuePoints
- default:
- if entry.type == .bolus && entry.units > 0 {
- let x = ChartAxisValueDate(date: entry.startDate, formatter: dateFormatter)
- let y = ChartAxisValueDoubleLog(actualDouble: entry.units, unitString: "U", formatter: doseFormatter)
-
- let point = ChartPoint(x: x, y: y)
- bolusDosePoints.append(point)
- allDosePoints.append(point)
- }
}
}
diff --git a/Loop/Managers/StatusExtensionDataManager.swift b/Loop/Managers/StatusExtensionDataManager.swift
index 0250b8ba8f..d77e8a0b6a 100644
--- a/Loop/Managers/StatusExtensionDataManager.swift
+++ b/Loop/Managers/StatusExtensionDataManager.swift
@@ -10,6 +10,7 @@ import HealthKit
import UIKit
import CarbKit
import LoopKit
+import InsulinKit
import LoopUI
@@ -134,6 +135,22 @@ final class StatusExtensionDataManager {
)
}
+ updateGroup.enter()
+ manager.doseStore.insulinOnBoard(at: Date()) {(result) in
+ // This function completes asynchronously, so below
+ // is a completion that returns a value after eventual
+ // function completion. Currently the time of update
+ // isn't used in the code, but could e.g. check how
+ // recent it is.
+ switch result {
+ case .success(let iobValue):
+ context.activeInsulin = iobValue.value
+ case .failure:
+ context.activeInsulin = nil
+ }
+ updateGroup.leave()
+ }
+
if let batteryPercentage = dataManager.pumpBatteryChargeRemaining {
context.batteryPercentage = batteryPercentage
}
diff --git a/Loop/View Controllers/PumpIDTableViewController.swift b/Loop/View Controllers/PumpIDTableViewController.swift
index 9f807d5b51..26425795d5 100644
--- a/Loop/View Controllers/PumpIDTableViewController.swift
+++ b/Loop/View Controllers/PumpIDTableViewController.swift
@@ -99,7 +99,7 @@ final class PumpIDTableViewController: TextFieldTableViewController {
case .id:
return super.tableView(tableView, titleForFooterInSection: section)
case .region:
- return NSLocalizedString("The pump regioncan be found printed on the back as part of the model number (REF), for example: MMT-551NAB, or MMT-515LWWS. If the model number contains \"NA\" or \"CA\", then the region is North America. If if contains \"WW\", then the region is World-Wide.", comment: "Instructions on selecting the pump region")
+ return NSLocalizedString("The pump region can be found printed on the back as part of the model number (REF), for example: MMT-551NAB, or MMT-515LWWS. If the model number contains \"NA\" or \"CA\", then the region is North America. If if contains \"WW\", then the region is World-Wide.", comment: "Instructions on selecting the pump region")
}
}
diff --git a/Loop/es.lproj/InfoPlist.strings b/Loop/es.lproj/InfoPlist.strings
new file mode 100644
index 0000000000..84e8f22363
--- /dev/null
+++ b/Loop/es.lproj/InfoPlist.strings
@@ -0,0 +1,15 @@
+/* (No Comment) */
+"CFBundleDisplayName" = "Loop";
+
+/* (No Comment) */
+"CFBundleName" = "$(PRODUCT_NAME)";
+
+/* (No Comment) */
+"NSBluetoothPeripheralUsageDescription" = "Bluetooth se utiliza para las comunicaciones con la microinfusora y los dispositivos de monitoreo continuo de glucosa.";
+
+/* (No Comment) */
+"NSHealthShareUsageDescription" = "Datos de alimentos de la base de datos de Salud se utiliza para determinar los efectos en el nivel de glucosa. Datos de glucosa de la bsase de datos de Salud se utilizan para graficar y determinar cálculos de momentum.";
+
+/* (No Comment) */
+"NSHealthUpdateUsageDescription" = "Datos de alimentos ingresados en la aplicación y en el reloj son almacenados en la base de datos de Salud. Los datos de glucosa extraídos del monitor continuo de glucosa se almacenan de manera segura en Kit de Salud.";
+
diff --git a/Loop/es.lproj/LaunchScreen.strings b/Loop/es.lproj/LaunchScreen.strings
new file mode 100644
index 0000000000..874e8a4532
--- /dev/null
+++ b/Loop/es.lproj/LaunchScreen.strings
@@ -0,0 +1 @@
+/* No Localized Strings */
diff --git a/Loop/es.lproj/Localizable.strings b/Loop/es.lproj/Localizable.strings
new file mode 100644
index 0000000000..e2cd8898d7
--- /dev/null
+++ b/Loop/es.lproj/Localizable.strings
@@ -0,0 +1,441 @@
+/* The string format appended to active insulin that describes pending insulin. (1: pending insulin) */
+" (pending: %@)" = "(pendiente: %@)";
+
+/* Format string for current suspend threshold. (1: value)(2: bg unit) */
+"%1$@ %2$@" = "%1$@ %2$@";
+
+/* Format string for carb ratio average. (1: value)(2: carb unit)
+ Format string for insulin sensitivity average (1: value)(2: glucose unit) */
+"%1$@ %2$@/U" = "%1$@ %2$@/U";
+
+/* Formats (1: carb start time) and (2: carb absorption duration) */
+"%1$@ + %2$@" = "%1$@ + %2$@";
+
+/* Low reservoir alert format string. (1: Number of units remaining) */
+"%1$@ U left" = "%1$@ U restantes";
+
+/* Low reservoir alert with time remaining format string. (1: Number of units remaining)(2: approximate time remaining) */
+"%1$@ U left: %2$@" = "%1$@ U restantes: %2$@";
+
+/* The format for recommended temp basal rate and time. (1: localized rate number)(2: localized time) */
+"%1$@ U/hour @ %2$@" = "%1$@ U/hora @ %2$@";
+
+/* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
+"%1$@ v%2$@" = "%1$@ v%2$@";
+
+/* Format string for glucose target range. (1: Min target)(2: Max target)(3: glucose unit) */
+"%1$@ – %2$@ %3$@" = "%1$@ – %2$@ %3$@";
+
+/* Format string describing glucose units per minute (1: glucose unit string) */
+"%1$@/min" = "%1$@/min";
+
+/* Formats (1: carb value) and (2: food type) */
+"%1$@: %2$@" = "%1$@: %2$@";
+
+/* The subtitle format describing total insulin. (1: localized insulin total) */
+"%@ U Total" = "%@ U Totales";
+
+/* Formats absorbed carb value */
+"%@ absorbed" = "%@ absorbidos";
+
+/* Description of the prediction input effect for glucose momentum */
+"15 min glucose regression coefficient (b₁), continued with decay over 30 min" = "Coeficiente de regresión de glucosa de 15 minutos (b₁), continuado con decadencia sobre 30 minutos.";
+
+/* Description of the prediction input effect for retrospective correction */
+"30 min comparison of glucose prediction vs actual, continued with decay over 60 min" = "Comparación de glucosa actual contra la predicha en 30 minutos, continuada con decadencia sobre 60 minutos.";
+
+/* Subtitle of Fiasp preset */
+"A model based on the published absorption of Fiasp insulin." = "Un modelo basado en la publicación de la absorción de insulina Fiasp.";
+
+/* Subtitle of Rapid-Acting – Adult preset */
+"A model based on the published absorption of Humalog, Novolog, and Apidra insulin in adults." = "Un modelo basado en la publicación de la absorción de insulina Humalog, Novolog y Apidra en adultos.";
+
+/* The title of the nightscout API secret credential */
+"API Secret" = "API secreto";
+
+/* Action to copy the recommended Bolus value to the actual Bolus Field */
+"AcceptRecommendedBolus" = "AceptarBoloRecomendado";
+
+/* The title of the Carbs On-Board graph */
+"Active Carbohydrates" = "Carbohidratos Activos";
+
+/* The string format describing active carbohydrates. (1: localized glucose value description) */
+"Active Carbohydrates: %@" = "Carbohidratos Activos: %@";
+
+/* The title of the Insulin On-Board graph */
+"Active Insulin" = "Insulina Activa";
+
+/* The string format describing active insulin. (1: localized insulin value description) */
+"Active Insulin: %@" = "Insulina Activa: %@";
+
+/* The title of the button to add the credentials for a service */
+"Add Account" = "Agregar Cuenta";
+
+/* The label of the carb entry button */
+"Add Meal" = "Agregar Alimento";
+
+/* The title of the section containing algorithm settings */
+"Algorithm Settings" = "Ajustes de Algoritmo";
+
+/* Instructions on selecting battery chemistry type */
+"Alkaline and Lithium batteries decay at differing rates. Alkaline tend to have a linear voltage drop over time whereas lithium cell batteries tend to maintain voltage until halfway through their lifespan. Under normal usage in a Non-MySentry compatible Minimed (x22/x15) insulin pump running Loop, Alkaline batteries last approximately 4 to 5 days. Lithium batteries last between 1-2 weeks. This selection will use different battery voltage decay rates for each of the battery chemistry types and alert the user when a battery is approximately 8 to 10 hours from failure." = "Las baterías alcalinas y de litio se degradan en ritmos distintos. La alcalinas tienden a tener una baja de voltaje linear en el tiempo mientras que las de litio tienden a mantener un voltaje hasta que pasan la mitad de su tiempo de vida. Bajo condiciones normales en una micro-infusora no compatible con MySentry ( x22/x15) siendo utilizado con Loop, las baterías alcalinas durarán aproximadamente de 4 a 5 días. Las baterías de litio durarán de una a dos semanas. Esta selección utilizará diferentes rangos de decadencia para el voltaje de cada una de las bataerías y alertará al usuario cuando la batería tenga aproximadamente de 8 a 10 horas restantes de vida.";
+
+/* Subtitle of Rapid-Acting – Children preset */
+"An adjustment to the adult model based on empirical effects in children." = "Un ajuste al modelo adulto basado en los efectos empíricos en niños.";
+
+/* The message displayed during a device authentication prompt for bolus specification */
+"Authenticate to Bolus %@ Units" = "Autentificar para Bolo";
+
+/* The title of the basal rate profile screen
+ The title text for the basal rate schedule */
+"Basal Rates" = "Perfil basal";
+
+/* The label of the bolus entry button
+ The notification title for a bolus failure */
+"Bolus" = "Bolo";
+
+/* The title of the cancel action in an action sheet */
+"Cancel" = "Cancelar";
+
+/* The title of the carb ratios schedule screen
+ The title text for the carb ratio schedule */
+"Carb Ratios" = "Relacíon de carbohidratos";
+
+/* Title of the prediction input effect for carbohydrates */
+"Carbohydrates" = "Carbohidratos";
+
+/* Description of the prediction input effect for carbohydrates. (1: The glucose unit string) */
+"Carbs Absorbed (g) ÷ Carb Ratio (g/U) × Insulin Sensitivity (%1$@/U)" = "Carbohidratos absorbidos (gr) ÷ Relación de Carbohidratos (gr/U) x Sensibilidad a Insulina (%1$@/U)";
+
+/* The notification alert describing a low pump battery */
+"Change the pump battery immediately" = "Cambie la batería de la microinfusora inmediatamente";
+
+/* The notification alert describing an empty pump reservoir */
+"Change the pump reservoir now" = "Cambie el reservorio de la microinfusora ahora";
+
+/* The title text for the looping enabled switch cell */
+"Closed Loop" = "Asa cerrada";
+
+/* The title of the configuration section in settings */
+"Configuration" = "Configuración";
+
+/* The title of the continuous glucose monitor section in settings */
+"Continuous Glucose Monitor" = "Monitor de glucosa continuo";
+
+/* The title of the glucose target range schedule screen
+ The title text for the glucose target range schedule */
+"Correction Range" = "Rango Correctivo";
+
+/* Message when offering bolus recommendation even though bg is below range. (1: glucose value) */
+"Current glucose of %1$@ is below correction range." = " Glucosa actual de %1$@ está por debajo del rango correctivo.";
+
+/* The title of the Loggly customer token credential */
+"Customer Token" = "Token de Usuario";
+
+/* The title of the mLab database name credential */
+"Database" = "Base de datos";
+
+/* The title of the button to remove the credentials for a service */
+"Delete Account" = "Eliminar Cuenta";
+
+/* The action hint of the workout mode toggle button when enabled */
+"Disables" = "Inhabilita";
+
+/* Title of the switch which toggles retrospective correction effects */
+"Enable Retrospective Correction" = "Habilitar corrección retrospectiva";
+
+/* The detail text describing an enabled setting */
+"Enabled" = "Habilita";
+
+/* The action hint of the workout mode toggle button when disabled */
+"Enables" = "Habilita";
+
+/* The placeholder text instructing users how to enter a maximum bolus */
+"Enter a number of units" = "Ingrese número de unidades";
+
+/* The placeholder text instructing users how to enter a maximum basal rate */
+"Enter a rate in units per hour" = "Ingrese relación de unidades por hora";
+
+/* The placeholder text instructing users to enter a suspend treshold */
+"Enter suspend threshold" = "Ingrese nivel de suspensión";
+
+/* The placeholder text instructing users how to enter a pump ID */
+"Enter the 6-digit pump ID" = "Ingrese ID de 6 dígitios de la microinfusora";
+
+/* The placeholder text instructing users how to enter a pump ID */
+"Enter the 6-digit transmitter ID" = "Ingrese ID de 6 dígitios de transmisor";
+
+/* Describing the pump history insulin data source */
+"Event History" = "Historia de eventos";
+
+/* The subtitle format describing eventual glucose. (1: localized glucose value description) */
+"Eventually %@" = "Eventualmente %@";
+
+/* The title of the alert describing a maximum bolus validation error */
+"Exceeds Maximum Bolus" = "Excede bolo máximo";
+
+/* Title of insulin model preset */
+"Fiasp" = "Fiasp";
+
+/* The format string used to describe a finite workout targets duration */
+"For %1$@" = "Por %1$@";
+
+/* The title text for the G4 Share Receiver switch cell */
+"G4 Share Receiver" = "Receptor G4 Share";
+
+/* The title text for the G5 Transmitter switch cell */
+"G5 Transmitter" = "Transmisor G5";
+
+/* The title of the glucose and prediction graph */
+"Glucose" = "Glucosa";
+
+/* Title of the prediction input effect for glucose momentum */
+"Glucose Momentum" = "Momenum de Glucosa";
+
+/* The error message when glucose data is too old to be used. (1: glucose data age in minutes) */
+"Glucose data is %1$@ old" = "Los datos de glucosa son %1$@ viejos";
+
+/* The title of a target alert action specifying an indefinitely long workout targets duration */
+"Indefinitely" = "Indefinidamente";
+
+/* Title of the prediction input effect for insulin */
+"Insulin" = "Insulina";
+
+/* Description of the prediction input effect for insulin */
+"Insulin Absorbed (U) × Insulin Sensitivity (%1$@/U)" = "Insulina Absorbida (U) x Sensibilidad a Insulina (%1$@/U)";
+
+/* The title of the insulin delivery graph */
+"Insulin Delivery" = "Administración de Insulina";
+
+/* The title text for the insulin model setting row */
+"Insulin Model" = "Modelo de Insulina";
+
+/* The title of the insulin sensitivities schedule screen
+ The title text for the insulin sensitivity schedule */
+"Insulin Sensitivities" = "Sensibilidades a Insulina";
+
+/* Instructions on selecting an insulin data source */
+"Insulin delivery can be determined from the pump by either interpreting the event history or comparing the reservoir volume over time. Reading event history allows for a more accurate status graph and uploading up-to-date treatment data to Nightscout, at the cost of faster pump battery drain and the possibility of a higher radio error rate compared to reading only reservoir volume. If the selected source cannot be used for any reason, the system will attempt to fall back to the other option." = "La entrega de insulina puede ser determinada por la microinfusora interpretando los eventos históricos o comparando el volúmen del reservorio sobre el tiempo. Leer los eventos históricos permite una gráfica de status mas exacta y permite subir tratamientos actualizados a Nightscout, con el costo de una menor duración de la batería y la posiblidad de mayores errores de radio comparado con leer solamente el volúmen del reservorio. Si la fuente seleccionada no puede utilizarse por algún motivo, el sistema intentará utilizar la otra opción.";
+
+/* The error message when invalid data was encountered. (1: details of invalid data) */
+"Invalid data: %1$@" = "Datos no válidos: %1$@";
+
+/* The title text for the issue report cell */
+"Issue Report" = "Informe de Errores";
+
+/* Format string describing retrospective glucose prediction comparison. (1: Previous glucose)(2: Predicted glucose)(3: Actual glucose) */
+"Last comparison: %1$@ → %2$@ vs %3$@" = "Última comparación: %1$@ → %2$@ vs %3$@";
+
+/* Glucose HUD accessibility hint */
+"Launches CGM app" = "Lanza app MCG";
+
+/* The loading message for the diagnostic report screen */
+"Loading..." = "Cargando...";
+
+/* The title of the loggly service */
+"Loggly" = "Loggly";
+
+/* The notification title for a loop failure */
+"Loop Failure" = "Falla de Loop";
+
+/* The notification alert describing a long-lasting loop failure. The substitution parameter is the time interval since the last loop */
+"Loop has not completed successfully in %@" = "Loop no ha terminado correctamente en %@";
+
+/* The description of a low G5 transmitter battery with a leading space */
+"Low Battery" = "Batería Baja";
+
+/* The title text for the maximum basal rate value */
+"Maximum Basal Rate" = "Perfil Basal Máximo";
+
+/* The title text for the maximum bolus value */
+"Maximum Bolus" = "Bolo Máximo";
+
+/* The error message for missing data. (1: missing data details) */
+"Missing data: %1$@" = "Faltan Datos: %1$@";
+
+/* Sensor state description for the non-valid state */
+"Needs Attention" = "Necesita Atención";
+
+/* The title of the Nightscout service */
+"Nightscout" = "Nightscout";
+
+/* The error message displayed for device connection errors. */
+"No connected devices, or failure during device connection" = "No hay dispositivos conectados o falla durante conexión de dispositivo";
+
+/* Sensor state description for the valid state */
+"OK" = "OK";
+
+/* Outside US share server option title */
+"Outside US" = "Fuera de EEUU";
+
+/* The title of the Dexcom share password credential */
+"Password" = "Contraseña";
+
+/* The label of the pre-meal mode toggle button */
+"Pre-Meal Targets" = "Objetivos Pre-Comida";
+
+/* Message when offering bolus recommendation even though bg is below range and minBG is in future. (1: glucose time)(2: glucose number) */
+"Predicted glucose at %1$@ is %2$@." = "Glucosa proyectada en %1$@ es %2$@.";
+
+/* Notice message when recommending bolus when BG is below the suspend threshold. (1: glucose value) */
+"Predicted glucose of %1$@ is below your suspend threshold setting." = "Glucosa prevista de %1$@ se encuentra por debajo de su nivel de suspensión.";
+
+/* The title text for the preferred insulin data source config */
+"Preferred Data Source" = "Fuente de datos preferida";
+
+/* The title of the pump section in settings */
+"Pump" = "Microinfusora";
+
+/* The notification title for a low pump battery */
+"Pump Battery Low" = "Batería de Microinfusora Baja";
+
+/* The title text for the battery type value */
+"Pump Battery Type" = "Tipo de Batería de Microinfusora";
+
+/* The title text for the pump ID config value */
+"Pump ID" = "ID de Microinfusora";
+
+/* The notification title for an empty pump reservoir */
+"Pump Reservoir Empty" = "Reservorio de Microinfusora Vacío";
+
+/* The notification title for a low pump reservoir */
+"Pump Reservoir Low" = "Reservorio de Microinfusora Bajo";
+
+/* The error message when pump data is too old to be used. (1: pump data age in minutes) */
+"Pump data is %1$@ old" = "Los datos de la microinfusora son %1$@ viejos";
+
+/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
+"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
+
+/* Title of insulin model preset */
+"Rapid-Acting – Adults" = "Acción Rápida — Adultos";
+
+/* Title of insulin model preset */
+"Rapid-Acting – Children" = "Acción Rápida — Niños";
+
+/* The error message when a recommendation has expired. (1: age of recommendation in minutes) */
+"Recommendation expired: %1$@ old" = "Recomendación expiró: %1$@ vieja";
+
+/* The title of the cell displaying a recommended temp basal value */
+"Recommended Basal" = "Basal Recomendada";
+
+/* Accessibility hint describing recommended bolus units */
+"Recommended Bolus: %@ Units" = "Bolo recomendado: %@ Unidades";
+
+/* The default placeholder string for a credential */
+"Required" = "Requerido";
+
+/* Describing the reservoir insulin data source */
+"Reservoir" = "Reservorio";
+
+/* Title of the prediction input effect for retrospective correction */
+"Retrospective Correction" = "Corrección Retrospectiva";
+
+/* The title of the notification action to retry a bolus command */
+"Retry" = "Reintentar";
+
+/* The description of sensor calibration state when sensor calibration is ok. */
+"Sensor calibration is OK" = "Calibración de sensor está OK";
+
+/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
+"Sensor is in unknown state %1$d" = "Estado desconocido de sensor %1$d";
+
+/* The description of sensor calibration state when sensor sensor is stopped. */
+"Sensor is stopped" = "Sensor se detuvo";
+
+/* The description of sensor calibration state when sensor sensor is warming up. */
+"Sensor is warming up" = "Preparación de sensor";
+
+/* The description of sensor calibration state when sensor needs calibration. */
+"Sensor needs calibration" = "Sensor requiere calibración";
+
+/* The title of the Dexcom share server URL credential */
+"Server" = "Servidor";
+
+/* The title of the services section in settings */
+"Services" = "Servicios";
+
+/* The label of the settings button */
+"Settings" = "Ajustes";
+
+/* Loop Completion HUD accessibility hint */
+"Shows last loop error" = "Muestra último error de Loop";
+
+/* The title of the nightscout site URL credential */
+"Site URL" = "URL de Sitio";
+
+/* The title text for the Medtronic sensor switch cell */
+"Sof-Sensor / Enlite" = "Sof-Sensor / Enlite";
+
+/* The title of the cell indicating a bolus is being sent */
+"Starting Bolus" = "Bolo Inicial";
+
+/* The title text in settings */
+"Suspend Threshold" = "Nivel de Suspensión";
+
+/* The empty-state text for a configuration value */
+"Tap to set" = "Toca para definir";
+
+/* Subtitle description of Walsh insulin model setting */
+"The legacy model used by Loop, allowing customization of action duration." = "El model utilizado por ediciones iniciales de Loop, permite ajustar duración de acción.";
+
+/* Body of the alert describing a maximum bolus validation error. (1: The localized max bolus value) */
+"The maximum bolus amount is %@ Units" = "Bolo máximo es %@ Unidades";
+
+/* Instructions on where to find the pump ID on a Minimed pump */
+"The pump ID can be found printed on the back, or near the bottom of the STATUS/Esc screen. It is the strictly numerical portion of the serial number (shown as SN or S/N)." = "El ID de microinfusora puede encontrarse en la parte trasera o cerca de la parte inferior de la pantalla STATUS/Esc. Es la parte estrictamente numérica del número de serie mostrado como SN o S/N";
+
+/* Instructions on selecting the pump region */
+"The pump region can be found printed on the back as part of the model number (REF), for example: MMT-551NAB, or MMT-515LWWS. If the model number contains \"NA\" or \"CA\", then the region is North America. If if contains \"WW\", then the region is World-Wide." = "La región de la microinfusora puede enconstrarse impresa en la parte trasera como parte del código de modelo ( REF ), por ejemplo MMT-551NAB o MMT-515LWWS. Si el código de modelo contiene \"NA\" o \"CA\", la región es Norte América. Si contiene \"WW\" la región es Mundial.";
+
+/* Instructions on where to find the transmitter ID */
+"The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the G5 receiver and mobile app." = "El ID de transmisor puede encontrarse impreso en la parte trasera del dispositivo, a un lado de la caja en la que estaba empacado y dentro del menú de ajustes del receptor G5 y la app móvil";
+
+/* The description of the switch which toggles retrospective correction effects */
+"This will more aggresively increase or decrease basal delivery when glucose movement doesn't match the carbohydrate and insulin-based model." = "Esto incrementará o decrementará mas agresivamente la entrega de basales cuando el movimiento de glucosa no concuerde con el modelo de insulina y carbohidratos.";
+
+/* The title text for the Dexcom G5 transmitter ID config value */
+"Transmitter ID" = "ID de Transmisor";
+
+/* The unit string for units per hour */
+"U/hour" = "U/hora";
+
+/* U.S. share server option title */
+"US" = "EEUU";
+
+/* The unit string for units */
+"Units" = "Unidades";
+
+/* The title of the alert controller used to select a duration for workout targets */
+"Use Workout Glucose Targets" = "Utilice Objetivos de Glucosa de Ejercicio";
+
+/* The title of the Dexcom share username credential */
+"Username" = "Usuario";
+
+/* Label indicating validation is occurring */
+"Verifying" = "Verificando";
+
+/* Title of insulin model setting */
+"Walsh" = "Walsh";
+
+/* Explanation of suspend threshold */
+"When current or forecasted glucose is below the suspend threshold, Loop will not recommend a bolus, and will always recommend a temporary basal rate of 0 units per hour." = "Cuando la glucosa actual o proyectada se encuentre debajo del nivel de suspensión, Loop no recomendará un bolo y siempre recomendará un basal temporal de 0 unidades por hora.";
+
+/* The label of the workout mode toggle button */
+"Workout Targets" = "Objetivos de Ejercicio";
+
+/* Format fragment for a specific time */
+"at %@" = "a %@";
+
+/* The placeholder text for the nightscout site URL credential */
+"https://mysite.azurewebsites.net" = "https://mysite.azurewebsites.net";
+
+/* The title of the mLab service */
+"mLab" = "mLab";
+
+/* The unit display string for millimoles of glucose per liter */
+"mmol/L" = "mmol/L";
+
+/* Format fragment for a start time */
+"since %@" = "desde %@";
+
diff --git a/Loop/es.lproj/Main.strings b/Loop/es.lproj/Main.strings
new file mode 100644
index 0000000000..0bcb633721
--- /dev/null
+++ b/Loop/es.lproj/Main.strings
@@ -0,0 +1,144 @@
+/* Class = "UINavigationItem"; title = "Status"; ObjectID = "3kU-n2-fha"; */
+"3kU-n2-fha.title" = "Estatus";
+
+/* Class = "UILabel"; text = "Pump ID"; ObjectID = "5TX-kX-nBo"; */
+"5TX-kX-nBo.text" = "ID de Microinfusora";
+
+/* Class = "UILabel"; text = "3.5 U/hour @ 12:12 PM"; ObjectID = "5gz-kZ-iF1"; */
+"5gz-kZ-iF1.text" = "3.5 U/hora @ 12:12 PM";
+
+/* Class = "UILabel"; text = "Bolus"; ObjectID = "5oA-6d-ZTL"; */
+"5oA-6d-ZTL.text" = "Bolo";
+
+/* Class = "UITextField"; accessibilityLabel = "Bolus Amount"; ObjectID = "7LT-50-ZzK"; */
+"7LT-50-ZzK.accessibilityLabel" = "Cantidad de Bolo";
+
+/* Class = "UITextField"; placeholder = "0.0"; ObjectID = "7LT-50-ZzK"; */
+"7LT-50-ZzK.placeholder" = "0.0";
+
+/* Class = "UILabel"; text = "Predicted"; ObjectID = "87H-N1-0vJ"; */
+"87H-N1-0vJ.text" = "Proyectada";
+
+/* Class = "UILabel"; accessibilityLabel = "Units"; ObjectID = "BR0-dr-Fj2"; */
+"BR0-dr-Fj2.accessibilityLabel" = "Unidades";
+
+/* Class = "UILabel"; text = "U"; ObjectID = "BR0-dr-Fj2"; */
+"BR0-dr-Fj2.text" = "U";
+
+/* Class = "UILabel"; text = "Future glucose is predicted by combining the effects of multiple inputs. Use this tool to toggle various inputs to see how they compare to the final prediction."; ObjectID = "D4C-I2-dhA"; */
+"D4C-I2-dhA.text" = "La glucosa futura se predice combinando los efectos de diversas entradada de datos. Utiliza esta herramienta para cambiar datos de entrada y ver como varía la predicción final.";
+
+/* Class = "UILabel"; text = "DEVICES"; ObjectID = "DyC-Sv-qP8"; */
+"DyC-Sv-qP8.text" = "DISPOSITIVOS";
+
+/* Class = "UILabel"; text = "eventually 92 mg/dL"; ObjectID = "E41-FN-nkk"; */
+"E41-FN-nkk.text" = "eventualmente 92 mg/dL";
+
+/* Class = "UILabel"; text = "Observed"; ObjectID = "EAn-Ja-S1d"; */
+"EAn-Ja-S1d.text" = "Observado";
+
+/* Class = "UILabel"; text = "Observed changes in glucose, subtracting changes modeled from insulin delivery, can be used to estimate carbohydrate absorption."; ObjectID = "IxU-As-glo"; */
+"IxU-As-glo.text" = "Los cambios observados en glucosa sustrayendo los cambios modelados para la entrega de insulina pueden ser utilizados para estimar la absorción de carbohidratos.";
+
+/* Class = "UILabel"; text = "Detail"; ObjectID = "J7x-W5-gwo"; */
+"J7x-W5-gwo.text" = "Detalle";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Krd-Aa-ret"; */
+"Krd-Aa-ret.text" = "Etiqueta";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "OFA-qT-ZAg"; */
+"OFA-qT-ZAg.text" = "Etiqueta";
+
+/* Class = "UITableViewController"; title = "Predicted Glucose"; ObjectID = "PA3-sP-cWY"; */
+"PA3-sP-cWY.title" = "Glucosa Proyectada";
+
+/* Class = "UILabel"; text = "An insulin activity model is used to estimate effects of insulin on glucose levels. An accurate model can help prevent insulin stacking and safely recommend corrective treatments."; ObjectID = "PJv-p9-cFe"; */
+"PJv-p9-cFe.text" = "Un modelo de actividad de insulin se utiliza para calcular los efectos de ésta en los niveles glucémicos. La precision del modelo puede ayudar a prevenir la acumulación de insulina y a hacer recomendaciones de tratamientos de corrección más seguros.";
+
+/* Class = "UILabel"; text = "eventually 92 mg/dL"; ObjectID = "Rse-x8-amW"; */
+"Rse-x8-amW.text" = "eventualmente 92 mg/dL";
+
+/* Class = "UILabel"; text = "g COB"; ObjectID = "SQx-au-ZcM"; */
+"SQx-au-ZcM.text" = "gr CAB";
+
+/* Class = "UINavigationItem"; title = "Carbohydrates"; ObjectID = "Vpi-5b-bY5"; */
+"Vpi-5b-bY5.title" = "Carbohidratos";
+
+/* Class = "UITextField"; text = "4 hour"; ObjectID = "Wk3-xv-IM5"; */
+"Wk3-xv-IM5.text" = "4 horas";
+
+/* Class = "UIButton"; normalTitle = "Deliver"; ObjectID = "Ya0-9b-ZAS"; */
+"Ya0-9b-ZAS.normalTitle" = "Administración";
+
+/* Class = "UILabel"; text = "Detail"; ObjectID = "aCb-Qs-bpu"; */
+"aCb-Qs-bpu.text" = "Detalle";
+
+/* Class = "UINavigationItem"; title = "Bolus"; ObjectID = "aiu-ZA-zVa"; */
+"aiu-ZA-zVa.title" = "Bolo";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "bIL-Ub-qYp"; */
+"bIL-Ub-qYp.text" = "Etiqueta";
+
+/* Class = "UILabel"; text = "Glucose Change"; ObjectID = "bq4-98-cQU"; */
+"bq4-98-cQU.text" = "Cambio de Glucosa";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "cpo-Po-gFM"; */
+"cpo-Po-gFM.text" = "Etiqueta";
+
+/* Class = "UILabel"; text = "g Total"; ObjectID = "d3X-AN-tA5"; */
+"d3X-AN-tA5.text" = "gr Totales";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "d6m-qV-wWi"; */
+"d6m-qV-wWi.text" = "Etiqueta";
+
+/* Class = "UINavigationItem"; title = "Settings"; ObjectID = "dmB-PQ-B44"; */
+"dmB-PQ-B44.title" = "Ajustes";
+
+/* Class = "UILabel"; text = "Active Carbohydrates: 40g"; ObjectID = "hHZ-uY-aKw"; */
+"hHZ-uY-aKw.text" = "Carbohidratos Activos: 40gr";
+
+/* Class = "UITableViewController"; title = "Carbohydrate Effects"; ObjectID = "hZZ-2S-lrd"; */
+"hZZ-2S-lrd.title" = "Efecto de Carbohidratos";
+
+/* Class = "UILabel"; text = "⚠ Glucose Predicted Below Range"; ObjectID = "k0g-P7-OVN"; */
+"k0g-P7-OVN.text" = "⚠ Glucosa Proyectada Por Debajo Del Rango.";
+
+/* Class = "UILabel"; text = "Recommended Basal"; ObjectID = "k3F-Na-7mn"; */
+"k3F-Na-7mn.text" = "Basal Recomendada";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "l7l-mw-Oc9"; */
+"l7l-mw-Oc9.text" = "Etiqueta";
+
+/* Class = "UILabel"; text = "Tap to set"; ObjectID = "m9c-SQ-djE"; */
+"m9c-SQ-djE.text" = "Toca para definir";
+
+/* Class = "UILabel"; accessibilityLabel = "Units"; ObjectID = "mVz-dr-xLU"; */
+"mVz-dr-xLU.accessibilityLabel" = "Unidades";
+
+/* Class = "UILabel"; text = "U"; ObjectID = "mVz-dr-xLU"; */
+"mVz-dr-xLU.text" = "U";
+
+/* Class = "UITableViewController"; title = "Insulin Model"; ObjectID = "pi6-Dh-72V"; */
+"pi6-Dh-72V.title" = "Modelo de Insulina";
+
+/* Class = "UILabel"; text = "Glucose"; ObjectID = "tuw-av-A3x"; */
+"tuw-av-A3x.text" = "Glucosa";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "ufi-Kj-33k"; */
+"ufi-Kj-33k.text" = "Etiqueta";
+
+/* Class = "UILabel"; text = "Active Insulin: 1.5U"; ObjectID = "viU-7a-kbI"; */
+"viU-7a-kbI.text" = "Insulina Activa: 1.5U";
+
+/* Class = "UILabel"; text = "0"; ObjectID = "yn7-2M-jZz"; */
+"yn7-2M-jZz.text" = "0";
+
+/* Class = "UILabel"; text = "Recommended"; ObjectID = "ywT-OR-NnU"; */
+"ywT-OR-NnU.text" = "Recomendado";
+
+/* Class = "UILabel"; text = "Title"; ObjectID = "zbc-87-wxZ"; */
+"zbc-87-wxZ.text" = "Título";
+
+/* Class = "UILabel"; text = "0"; ObjectID = "zvZ-uf-zMX"; */
+"zvZ-uf-zMX.text" = "0";
+
diff --git a/Loop/ru.lproj/InfoPlist.strings b/Loop/ru.lproj/InfoPlist.strings
new file mode 100644
index 0000000000..8c1ec56692
--- /dev/null
+++ b/Loop/ru.lproj/InfoPlist.strings
@@ -0,0 +1,15 @@
+/* (No Comment) */
+"CFBundleDisplayName" = "Loop";
+
+/* (No Comment) */
+"CFBundleName" = "$(PRODUCT_NAME)";
+
+/* (No Comment) */
+"NSBluetoothPeripheralUsageDescription" = "Блутус применяется для коммуникации с инсулиновой помпой и устройствами непрерывного мониторинга СК";
+
+/* (No Comment) */
+"NSHealthShareUsageDescription" = "Данные о пище из базы данных Здоровье используются для определения влияния на гликемию. Данные гликемии из базы данных Здоровье используются для графического отображения и вычисления скорости изменений";
+
+/* (No Comment) */
+"NSHealthUpdateUsageDescription" = "Данные об углеводах в приложении и на смарт-часах хранятся в базе данных Здоровье. Данные о гликемии полученные от систем непрерывного мониторинга хранятся в безопасности в Комплексе Здоровья HealthKit ";
+
diff --git a/Loop/ru.lproj/LaunchScreen.strings b/Loop/ru.lproj/LaunchScreen.strings
new file mode 100644
index 0000000000..874e8a4532
--- /dev/null
+++ b/Loop/ru.lproj/LaunchScreen.strings
@@ -0,0 +1 @@
+/* No Localized Strings */
diff --git a/Loop/ru.lproj/Localizable.strings b/Loop/ru.lproj/Localizable.strings
new file mode 100644
index 0000000000..dde228ab29
--- /dev/null
+++ b/Loop/ru.lproj/Localizable.strings
@@ -0,0 +1,451 @@
+/* The string format appended to active insulin that describes pending insulin. (1: pending insulin) */
+" (pending: %@)" = "(В ожидании: %@)";
+
+/* Format string for current suspend threshold. (1: value)(2: bg unit) */
+"%1$@ %2$@" = "%1$@ %2$@";
+
+/* Format string for carb ratio average. (1: value)(2: carb unit)
+ Format string for insulin sensitivity average (1: value)(2: glucose unit) */
+"%1$@ %2$@/U" = "%1$@ %2$@/ед";
+
+/* Formats (1: carb start time) and (2: carb absorption duration) */
+"%1$@ + %2$@" = "%1$@ + %2$@";
+
+/* Low reservoir alert format string. (1: Number of units remaining) */
+"%1$@ U left" = "%1$@ Осталось ед";
+
+/* Low reservoir alert with time remaining format string. (1: Number of units remaining)(2: approximate time remaining) */
+"%1$@ U left: %2$@" = "%1$@ Осталось ед: %2$@ ";
+
+/* The format for recommended temp basal rate and time. (1: localized rate number)(2: localized time) */
+"%1$@ U/hour @ %2$@" = "%1$@ ед/час @ %2$@";
+
+/* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
+"%1$@ v%2$@" = "%1$@ v%2$@";
+
+/* Format string for glucose target range. (1: Min target)(2: Max target)(3: glucose unit) */
+"%1$@ – %2$@ %3$@" = "%1$@ – %2$@ %3$@";
+
+/* Format string describing glucose units per minute (1: glucose unit string) */
+"%1$@/min" = "%1$@/минут";
+
+/* Formats (1: carb value) and (2: food type) */
+"%1$@: %2$@" = "%1$@: %2$@";
+
+/* The subtitle format describing total insulin. (1: localized insulin total) */
+"%@ U Total" = "%@ всего ед";
+
+/* Formats absorbed carb value */
+"%@ absorbed" = "%@ усвоено";
+
+/* Description of the prediction input effect for glucose momentum */
+"15 min glucose regression coefficient (b₁), continued with decay over 30 min" = "15-мин коэффициент регрессии гликемии (b1), продолжен с угасанием 30 мин";
+
+/* Description of the prediction input effect for retrospective correction */
+"30 min comparison of glucose prediction vs actual, continued with decay over 60 min" = "30 мин сравнение предсказанной гликемии с действительной, продолжено с угасанием 60 мин";
+
+/* Subtitle of Fiasp preset */
+"A model based on the published absorption of Fiasp insulin." = "модель, основанная на опубликованных данных усвоения FIASP инсулина ";
+
+/* Subtitle of Rapid-Acting – Adult preset */
+"A model based on the published absorption of Humalog, Novolog, and Apidra insulin in adults." = "модель, основанная на опубликованных данных усвоения Humalog, Novolog и Apidra у взрослых ";
+
+/* The title of the amplitude API key credential
+ The title of the mLab API Key credential */
+"API Key" = "API Key";
+
+/* The title of the nightscout API secret credential */
+"API Secret" = "API Secret";
+
+/* Action to copy the recommended Bolus value to the actual Bolus Field */
+"AcceptRecommendedBolus" = "Принятьрекомендуемыйболюс";
+
+/* The title of the Carbs On-Board graph */
+"Active Carbohydrates" = "Действующие углеводы";
+
+/* The string format describing active carbohydrates. (1: localized glucose value description) */
+"Active Carbohydrates: %@" = "Действующие углеводы: %@";
+
+/* The title of the Insulin On-Board graph */
+"Active Insulin" = "Действующий инсулин";
+
+/* The string format describing active insulin. (1: localized insulin value description) */
+"Active Insulin: %@" = "Действующий инсулин: %@";
+
+/* The title of the button to add the credentials for a service */
+"Add Account" = "Добавить пользователя";
+
+/* The label of the carb entry button */
+"Add Meal" = "Добавить продукт";
+
+/* The title of the section containing algorithm settings */
+"Algorithm Settings" = "Настройки алгоритма";
+
+/* Instructions on selecting battery chemistry type */
+"Alkaline and Lithium batteries decay at differing rates. Alkaline tend to have a linear voltage drop over time whereas lithium cell batteries tend to maintain voltage until halfway through their lifespan. Under normal usage in a Non-MySentry compatible Minimed (x22/x15) insulin pump running Loop, Alkaline batteries last approximately 4 to 5 days. Lithium batteries last between 1-2 weeks. This selection will use different battery voltage decay rates for each of the battery chemistry types and alert the user when a battery is approximately 8 to 10 hours from failure." = "Щелочные и литиевые батарейки садятся с различной скоростью. У щелочных падение линейное, в то время как литиевые сохраняют напряжение в течение половины срока службы. При нормальном пользовании в помпе Minimed без Mysentry (x22/x15) с применением алгоритма ИПЖ щелочные батарейки служат примерно от 4 до 5 дней. Литиевые служат от 1 до 2 недель. Эта настройка будет использовать разную скорость падения напряжения батареек в зависимости от их химического типа и предупреждать пользователя за 8-10 часов до отказа ";
+
+/* The title of the Amplitude service */
+"Amplitude" = "Amplitude";
+
+/* Subtitle of Rapid-Acting – Children preset */
+"An adjustment to the adult model based on empirical effects in children." = "Поправка к модели для взрослых основанная на эмпирических данных для детей";
+
+/* The message displayed during a device authentication prompt for bolus specification */
+"Authenticate to Bolus %@ Units" = "Подтверждение болюса %@ ед";
+
+/* The title of the basal rate profile screen
+ The title text for the basal rate schedule */
+"Basal Rates" = "Скорости базала";
+
+/* The label of the bolus entry button
+ The notification title for a bolus failure */
+"Bolus" = "Болюс";
+
+/* The title of the cancel action in an action sheet */
+"Cancel" = "Отмена";
+
+/* The title of the carb ratios schedule screen
+ The title text for the carb ratio schedule */
+"Carb Ratios" = "Соотношения углеводов";
+
+/* Title of the prediction input effect for carbohydrates */
+"Carbohydrates" = "Углеводы";
+
+/* Description of the prediction input effect for carbohydrates. (1: The glucose unit string) */
+"Carbs Absorbed (g) ÷ Carb Ratio (g/U) × Insulin Sensitivity (%1$@/U)" = "Усвоенные углеводы (г) : соотношение углеводов (гр/ед)х чувствительность к инсулину";
+
+/* The notification alert describing a low pump battery */
+"Change the pump battery immediately" = "Замените батарею помпы немедленно";
+
+/* The notification alert describing an empty pump reservoir */
+"Change the pump reservoir now" = "Замените резервуар помпы сейчас";
+
+/* The title text for the looping enabled switch cell */
+"Closed Loop" = "Замкнутый цикл";
+
+/* The title of the configuration section in settings */
+"Configuration" = "Конфигурация";
+
+/* The error message displayed for configuration errors. (1: configuration error details) */
+"Configuration Error: %1$@" = "Ошибка конфигурации: %1$@";
+
+/* The title of the continuous glucose monitor section in settings */
+"Continuous Glucose Monitor" = "Непрерывный мониторинг гликемии";
+
+/* The title of the glucose target range schedule screen
+ The title text for the glucose target range schedule */
+"Correction Range" = "Диапазон коррекции";
+
+/* Message when offering bolus recommendation even though bg is below range. (1: glucose value) */
+"Current glucose of %1$@ is below correction range." = "Гликемия %1$@ ниже диапазона коррекции";
+
+/* The title of the Loggly customer token credential */
+"Customer Token" = "Жетон пользователя";
+
+/* The title of the mLab database name credential */
+"Database" = "База данных";
+
+/* The title of the button to remove the credentials for a service */
+"Delete Account" = "Удалить аккаунт";
+
+/* The title of the Dexcom Share service */
+"Dexcom Share" = "Декском Шеар";
+
+/* The action hint of the workout mode toggle button when enabled */
+"Disables" = "Деактивирует";
+
+/* Title of the switch which toggles retrospective correction effects */
+"Enable Retrospective Correction" = "Активирует ретроспективную коррекцию";
+
+/* The detail text describing an enabled setting */
+"Enabled" = "Активировано";
+
+/* The action hint of the workout mode toggle button when disabled */
+"Enables" = "Активирует";
+
+/* The placeholder text instructing users how to enter a maximum bolus */
+"Enter a number of units" = "Введите кол-во единиц";
+
+/* The placeholder text instructing users how to enter a maximum basal rate */
+"Enter a rate in units per hour" = "Введите скорость в единицах в час";
+
+/* The placeholder text instructing users to enter a suspend treshold */
+"Enter suspend threshold" = "Введите рубеж приостановки";
+
+/* The placeholder text instructing users how to enter a pump ID */
+"Enter the 6-digit pump ID" = "Введите инд номер помпы (6 цифр)";
+
+/* The placeholder text instructing users how to enter a pump ID */
+"Enter the 6-digit transmitter ID" = "Введите инд. номер трансмиттера (6 цифр)";
+
+/* Describing the pump history insulin data source */
+"Event History" = "История событий";
+
+/* The subtitle format describing eventual glucose. (1: localized glucose value description) */
+"Eventually %@" = "В конечном итоге %@";
+
+/* The title of the alert describing a maximum bolus validation error */
+"Exceeds Maximum Bolus" = "Превышает макс болюс";
+
+/* Title of insulin model preset */
+"Fiasp" = "Fiasp";
+
+/* The format string used to describe a finite workout targets duration */
+"For %1$@" = "В течение %1$@";
+
+/* The title text for the G4 Share Receiver switch cell */
+"G4 Share Receiver" = "Ресивер G4 Шеар";
+
+/* The title text for the G5 Transmitter switch cell */
+"G5 Transmitter" = "Трансмиттер G5";
+
+/* The title of the glucose and prediction graph */
+"Glucose" = "Гликемия";
+
+/* Title of the prediction input effect for glucose momentum */
+"Glucose Momentum" = "Динамика гликемии";
+
+/* The error message when glucose data is too old to be used. (1: glucose data age in minutes) */
+"Glucose data is %1$@ old" = "Данным гликемии %1$@";
+
+/* The title of a target alert action specifying an indefinitely long workout targets duration */
+"Indefinitely" = "На неопределенное время";
+
+/* Title of the prediction input effect for insulin */
+"Insulin" = "Инсулин";
+
+/* Description of the prediction input effect for insulin */
+"Insulin Absorbed (U) × Insulin Sensitivity (%1$@/U)" = "Инсулин усвоен х чувствительность к инсулину";
+
+/* The title of the insulin delivery graph */
+"Insulin Delivery" = "Подача инсулина";
+
+/* The title text for the insulin model setting row */
+"Insulin Model" = "Модель инсулина";
+
+/* The title of the insulin sensitivities schedule screen
+ The title text for the insulin sensitivity schedule */
+"Insulin Sensitivities" = "Факторы чувствительности инсулина";
+
+/* Instructions on selecting an insulin data source */
+"Insulin delivery can be determined from the pump by either interpreting the event history or comparing the reservoir volume over time. Reading event history allows for a more accurate status graph and uploading up-to-date treatment data to Nightscout, at the cost of faster pump battery drain and the possibility of a higher radio error rate compared to reading only reservoir volume. If the selected source cannot be used for any reason, the system will attempt to fall back to the other option." = "Подача инсулина может определяться с помпы путем интерпретации истории событий или сравнением изменения объемов резервуара за прошедшее время. Чтение истории событий позволяет вычертить более точный график состояния и загрузить в Nightscout актуальные данные лечения/назначений (за счет более быстрого истощения батареи помпы и более высокого процента ошибок радиосвязи) по сравнению со считыванием данных только об объеме резервуара.";
+
+/* The error message when invalid data was encountered. (1: details of invalid data) */
+"Invalid data: %1$@" = "Неверные данные: %1$@";
+
+/* The title text for the issue report cell */
+"Issue Report" = "Сообщить об ошибе";
+
+/* Format string describing retrospective glucose prediction comparison. (1: Previous glucose)(2: Predicted glucose)(3: Actual glucose) */
+"Last comparison: %1$@ → %2$@ vs %3$@" = "Недавнее сравнение %1$@ → %2$@ и %3$@";
+
+/* Glucose HUD accessibility hint */
+"Launches CGM app" = "Запускает приложение непрерывного мониторинга CGM";
+
+/* The loading message for the diagnostic report screen */
+"Loading..." = "Загрузка...";
+
+/* The title of the loggly service */
+"Loggly" = "Loggly";
+
+/* The notification title for a loop failure */
+"Loop Failure" = "Ошибка в работе цикла/контура";
+
+/* The notification alert describing a long-lasting loop failure. The substitution parameter is the time interval since the last loop */
+"Loop has not completed successfully in %@" = "Ну удалось успешно замкнуть цикл/контур в %@";
+
+/* The description of a low G5 transmitter battery with a leading space */
+"Low Battery" = "Низкий заряд батареи";
+
+/* The title text for the maximum basal rate value */
+"Maximum Basal Rate" = "Максимальная скорость подачи базала";
+
+/* The title text for the maximum bolus value */
+"Maximum Bolus" = "Максимальный болюс";
+
+/* The error message for missing data. (1: missing data details) */
+"Missing data: %1$@" = "Пропущены данные: %1$@";
+
+/* Sensor state description for the non-valid state */
+"Needs Attention" = "Требует внимания";
+
+/* The title of the Nightscout service */
+"Nightscout" = "Nightscout";
+
+/* The error message displayed for device connection errors. */
+"No connected devices, or failure during device connection" = "Устройства не сопряжены или ошибка во время сопряжения";
+
+/* Sensor state description for the valid state */
+"OK" = "OK";
+
+/* Outside US share server option title */
+"Outside US" = "за пределами США";
+
+/* The title of the Dexcom share password credential */
+"Password" = "Пароль";
+
+/* The label of the pre-meal mode toggle button */
+"Pre-Meal Targets" = "Целевые значения до приема пищи";
+
+/* Message when offering bolus recommendation even though bg is below range and minBG is in future. (1: glucose time)(2: glucose number) */
+"Predicted glucose at %1$@ is %2$@." = "Предсказываемая гликемия в %1$@ -- %2$@";
+
+/* Notice message when recommending bolus when BG is below the suspend threshold. (1: glucose value) */
+"Predicted glucose of %1$@ is below your suspend threshold setting." = "Предсказываемая гликемия %1$@ ниже ваших настроек порога приостановки помпы";
+
+/* The title text for the preferred insulin data source config */
+"Preferred Data Source" = "Предпочтительный источник данных";
+
+/* The title of the pump section in settings */
+"Pump" = "Помпа";
+
+/* The notification title for a low pump battery */
+"Pump Battery Low" = "Низкий заряд батареи помпы";
+
+/* The title text for the battery type value */
+"Pump Battery Type" = "Тип батареи помпы";
+
+/* The title text for the pump ID config value */
+"Pump ID" = "Инд номер помпы";
+
+/* The notification title for an empty pump reservoir */
+"Pump Reservoir Empty" = "Резервуар помпы пуст";
+
+/* The notification title for a low pump reservoir */
+"Pump Reservoir Low" = "Низкий уровень резервуара помпы";
+
+/* The error message when pump data is too old to be used. (1: pump data age in minutes) */
+"Pump data is %1$@ old" = "Данные помпы от %1$@ ";
+
+/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
+"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
+
+/* Title of insulin model preset */
+"Rapid-Acting – Adults" = "Боыстродействующий - взрослые";
+
+/* Title of insulin model preset */
+"Rapid-Acting – Children" = "Быстродействующий - дети";
+
+/* The error message when a recommendation has expired. (1: age of recommendation in minutes) */
+"Recommendation expired: %1$@ old" = "Рекомнендация истекла : от %1$@";
+
+/* The title of the cell displaying a recommended temp basal value */
+"Recommended Basal" = "Рекомендуемый базал";
+
+/* Accessibility hint describing recommended bolus units */
+"Recommended Bolus: %@ Units" = "Рекомендуемый болюс: %@ ед";
+
+/* The default placeholder string for a credential */
+"Required" = "обязательный";
+
+/* Describing the reservoir insulin data source */
+"Reservoir" = "Резервуар";
+
+/* Title of the prediction input effect for retrospective correction */
+"Retrospective Correction" = "Ретроспективная коррекция";
+
+/* The title of the notification action to retry a bolus command */
+"Retry" = "Повторить попытку";
+
+/* The description of sensor calibration state when sensor calibration is ok. */
+"Sensor calibration is OK" = "Калибровка сенсора ОК";
+
+/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
+"Sensor is in unknown state %1$d" = "Состояние сенсора неизвестно %1$d";
+
+/* The description of sensor calibration state when sensor sensor is stopped. */
+"Sensor is stopped" = "Сенсор остановлен";
+
+/* The description of sensor calibration state when sensor sensor is warming up. */
+"Sensor is warming up" = "Сенсор прогревается";
+
+/* The description of sensor calibration state when sensor needs calibration. */
+"Sensor needs calibration" = "Сенсор требует калибровки";
+
+/* The title of the Dexcom share server URL credential */
+"Server" = "Сервер";
+
+/* The title of the services section in settings */
+"Services" = "Службы";
+
+/* The label of the settings button */
+"Settings" = "Настройки";
+
+/* Loop Completion HUD accessibility hint */
+"Shows last loop error" = "Показывает крайнюю ошибку помпы";
+
+/* The title of the nightscout site URL credential */
+"Site URL" = "URL сайта";
+
+/* The title text for the Medtronic sensor switch cell */
+"Sof-Sensor / Enlite" = "Sof-Sensor/Enlite";
+
+/* The title of the cell indicating a bolus is being sent */
+"Starting Bolus" = "Начинаю болюс";
+
+/* The title text in settings */
+"Suspend Threshold" = "Порог приостановки";
+
+/* The empty-state text for a configuration value */
+"Tap to set" = "Щелкнуть чтобы задать";
+
+/* Subtitle description of Walsh insulin model setting */
+"The legacy model used by Loop, allowing customization of action duration." = "Модель, используемая для цикла/контура, позволяет настройку длительности действия";
+
+/* Body of the alert describing a maximum bolus validation error. (1: The localized max bolus value) */
+"The maximum bolus amount is %@ Units" = "максимальный болюс %@ ед";
+
+/* Instructions on where to find the pump ID on a Minimed pump */
+"The pump ID can be found printed on the back, or near the bottom of the STATUS/Esc screen. It is the strictly numerical portion of the serial number (shown as SN or S/N)." = "инд номер помпы находится на ее задней стенке или снизу экрана состояния STATUS/ESC. Это исключительно цифровая часть серийного номера (обозначаемого SN или S/N) ";
+
+/* Instructions on where to find the transmitter ID */
+"The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the G5 receiver and mobile app." = "Инд. номер трансмиттера находится на задней стенке устройства , сбоку упаковочной коробки, в настроечном меню ресивера G5 и мобильного приложения";
+
+/* The description of the switch which toggles retrospective correction effects */
+"This will more aggresively increase or decrease basal delivery when glucose movement doesn't match the carbohydrate and insulin-based model." = "Это более радикально понизит или увеличит подачу базала в тех случаях когда динамика гликемии не соответствует моделям основанным на углеводах и инсулине";
+
+/* The title text for the Dexcom G5 transmitter ID config value */
+"Transmitter ID" = "Инд № трансмиттера";
+
+/* The unit string for units per hour */
+"U/hour" = "Ед/час";
+
+/* U.S. share server option title */
+"US" = "США";
+
+/* The unit string for units */
+"Units" = "Ед";
+
+/* The title of the alert controller used to select a duration for workout targets */
+"Use Workout Glucose Targets" = "Применить цели гликемии как для физической нагрузки";
+
+/* The title of the Dexcom share username credential */
+"Username" = "Имя пользователя";
+
+/* Label indicating validation is occurring */
+"Verifying" = "Верифицируется";
+
+/* Title of insulin model setting */
+"Walsh" = "Walsh";
+
+/* Explanation of suspend threshold */
+"When current or forecasted glucose is below the suspend threshold, Loop will not recommend a bolus, and will always recommend a temporary basal rate of 0 units per hour." = "Если текущая или предсказываемая гликемия ниже порога приостановки помпы, алгоритм цикла ипж не рекомендует болюс и всегда рекомендует временный базал 0 ед/час";
+
+/* The label of the workout mode toggle button */
+"Workout Targets" = "Целевые значения при физической нагрузке";
+
+/* Format fragment for a specific time */
+"at %@" = "В %@";
+
+/* The placeholder text for the nightscout site URL credential */
+"https://mysite.azurewebsites.net" = "https://мойсайт. azurewebsites.net";
+
+/* The title of the mLab service */
+"mLab" = "mLab";
+
+/* The unit display string for millimoles of glucose per liter */
+"mmol/L" = "ммоль/л";
+
+/* Format fragment for a start time */
+"since %@" = "от %@";
+
diff --git a/Loop/ru.lproj/Main.strings b/Loop/ru.lproj/Main.strings
new file mode 100644
index 0000000000..db2511db8c
--- /dev/null
+++ b/Loop/ru.lproj/Main.strings
@@ -0,0 +1,147 @@
+/* Class = "UINavigationItem"; title = "Status"; ObjectID = "3kU-n2-fha"; */
+"3kU-n2-fha.title" = "Состояние";
+
+/* Class = "UILabel"; text = "Pump ID"; ObjectID = "5TX-kX-nBo"; */
+"5TX-kX-nBo.text" = "идентификационный № помпы";
+
+/* Class = "UILabel"; text = "3.5 U/hour @ 12:12 PM"; ObjectID = "5gz-kZ-iF1"; */
+"5gz-kZ-iF1.text" = "3,5 ед./час @ 12:12 PM";
+
+/* Class = "UILabel"; text = "Bolus"; ObjectID = "5oA-6d-ZTL"; */
+"5oA-6d-ZTL.text" = "Болюс";
+
+/* Class = "UITextField"; accessibilityLabel = "Bolus Amount"; ObjectID = "7LT-50-ZzK"; */
+"7LT-50-ZzK.accessibilityLabel" = "Величина болюса";
+
+/* Class = "UITextField"; placeholder = "0.0"; ObjectID = "7LT-50-ZzK"; */
+"7LT-50-ZzK.placeholder" = "0.0";
+
+/* Class = "UILabel"; text = "Predicted"; ObjectID = "87H-N1-0vJ"; */
+"87H-N1-0vJ.text" = "Предсказываемый";
+
+/* Class = "UILabel"; text = "Title"; ObjectID = "B9F-K3-7RI"; */
+"B9F-K3-7RI.text" = "Название";
+
+/* Class = "UILabel"; accessibilityLabel = "Units"; ObjectID = "BR0-dr-Fj2"; */
+"BR0-dr-Fj2.accessibilityLabel" = "Единицы";
+
+/* Class = "UILabel"; text = "U"; ObjectID = "BR0-dr-Fj2"; */
+"BR0-dr-Fj2.text" = "ед";
+
+/* Class = "UILabel"; text = "Future glucose is predicted by combining the effects of multiple inputs. Use this tool to toggle various inputs to see how they compare to the final prediction."; ObjectID = "D4C-I2-dhA"; */
+"D4C-I2-dhA.text" = "Будущие значения СК предсказываются на основе определения эффекта множественных факторов. Пользуйтесь этим инструментом для перехода между разными вводными чтобы увидеть как они сопоставимы с окончательным предсказанием";
+
+/* Class = "UILabel"; text = "DEVICES"; ObjectID = "DyC-Sv-qP8"; */
+"DyC-Sv-qP8.text" = "Устройства";
+
+/* Class = "UILabel"; text = "eventually 92 mg/dL"; ObjectID = "E41-FN-nkk"; */
+"E41-FN-nkk.text" = "в конечном итоге 92 мг/дл";
+
+/* Class = "UILabel"; text = "Observed"; ObjectID = "EAn-Ja-S1d"; */
+"EAn-Ja-S1d.text" = "Наблюдается";
+
+/* Class = "UILabel"; text = "Observed changes in glucose, subtracting changes modeled from insulin delivery, can be used to estimate carbohydrate absorption."; ObjectID = "IxU-As-glo"; */
+"IxU-As-glo.text" = "Наблюдаются изменения СК, вычитаются изменения смоделированные на подаваемом инсулине, могут использоваться для оценки усвоения углеводов";
+
+/* Class = "UILabel"; text = "Detail"; ObjectID = "J7x-W5-gwo"; */
+"J7x-W5-gwo.text" = "Детали";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Krd-Aa-ret"; */
+"Krd-Aa-ret.text" = "Пометка";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "OFA-qT-ZAg"; */
+"OFA-qT-ZAg.text" = "Пометка";
+
+/* Class = "UITableViewController"; title = "Predicted Glucose"; ObjectID = "PA3-sP-cWY"; */
+"PA3-sP-cWY.title" = "Предсказываемый СК";
+
+/* Class = "UILabel"; text = "An insulin activity model is used to estimate effects of insulin on glucose levels. An accurate model can help prevent insulin stacking and safely recommend corrective treatments."; ObjectID = "PJv-p9-cFe"; */
+"PJv-p9-cFe.text" = "Модель действия инсулина применяется для оценки влияния инсулина на уровни гликемии. Точная модель может помочь предотвратить переизбыток инсулина и рекомендовать безопасную коррекцию";
+
+/* Class = "UILabel"; text = "eventually 92 mg/dL"; ObjectID = "Rse-x8-amW"; */
+"Rse-x8-amW.text" = "в конечном итоге 92 мг/дл";
+
+/* Class = "UILabel"; text = "g COB"; ObjectID = "SQx-au-ZcM"; */
+"SQx-au-ZcM.text" = "г COB";
+
+/* Class = "UINavigationItem"; title = "Carbohydrates"; ObjectID = "Vpi-5b-bY5"; */
+"Vpi-5b-bY5.title" = "Углеводы";
+
+/* Class = "UITextField"; text = "4 hour"; ObjectID = "Wk3-xv-IM5"; */
+"Wk3-xv-IM5.text" = "4 часа";
+
+/* Class = "UIButton"; normalTitle = "Deliver"; ObjectID = "Ya0-9b-ZAS"; */
+"Ya0-9b-ZAS.normalTitle" = "Доставить";
+
+/* Class = "UILabel"; text = "Detail"; ObjectID = "aCb-Qs-bpu"; */
+"aCb-Qs-bpu.text" = "Детали";
+
+/* Class = "UINavigationItem"; title = "Bolus"; ObjectID = "aiu-ZA-zVa"; */
+"aiu-ZA-zVa.title" = "Болюс";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "bIL-Ub-qYp"; */
+"bIL-Ub-qYp.text" = "Пометка";
+
+/* Class = "UILabel"; text = "Glucose Change"; ObjectID = "bq4-98-cQU"; */
+"bq4-98-cQU.text" = "Изменение глюкозы";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "cpo-Po-gFM"; */
+"cpo-Po-gFM.text" = "Пометка";
+
+/* Class = "UILabel"; text = "g Total"; ObjectID = "d3X-AN-tA5"; */
+"d3X-AN-tA5.text" = "всего грамм";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "d6m-qV-wWi"; */
+"d6m-qV-wWi.text" = "Пометка";
+
+/* Class = "UINavigationItem"; title = "Settings"; ObjectID = "dmB-PQ-B44"; */
+"dmB-PQ-B44.title" = "Настройки";
+
+/* Class = "UILabel"; text = "Active Carbohydrates: 40g"; ObjectID = "hHZ-uY-aKw"; */
+"hHZ-uY-aKw.text" = "Активные углеводы : 40 г";
+
+/* Class = "UITableViewController"; title = "Carbohydrate Effects"; ObjectID = "hZZ-2S-lrd"; */
+"hZZ-2S-lrd.title" = "Действие углеводов";
+
+/* Class = "UILabel"; text = "⚠ Glucose Predicted Below Range"; ObjectID = "k0g-P7-OVN"; */
+"k0g-P7-OVN.text" = "⚠ Предсказываемая гликемия ниже диапазона";
+
+/* Class = "UILabel"; text = "Recommended Basal"; ObjectID = "k3F-Na-7mn"; */
+"k3F-Na-7mn.text" = "Рекомендуемый базал";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "l7l-mw-Oc9"; */
+"l7l-mw-Oc9.text" = "Пометка";
+
+/* Class = "UILabel"; text = "Tap to set"; ObjectID = "m9c-SQ-djE"; */
+"m9c-SQ-djE.text" = "Коснуться для установки";
+
+/* Class = "UILabel"; accessibilityLabel = "Units"; ObjectID = "mVz-dr-xLU"; */
+"mVz-dr-xLU.accessibilityLabel" = "Единицы";
+
+/* Class = "UILabel"; text = "U"; ObjectID = "mVz-dr-xLU"; */
+"mVz-dr-xLU.text" = "Ед";
+
+/* Class = "UITableViewController"; title = "Insulin Model"; ObjectID = "pi6-Dh-72V"; */
+"pi6-Dh-72V.title" = "Модель инсулина";
+
+/* Class = "UILabel"; text = "Glucose"; ObjectID = "tuw-av-A3x"; */
+"tuw-av-A3x.text" = "Гликемия";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "ufi-Kj-33k"; */
+"ufi-Kj-33k.text" = "Пометка";
+
+/* Class = "UILabel"; text = "Active Insulin: 1.5U"; ObjectID = "viU-7a-kbI"; */
+"viU-7a-kbI.text" = "Активный инсулин: 1,5 ед";
+
+/* Class = "UILabel"; text = "0"; ObjectID = "yn7-2M-jZz"; */
+"yn7-2M-jZz.text" = "0";
+
+/* Class = "UILabel"; text = "Recommended"; ObjectID = "ywT-OR-NnU"; */
+"ywT-OR-NnU.text" = "Рекомендовано";
+
+/* Class = "UILabel"; text = "Title"; ObjectID = "zbc-87-wxZ"; */
+"zbc-87-wxZ.text" = "Название";
+
+/* Class = "UILabel"; text = "0"; ObjectID = "zvZ-uf-zMX"; */
+"zvZ-uf-zMX.text" = "0";
+
diff --git a/LoopTests/Info.plist b/LoopTests/Info.plist
index f5727e9a94..2fdd26a501 100644
--- a/LoopTests/Info.plist
+++ b/LoopTests/Info.plist
@@ -15,7 +15,7 @@
CFBundlePackageTypeBNDLCFBundleShortVersionString
- 1.5.1dev
+ 1.5.1CFBundleSignature????CFBundleVersion
diff --git a/LoopUI/Info.plist b/LoopUI/Info.plist
index 483b7ead94..8ef0c22933 100644
--- a/LoopUI/Info.plist
+++ b/LoopUI/Info.plist
@@ -17,7 +17,7 @@
CFBundlePackageTypeFMWKCFBundleShortVersionString
- 1.5.1dev
+ 1.5.1CFBundleVersion$(CURRENT_PROJECT_VERSION)NSPrincipalClass
diff --git a/LoopUI/Managers/StatusChartsManager.swift b/LoopUI/Managers/StatusChartsManager.swift
index 01ec682303..8019c33085 100644
--- a/LoopUI/Managers/StatusChartsManager.swift
+++ b/LoopUI/Managers/StatusChartsManager.swift
@@ -462,7 +462,7 @@ public final class StatusChartsManager {
let viewFrame = CGRect(x: chart.contentView.bounds.minX, y: chartPointModel.screenLoc.y - width / 2, width: chart.contentView.bounds.size.width, height: width)
let v = UIView(frame: viewFrame)
- v.backgroundColor = UIColor.IOBTintColor
+ v.layer.backgroundColor = UIColor.IOBTintColor.cgColor
return v
})
@@ -606,7 +606,7 @@ public final class StatusChartsManager {
let viewFrame = CGRect(x: chart.contentView.bounds.minX, y: chartPointModel.screenLoc.y - width / 2, width: chart.contentView.bounds.size.width, height: width)
let v = UIView(frame: viewFrame)
- v.backgroundColor = self.colors.doseTint
+ v.layer.backgroundColor = self.colors.doseTint.cgColor
return v
})
@@ -737,7 +737,7 @@ public final class StatusChartsManager {
let viewFrame = CGRect(x: chart.contentView.bounds.minX, y: chartPointModel.screenLoc.y - width / 2, width: chart.contentView.bounds.size.width, height: width)
let v = UIView(frame: viewFrame)
- v.backgroundColor = carbFillColor
+ v.layer.backgroundColor = carbFillColor.cgColor
return v
})
diff --git a/LoopUI/es.lproj/InfoPlist.strings b/LoopUI/es.lproj/InfoPlist.strings
new file mode 100644
index 0000000000..5c1fb13406
--- /dev/null
+++ b/LoopUI/es.lproj/InfoPlist.strings
@@ -0,0 +1,6 @@
+/* (No Comment) */
+"CFBundleDisplayName" = "LoopUI";
+
+/* (No Comment) */
+"CFBundleName" = "$(PRODUCT_NAME)";
+
diff --git a/LoopUI/es.lproj/Localizable.strings b/LoopUI/es.lproj/Localizable.strings
new file mode 100644
index 0000000000..4997127206
--- /dev/null
+++ b/LoopUI/es.lproj/Localizable.strings
@@ -0,0 +1,63 @@
+/* Accessbility format value describing glucose: (1: glucose number)(2: glucose time) */
+"%1$@ at %2$@" = "%1$@ en %2$@";
+
+/* Accessibility format string describing the basal rate. (1: localized basal rate value)(2: last updated time) */
+"%1$@ units per hour at %2$@" = "%1$@ unidades por hora en %2$@";
+
+/* Accessibility format string for (1: localized volume)(2: time) */
+"%1$@ units remaining at %2$@" = "%1$@ unidades restantes a %2$@";
+
+/* The format string describing the basal rate. */
+"%@ U" = "%@ U";
+
+/* Format string describing the time interval since the last completion date. (1: The localized date components */
+"%@ ago" = "hace %@";
+
+/* Format string for reservoir volume. (1: The localized volume) */
+"%@U" = "%@U";
+
+/* Accessibility hint describing completion HUD for a closed loop */
+"Closed loop" = "Asa cerrada";
+
+/* Glucose trend down */
+"Falling" = "Bajando";
+
+/* Glucose trend down-down */
+"Falling fast" = "Bajando rápido";
+
+/* Glucose trend down-down-down */
+"Falling very fast" = "Bajando muy rápido";
+
+/* Glucose trend flat */
+"Flat" = "Estable";
+
+/* Accessbility format label describing the time interval since the last completion date. (1: The localized date components) */
+"Loop ran %@ ago" = "Loop corrió hace %@";
+
+/* Accessibility label component for glucose HUD describing an invalid state */
+"Needs attention" = "Necesita atención";
+
+/* Accessbility hint describing completion HUD for an open loop */
+"Open loop" = "Asa abierta";
+
+/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
+"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
+
+/* Glucose trend up */
+"Rising" = "Subiendo";
+
+/* Glucose trend up-up */
+"Rising fast" = "Subiendo rápido";
+
+/* Glucose trend up-up-up */
+"Rising very fast" = "Subiendo muy rápido";
+
+/* Accessibility value for an unknown value */
+"Unknown" = "Desconocido";
+
+/* Acessibility label describing completion HUD waiting for first run */
+"Waiting for first run" = "Esperando el primer uso";
+
+/* The unit display string for millimoles of glucose per liter */
+"mmol/L" = "mmol/L";
+
diff --git a/LoopUI/ru.lproj/InfoPlist.strings b/LoopUI/ru.lproj/InfoPlist.strings
new file mode 100644
index 0000000000..5c1fb13406
--- /dev/null
+++ b/LoopUI/ru.lproj/InfoPlist.strings
@@ -0,0 +1,6 @@
+/* (No Comment) */
+"CFBundleDisplayName" = "LoopUI";
+
+/* (No Comment) */
+"CFBundleName" = "$(PRODUCT_NAME)";
+
diff --git a/LoopUI/ru.lproj/Localizable.strings b/LoopUI/ru.lproj/Localizable.strings
new file mode 100644
index 0000000000..592ce0feae
--- /dev/null
+++ b/LoopUI/ru.lproj/Localizable.strings
@@ -0,0 +1,63 @@
+/* Accessbility format value describing glucose: (1: glucose number)(2: glucose time) */
+"%1$@ at %2$@" = "%1$@ в %2$@ ";
+
+/* Accessibility format string describing the basal rate. (1: localized basal rate value)(2: last updated time) */
+"%1$@ units per hour at %2$@" = "%1$@ ед/час в %2$@";
+
+/* Accessibility format string for (1: localized volume)(2: time) */
+"%1$@ units remaining at %2$@" = "%1$@ ед остающихся в %2$@";
+
+/* The format string describing the basal rate. */
+"%@ U" = "%@ ед";
+
+/* Format string describing the time interval since the last completion date. (1: The localized date components */
+"%@ ago" = "%@ назад";
+
+/* Format string for reservoir volume. (1: The localized volume) */
+"%@U" = "%@ед";
+
+/* Accessibility hint describing completion HUD for a closed loop */
+"Closed loop" = "Алгоритм замкнутого цикла";
+
+/* Glucose trend down */
+"Falling" = "Падение";
+
+/* Glucose trend down-down */
+"Falling fast" = "Быстрое падение";
+
+/* Glucose trend down-down-down */
+"Falling very fast" = "Очень быстрое падение";
+
+/* Glucose trend flat */
+"Flat" = "Стабильно";
+
+/* Accessbility format label describing the time interval since the last completion date. (1: The localized date components) */
+"Loop ran %@ ago" = "Алгоритм цикла запущен %@ назад";
+
+/* Accessibility label component for glucose HUD describing an invalid state */
+"Needs attention" = "Требует внимания";
+
+/* Accessbility hint describing completion HUD for an open loop */
+"Open loop" = "Алгоритм открытого цикла";
+
+/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
+"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
+
+/* Glucose trend up */
+"Rising" = "Повышение";
+
+/* Glucose trend up-up */
+"Rising fast" = "Быстрое повышение";
+
+/* Glucose trend up-up-up */
+"Rising very fast" = "Очень быстрое повышение";
+
+/* Accessibility value for an unknown value */
+"Unknown" = "Неизвестно";
+
+/* Acessibility label describing completion HUD waiting for first run */
+"Waiting for first run" = "Ожидает первичного запуска";
+
+/* The unit display string for millimoles of glucose per liter */
+"mmol/L" = "ммоль/л";
+
diff --git a/WatchApp Extension/Info.plist b/WatchApp Extension/Info.plist
index e12703481b..eab5a86879 100644
--- a/WatchApp Extension/Info.plist
+++ b/WatchApp Extension/Info.plist
@@ -17,7 +17,7 @@
CFBundlePackageTypeXPC!CFBundleShortVersionString
- 1.5.1dev
+ 1.5.1CFBundleSignature????CFBundleVersion
diff --git a/WatchApp Extension/es.lproj/InfoPlist.strings b/WatchApp Extension/es.lproj/InfoPlist.strings
new file mode 100644
index 0000000000..06077199aa
--- /dev/null
+++ b/WatchApp Extension/es.lproj/InfoPlist.strings
@@ -0,0 +1,6 @@
+/* (No Comment) */
+"CFBundleDisplayName" = "WatchApp Extension";
+
+/* (No Comment) */
+"CFBundleName" = "$(PRODUCT_NAME)";
+
diff --git a/WatchApp Extension/es.lproj/Localizable.strings b/WatchApp Extension/es.lproj/Localizable.strings
new file mode 100644
index 0000000000..7ce2b650c1
--- /dev/null
+++ b/WatchApp Extension/es.lproj/Localizable.strings
@@ -0,0 +1,43 @@
+/* The title of the alert controller displayed after a bolus attempt fails */
+"Bolus Failed" = "Bolo Falló";
+
+/* The action button title to dismiss an error message */
+"Dismiss" = "Ignorar";
+
+/* Glucose trend down */
+"Falling" = "Bajando";
+
+/* Glucose trend down-down */
+"Falling fast" = "Bajando rápido";
+
+/* Glucose trend down-down-down */
+"Falling very fast" = "Bajando muy rápido";
+
+/* Glucose trend flat */
+"Flat" = "Estable";
+
+/* The recovery message displayed after a bolus attempt fails
+ The recovery message displayed after a carb entry send attempt fails */
+"Make sure your iPhone is nearby and try again" = "Asegúrate que tu iPhone se encuentre cerca e inténtalo de nuevo";
+
+/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
+"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
+
+/* The label and value showing the recommended bolus */
+"Rec: %@ U" = "Rec: %@ U";
+
+/* Glucose trend up */
+"Rising" = "Subiendo";
+
+/* Glucose trend up-up */
+"Rising fast" = "Subiendo rápido";
+
+/* Glucose trend up-up-up */
+"Rising very fast" = "Subiendo muy rápido";
+
+/* The title of the alert controller displayed after a carb entry send attempt fails */
+"Send Failed" = "Envío Falló";
+
+/* The unit display string for millimoles of glucose per liter */
+"mmol/L" = "mmol/L";
+
diff --git a/WatchApp Extension/es.lproj/ckcomplication.strings b/WatchApp Extension/es.lproj/ckcomplication.strings
new file mode 100644
index 0000000000..0c9dc09cf7
--- /dev/null
+++ b/WatchApp Extension/es.lproj/ckcomplication.strings
@@ -0,0 +1,3 @@
+/* Utilitarian large flat format string (1: Glucose & Trend symbol) (2: Eventual Glucose) (3: Time) */
+"UtilitarianLargeFlat" = "UtilitarianLargeFlat";
+
diff --git a/WatchApp Extension/ru.lproj/InfoPlist.strings b/WatchApp Extension/ru.lproj/InfoPlist.strings
new file mode 100644
index 0000000000..06077199aa
--- /dev/null
+++ b/WatchApp Extension/ru.lproj/InfoPlist.strings
@@ -0,0 +1,6 @@
+/* (No Comment) */
+"CFBundleDisplayName" = "WatchApp Extension";
+
+/* (No Comment) */
+"CFBundleName" = "$(PRODUCT_NAME)";
+
diff --git a/WatchApp Extension/ru.lproj/Localizable.strings b/WatchApp Extension/ru.lproj/Localizable.strings
new file mode 100644
index 0000000000..bc53c93560
--- /dev/null
+++ b/WatchApp Extension/ru.lproj/Localizable.strings
@@ -0,0 +1,43 @@
+/* The title of the alert controller displayed after a bolus attempt fails */
+"Bolus Failed" = "Болюс не состоялся";
+
+/* The action button title to dismiss an error message */
+"Dismiss" = "Пропустить";
+
+/* Glucose trend down */
+"Falling" = "Падение";
+
+/* Glucose trend down-down */
+"Falling fast" = "Быстрое падение";
+
+/* Glucose trend down-down-down */
+"Falling very fast" = "Очень быстрое падение";
+
+/* Glucose trend flat */
+"Flat" = "Стабильно";
+
+/* The recovery message displayed after a bolus attempt fails
+ The recovery message displayed after a carb entry send attempt fails */
+"Make sure your iPhone is nearby and try again" = "Убедитесь, что ваш iPhone поблизости и повторите попытку";
+
+/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
+"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
+
+/* The label and value showing the recommended bolus */
+"Rec: %@ U" = "Рекомендовано: %@ ед";
+
+/* Glucose trend up */
+"Rising" = "Повышение";
+
+/* Glucose trend up-up */
+"Rising fast" = "Быстрое повышение";
+
+/* Glucose trend up-up-up */
+"Rising very fast" = "Очень быстрое повышение";
+
+/* The title of the alert controller displayed after a carb entry send attempt fails */
+"Send Failed" = "Ошибка отправки";
+
+/* The unit display string for millimoles of glucose per liter */
+"mmol/L" = "ммоль/л";
+
diff --git a/WatchApp Extension/ru.lproj/ckcomplication.strings b/WatchApp Extension/ru.lproj/ckcomplication.strings
new file mode 100644
index 0000000000..0c9dc09cf7
--- /dev/null
+++ b/WatchApp Extension/ru.lproj/ckcomplication.strings
@@ -0,0 +1,3 @@
+/* Utilitarian large flat format string (1: Glucose & Trend symbol) (2: Eventual Glucose) (3: Time) */
+"UtilitarianLargeFlat" = "UtilitarianLargeFlat";
+
diff --git a/WatchApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/WatchApp/Assets.xcassets/AppIcon.appiconset/Contents.json
index 7c1352bce2..a8d3101a64 100644
--- a/WatchApp/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ b/WatchApp/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -53,10 +53,16 @@
"scale" : "2x",
"role" : "quickLook",
"subtype" : "42mm"
+ },
+ {
+ "size" : "1024x1024",
+ "idiom" : "watch-marketing",
+ "filename" : "Icon-App-Store-1024.png",
+ "scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
-}
\ No newline at end of file
+}
diff --git a/WatchApp/Assets.xcassets/AppIcon.appiconset/Icon-App-Store-1024.png b/WatchApp/Assets.xcassets/AppIcon.appiconset/Icon-App-Store-1024.png
new file mode 100644
index 0000000000..189337f741
Binary files /dev/null and b/WatchApp/Assets.xcassets/AppIcon.appiconset/Icon-App-Store-1024.png differ
diff --git a/WatchApp/Base.lproj/Interface.storyboard b/WatchApp/Base.lproj/Interface.storyboard
index 3a3c8c0757..e8002aa8cf 100644
--- a/WatchApp/Base.lproj/Interface.storyboard
+++ b/WatchApp/Base.lproj/Interface.storyboard
@@ -16,7 +16,7 @@
-
+
@@ -66,10 +66,13 @@
-
+
-
-
-
-
-
-
diff --git a/WatchApp/Info.plist b/WatchApp/Info.plist
index 6ee6268164..f300fa24c2 100644
--- a/WatchApp/Info.plist
+++ b/WatchApp/Info.plist
@@ -17,7 +17,7 @@
CFBundlePackageTypeAPPLCFBundleShortVersionString
- 1.5.1dev
+ 1.5.1CFBundleSignature????CFBundleVersion
diff --git a/WatchApp/es.lproj/InfoPlist.strings b/WatchApp/es.lproj/InfoPlist.strings
new file mode 100644
index 0000000000..9250064a26
--- /dev/null
+++ b/WatchApp/es.lproj/InfoPlist.strings
@@ -0,0 +1,6 @@
+/* (No Comment) */
+"CFBundleDisplayName" = "Loop";
+
+/* (No Comment) */
+"CFBundleName" = "$(PRODUCT_NAME)";
+
diff --git a/WatchApp/es.lproj/Interface.strings b/WatchApp/es.lproj/Interface.strings
new file mode 100644
index 0000000000..3fc94b8dd5
--- /dev/null
+++ b/WatchApp/es.lproj/Interface.strings
@@ -0,0 +1,66 @@
+/* Class = "WKInterfaceButton"; title = "🌮"; ObjectID = "0fo-Z3-hTi"; */
+"0fo-Z3-hTi.title" = "🌮";
+
+/* Class = "WKInterfaceLabel"; text = "GRAMS"; ObjectID = "18G-mT-92P"; */
+"18G-mT-92P.text" = "GRAMOS";
+
+/* Class = "WKInterfaceButton"; accessibilityLabel = "Add"; ObjectID = "DZc-Gn-RLu"; */
+"DZc-Gn-RLu.accessibilityLabel" = "Agregar";
+
+/* Class = "WKInterfaceButton"; title = "+"; ObjectID = "DZc-Gn-RLu"; */
+"DZc-Gn-RLu.title" = "+";
+
+/* Class = "WKInterfaceButton"; accessibilityLabel = "Subtract"; ObjectID = "Dh9-HV-fXy"; */
+"Dh9-HV-fXy.accessibilityLabel" = "Substraer";
+
+/* Class = "WKInterfaceButton"; title = "−"; ObjectID = "Dh9-HV-fXy"; */
+"Dh9-HV-fXy.title" = "−";
+
+/* Class = "WKInterfaceLabel"; text = "15"; ObjectID = "E5r-2c-UZm"; */
+"E5r-2c-UZm.text" = "15";
+
+/* Class = "WKInterfaceButton"; title = "Bolus"; ObjectID = "Qsq-p5-1J0"; */
+"Qsq-p5-1J0.title" = "Bolo";
+
+/* Class = "WKInterfaceLabel"; text = ""; ObjectID = "XkS-y5-khE"; */
+"XkS-y5-khE.text" = "";
+
+/* Class = "WKInterfaceButton"; title = "Add Carbs"; ObjectID = "b6f-3I-jki"; */
+"b6f-3I-jki.title" = "Agregar Carbs";
+
+/* Class = "WKInterfaceButton"; title = "🍕"; ObjectID = "dPF-QZ-sh6"; */
+"dPF-QZ-sh6.title" = "🍕";
+
+/* Class = "WKInterfaceButton"; accessibilityLabel = "Add"; ObjectID = "eu3-pj-GH3"; */
+"eu3-pj-GH3.accessibilityLabel" = "Agregar";
+
+/* Class = "WKInterfaceButton"; title = "+"; ObjectID = "eu3-pj-GH3"; */
+"eu3-pj-GH3.title" = "+";
+
+/* Class = "WKInterfaceButton"; title = "🍭"; ObjectID = "gAn-qe-OvX"; */
+"gAn-qe-OvX.title" = "🍭";
+
+/* Class = "WKInterfaceButton"; accessibilityLabel = "Subtract"; ObjectID = "hjF-xr-cwO"; */
+"hjF-xr-cwO.accessibilityLabel" = "Sustraer";
+
+/* Class = "WKInterfaceButton"; title = "−"; ObjectID = "hjF-xr-cwO"; */
+"hjF-xr-cwO.title" = "−";
+
+/* Class = "WKInterfaceLabel"; text = "Carbs"; ObjectID = "hln-CI-MRP"; */
+"hln-CI-MRP.text" = "Carbs";
+
+/* Class = "WKInterfaceLabel"; text = "Bolus Failed"; ObjectID = "jj3-Gq-HBy"; */
+"jj3-Gq-HBy.text" = "Bolo Falló";
+
+/* Class = "WKInterfaceLabel"; text = "0.000"; ObjectID = "mpK-zY-UvA"; */
+"mpK-zY-UvA.text" = "0.000";
+
+/* Class = "WKInterfaceController"; title = "Loop"; ObjectID = "rNf-Mh-tID"; */
+"rNf-Mh-tID.title" = "Loop";
+
+/* Class = "WKInterfaceLabel"; text = "UNITS"; ObjectID = "rV7-d9-n6u"; */
+"rV7-d9-n6u.text" = "UNIDADES";
+
+/* Class = "WKInterfaceLabel"; text = "Bolus"; ObjectID = "smL-Rc-IZh"; */
+"smL-Rc-IZh.text" = "Bolo";
+
diff --git a/WatchApp/ru.lproj/InfoPlist.strings b/WatchApp/ru.lproj/InfoPlist.strings
new file mode 100644
index 0000000000..9250064a26
--- /dev/null
+++ b/WatchApp/ru.lproj/InfoPlist.strings
@@ -0,0 +1,6 @@
+/* (No Comment) */
+"CFBundleDisplayName" = "Loop";
+
+/* (No Comment) */
+"CFBundleName" = "$(PRODUCT_NAME)";
+
diff --git a/WatchApp/ru.lproj/Interface.strings b/WatchApp/ru.lproj/Interface.strings
new file mode 100644
index 0000000000..838655b533
--- /dev/null
+++ b/WatchApp/ru.lproj/Interface.strings
@@ -0,0 +1,66 @@
+/* Class = "WKInterfaceButton"; title = "🌮"; ObjectID = "0fo-Z3-hTi"; */
+"0fo-Z3-hTi.title" = "🌮";
+
+/* Class = "WKInterfaceLabel"; text = "15"; ObjectID = "CWt-7U-cnK"; */
+"CWt-7U-cnK.text" = "15";
+
+/* Class = "WKInterfaceButton"; accessibilityLabel = "Add"; ObjectID = "DZc-Gn-RLu"; */
+"DZc-Gn-RLu.accessibilityLabel" = "Добавить";
+
+/* Class = "WKInterfaceButton"; title = "+"; ObjectID = "DZc-Gn-RLu"; */
+"DZc-Gn-RLu.title" = "+";
+
+/* Class = "WKInterfaceButton"; accessibilityLabel = "Subtract"; ObjectID = "Dh9-HV-fXy"; */
+"Dh9-HV-fXy.accessibilityLabel" = "вычитать";
+
+/* Class = "WKInterfaceButton"; title = "−"; ObjectID = "Dh9-HV-fXy"; */
+"Dh9-HV-fXy.title" = "−";
+
+/* Class = "WKInterfaceButton"; title = "Bolus"; ObjectID = "Qsq-p5-1J0"; */
+"Qsq-p5-1J0.title" = "Болюс";
+
+/* Class = "WKInterfaceLabel"; text = "10:09 AM"; ObjectID = "Ury-of-vQg"; */
+"Ury-of-vQg.text" = "10:09 AM";
+
+/* Class = "WKInterfaceLabel"; text = ""; ObjectID = "XkS-y5-khE"; */
+"XkS-y5-khE.text" = "";
+
+/* Class = "WKInterfaceButton"; title = "Add Carbs"; ObjectID = "b6f-3I-jki"; */
+"b6f-3I-jki.title" = "Добавить углеводов";
+
+/* Class = "WKInterfaceButton"; title = "🍕"; ObjectID = "dPF-QZ-sh6"; */
+"dPF-QZ-sh6.title" = "🍕";
+
+/* Class = "WKInterfaceButton"; accessibilityLabel = "Add"; ObjectID = "eu3-pj-GH3"; */
+"eu3-pj-GH3.accessibilityLabel" = "Добавить\n ";
+
+/* Class = "WKInterfaceButton"; title = "+"; ObjectID = "eu3-pj-GH3"; */
+"eu3-pj-GH3.title" = "+";
+
+/* Class = "WKInterfaceButton"; title = "🍭"; ObjectID = "gAn-qe-OvX"; */
+"gAn-qe-OvX.title" = "🍭";
+
+/* Class = "WKInterfaceButton"; accessibilityLabel = "Subtract"; ObjectID = "hjF-xr-cwO"; */
+"hjF-xr-cwO.accessibilityLabel" = "вычитать";
+
+/* Class = "WKInterfaceButton"; title = "−"; ObjectID = "hjF-xr-cwO"; */
+"hjF-xr-cwO.title" = "−";
+
+/* Class = "WKInterfaceLabel"; text = "Carbs"; ObjectID = "hln-CI-MRP"; */
+"hln-CI-MRP.text" = "Углеводы";
+
+/* Class = "WKInterfaceLabel"; text = "Bolus Failed"; ObjectID = "jj3-Gq-HBy"; */
+"jj3-Gq-HBy.text" = "Болюс не состоялся ";
+
+/* Class = "WKInterfaceLabel"; text = "0.000"; ObjectID = "mpK-zY-UvA"; */
+"mpK-zY-UvA.text" = "0.000";
+
+/* Class = "WKInterfaceController"; title = "Loop"; ObjectID = "rNf-Mh-tID"; */
+"rNf-Mh-tID.title" = "Loop";
+
+/* Class = "WKInterfaceLabel"; text = "UNITS"; ObjectID = "rV7-d9-n6u"; */
+"rV7-d9-n6u.text" = "ед";
+
+/* Class = "WKInterfaceLabel"; text = "Bolus"; ObjectID = "smL-Rc-IZh"; */
+"smL-Rc-IZh.text" = "Болюс";
+