Skip to content

Commit 53a1004

Browse files
Added LibreView integration for BloodGlucose data
Update to iOS 16
1 parent 5983726 commit 53a1004

15 files changed

Lines changed: 1046 additions & 27 deletions

File tree

FreeAPS.xcodeproj/project.pbxproj

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,11 @@
251251
61962FCAF8A2D222553AC5A3 /* LibreConfigDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66A5B83E7967C38F7CBD883C /* LibreConfigDataFlow.swift */; };
252252
63E890B4D951EAA91C071D5C /* BasalProfileEditorStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAFF91130F2FCCC7EBBA11AD /* BasalProfileEditorStateModel.swift */; };
253253
642F76A05A4FF530463A9FD0 /* NightscoutConfigRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8782B44544F38F2B2D82C38E /* NightscoutConfigRootView.swift */; };
254+
6559084D2933A5BB00960C87 /* LibreViewConfigDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6559084C2933A5BB00960C87 /* LibreViewConfigDataFlow.swift */; };
255+
6559084F2933A5C800960C87 /* LibreViewConfigProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6559084E2933A5C800960C87 /* LibreViewConfigProvider.swift */; };
256+
655908512933A5D700960C87 /* LibreViewStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 655908502933A5D700960C87 /* LibreViewStateModel.swift */; };
257+
655908542933A63300960C87 /* LibreViewConfigRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 655908532933A63300960C87 /* LibreViewConfigRootView.swift */; };
258+
65D16C5A29422ED100ABF87A /* LibreLinkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D16C5929422ED100ABF87A /* LibreLinkManager.swift */; };
254259
6632A0DC746872439A858B44 /* ISFEditorDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79BDA519C9B890FD9A5DFCF3 /* ISFEditorDataFlow.swift */; };
255260
69A31254F2451C20361D172F /* BolusStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 223EC0494F55A91E3EA69EF4 /* BolusStateModel.swift */; };
256261
69B9A368029F7EB39F525422 /* CREditorStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64AA5E04A2761F6EEA6568E1 /* CREditorStateModel.swift */; };
@@ -677,6 +682,11 @@
677682
60744C3E9BB3652895C908CC /* DataTableProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DataTableProvider.swift; sourceTree = "<group>"; };
678683
618E62C9757B2F95431B5DC0 /* AddCarbsProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AddCarbsProvider.swift; sourceTree = "<group>"; };
679684
64AA5E04A2761F6EEA6568E1 /* CREditorStateModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CREditorStateModel.swift; sourceTree = "<group>"; };
685+
6559084C2933A5BB00960C87 /* LibreViewConfigDataFlow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibreViewConfigDataFlow.swift; sourceTree = "<group>"; };
686+
6559084E2933A5C800960C87 /* LibreViewConfigProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibreViewConfigProvider.swift; sourceTree = "<group>"; };
687+
655908502933A5D700960C87 /* LibreViewStateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibreViewStateModel.swift; sourceTree = "<group>"; };
688+
655908532933A63300960C87 /* LibreViewConfigRootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibreViewConfigRootView.swift; sourceTree = "<group>"; };
689+
65D16C5929422ED100ABF87A /* LibreLinkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibreLinkManager.swift; sourceTree = "<group>"; };
680690
66A5B83E7967C38F7CBD883C /* LibreConfigDataFlow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LibreConfigDataFlow.swift; sourceTree = "<group>"; };
681691
67F94DD2853CF42BA4E30616 /* BasalProfileEditorDataFlow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BasalProfileEditorDataFlow.swift; sourceTree = "<group>"; };
682692
680C4420C9A345D46D90D06C /* ManualTempBasalProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ManualTempBasalProvider.swift; sourceTree = "<group>"; };
@@ -902,6 +912,7 @@
902912
C11D545CED3ECEB525EDEE23 /* LibreConfig */,
903913
3811DE1A25C9D48300A708ED /* Main */,
904914
5031FE61F63C2A8A8B7674DD /* ManualTempBasal */,
915+
6559084B2933A58E00960C87 /* LibreViewConfig */,
905916
D533BF261CDC1C3F871E7BFD /* NightscoutConfig */,
906917
F66B236E00924A05D6A9F9DF /* NotificationsConfig */,
907918
3E1C41D9301B7058AA7BF5EA /* PreferencesEditor */,
@@ -1047,6 +1058,7 @@
10471058
3811DE9725C9D88300A708ED /* NightscoutManager.swift */,
10481059
38FE826925CC82DB001FF17A /* NetworkService.swift */,
10491060
38FE826C25CC8461001FF17A /* NightscoutAPI.swift */,
1061+
65D16C5929422ED100ABF87A /* LibreLinkManager.swift */,
10501062
);
10511063
path = Network;
10521064
sourceTree = "<group>";
@@ -1628,6 +1640,25 @@
16281640
path = TargetsEditor;
16291641
sourceTree = "<group>";
16301642
};
1643+
6559084B2933A58E00960C87 /* LibreViewConfig */ = {
1644+
isa = PBXGroup;
1645+
children = (
1646+
655908522933A61D00960C87 /* View */,
1647+
6559084C2933A5BB00960C87 /* LibreViewConfigDataFlow.swift */,
1648+
6559084E2933A5C800960C87 /* LibreViewConfigProvider.swift */,
1649+
655908502933A5D700960C87 /* LibreViewStateModel.swift */,
1650+
);
1651+
path = LibreViewConfig;
1652+
sourceTree = "<group>";
1653+
};
1654+
655908522933A61D00960C87 /* View */ = {
1655+
isa = PBXGroup;
1656+
children = (
1657+
655908532933A63300960C87 /* LibreViewConfigRootView.swift */,
1658+
);
1659+
path = View;
1660+
sourceTree = "<group>";
1661+
};
16311662
672F63EEAE27400625E14BAD /* AutotuneConfig */ = {
16321663
isa = PBXGroup;
16331664
children = (
@@ -2237,6 +2268,7 @@
22372268
388358C825EEF6D200E024B2 /* BasalProfileEntry.swift in Sources */,
22382269
3811DE0B25C9D32F00A708ED /* BaseView.swift in Sources */,
22392270
3811DE3225C9D49500A708ED /* HomeDataFlow.swift in Sources */,
2271+
6559084D2933A5BB00960C87 /* LibreViewConfigDataFlow.swift in Sources */,
22402272
38569347270B5DFB0002C50D /* CGMType.swift in Sources */,
22412273
3821ED4C25DD18BA00BC42AD /* Constants.swift in Sources */,
22422274
384E803425C385E60086DB71 /* JavaScriptWorker.swift in Sources */,
@@ -2302,6 +2334,7 @@
23022334
5D16287A969E64D18CE40E44 /* PumpConfigStateModel.swift in Sources */,
23032335
E974172296125A5AE99E634C /* PumpConfigRootView.swift in Sources */,
23042336
448B6FCB252BD4796E2960C0 /* PumpSettingsEditorDataFlow.swift in Sources */,
2337+
6559084F2933A5C800960C87 /* LibreViewConfigProvider.swift in Sources */,
23052338
38E44536274E411700EC9A94 /* Disk.swift in Sources */,
23062339
2BE9A6FA20875F6F4F9CD461 /* PumpSettingsEditorProvider.swift in Sources */,
23072340
6B9625766B697D1C98E455A2 /* PumpSettingsEditorStateModel.swift in Sources */,
@@ -2337,6 +2370,7 @@
23372370
17A9D0899046B45E87834820 /* CREditorProvider.swift in Sources */,
23382371
69B9A368029F7EB39F525422 /* CREditorStateModel.swift in Sources */,
23392372
F97F722827A9741C007B6620 /* MigrationStateModel.swift in Sources */,
2373+
655908512933A5D700960C87 /* LibreViewStateModel.swift in Sources */,
23402374
38E44538274E411700EC9A94 /* Disk+[Data].swift in Sources */,
23412375
98641AF4F92123DA668AB931 /* CREditorRootView.swift in Sources */,
23422376
38E4453D274E411700EC9A94 /* Disk+Errors.swift in Sources */,
@@ -2382,6 +2416,7 @@
23822416
38E4453B274E411700EC9A94 /* Disk+VolumeInformation.swift in Sources */,
23832417
F97F722127A957AF007B6620 /* MigrationPublisher.swift in Sources */,
23842418
7BCFACB97C821041BA43A114 /* ManualTempBasalRootView.swift in Sources */,
2419+
655908542933A63300960C87 /* LibreViewConfigRootView.swift in Sources */,
23852420
38E44534274E411700EC9A94 /* Disk+InternalHelpers.swift in Sources */,
23862421
38A00B2325FC2B55006BC0B0 /* LRUCache.swift in Sources */,
23872422
3083261C4B268E353F36CD0B /* AutotuneConfigDataFlow.swift in Sources */,
@@ -2390,6 +2425,7 @@
23902425
A05235B9112E677ED03B6E8E /* AutotuneConfigRootView.swift in Sources */,
23912426
7F7B756BE8543965D9FDF1A2 /* DataTableDataFlow.swift in Sources */,
23922427
1D845DF2E3324130E1D95E67 /* DataTableProvider.swift in Sources */,
2428+
65D16C5A29422ED100ABF87A /* LibreLinkManager.swift in Sources */,
23932429
0D9A5E34A899219C5C4CDFAF /* DataTableStateModel.swift in Sources */,
23942430
D6D02515BBFBE64FEBE89856 /* DataTableRootView.swift in Sources */,
23952431
38569349270B5DFB0002C50D /* AppGroupSource.swift in Sources */,
@@ -2583,7 +2619,7 @@
25832619
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
25842620
GCC_WARN_UNUSED_FUNCTION = YES;
25852621
GCC_WARN_UNUSED_VARIABLE = YES;
2586-
IPHONEOS_DEPLOYMENT_TARGET = 14.3;
2622+
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
25872623
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
25882624
MTL_FAST_MATH = YES;
25892625
ONLY_ACTIVE_ARCH = YES;
@@ -2641,7 +2677,7 @@
26412677
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
26422678
GCC_WARN_UNUSED_FUNCTION = YES;
26432679
GCC_WARN_UNUSED_VARIABLE = YES;
2644-
IPHONEOS_DEPLOYMENT_TARGET = 14.3;
2680+
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
26452681
MTL_ENABLE_DEBUG_INFO = NO;
26462682
MTL_FAST_MATH = YES;
26472683
SDKROOT = iphoneos;
@@ -2666,7 +2702,7 @@
26662702
DEVELOPMENT_TEAM = "${DEVELOPER_TEAM}";
26672703
ENABLE_PREVIEWS = YES;
26682704
INFOPLIST_FILE = FreeAPS/Resources/Info.plist;
2669-
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
2705+
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
26702706
LD_RUNPATH_SEARCH_PATHS = (
26712707
"$(inherited)",
26722708
"@executable_path/Frameworks",
@@ -2703,7 +2739,7 @@
27032739
DEVELOPMENT_TEAM = "${DEVELOPER_TEAM}";
27042740
ENABLE_PREVIEWS = YES;
27052741
INFOPLIST_FILE = FreeAPS/Resources/Info.plist;
2706-
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
2742+
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
27072743
LD_RUNPATH_SEARCH_PATHS = (
27082744
"$(inherited)",
27092745
"@executable_path/Frameworks",

FreeAPS.xcodeproj/xcshareddata/xcschemes/FreeAPSWatch.xcscheme

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -55,46 +55,33 @@
5555
debugServiceExtension = "internal"
5656
allowLocationSimulation = "YES"
5757
notificationPayloadFile = "FreeAPSWatch WatchKit Extension/PushNotificationPayload.apns">
58-
<RemoteRunnable
59-
runnableDebuggingMode = "2"
60-
BundleIdentifier = "com.apple.Carousel"
61-
RemotePath = "/FreeAPS X">
58+
<BuildableProductRunnable
59+
runnableDebuggingMode = "0">
6260
<BuildableReference
6361
BuildableIdentifier = "primary"
6462
BlueprintIdentifier = "38E8751B27554D5500975559"
6563
BuildableName = "FreeAPSWatch.app"
6664
BlueprintName = "FreeAPSWatch"
6765
ReferencedContainer = "container:FreeAPS.xcodeproj">
6866
</BuildableReference>
69-
</RemoteRunnable>
67+
</BuildableProductRunnable>
7068
</LaunchAction>
7169
<ProfileAction
7270
buildConfiguration = "Release"
7371
shouldUseLaunchSchemeArgsEnv = "YES"
7472
savedToolIdentifier = ""
7573
useCustomWorkingDirectory = "NO"
7674
debugDocumentVersioning = "YES">
77-
<RemoteRunnable
78-
runnableDebuggingMode = "2"
79-
BundleIdentifier = "com.apple.Carousel"
80-
RemotePath = "/FreeAPS X">
75+
<BuildableProductRunnable
76+
runnableDebuggingMode = "0">
8177
<BuildableReference
8278
BuildableIdentifier = "primary"
8379
BlueprintIdentifier = "38E8751B27554D5500975559"
8480
BuildableName = "FreeAPSWatch.app"
8581
BlueprintName = "FreeAPSWatch"
8682
ReferencedContainer = "container:FreeAPS.xcodeproj">
8783
</BuildableReference>
88-
</RemoteRunnable>
89-
<MacroExpansion>
90-
<BuildableReference
91-
BuildableIdentifier = "primary"
92-
BlueprintIdentifier = "38E8751B27554D5500975559"
93-
BuildableName = "FreeAPSWatch.app"
94-
BlueprintName = "FreeAPSWatch"
95-
ReferencedContainer = "container:FreeAPS.xcodeproj">
96-
</BuildableReference>
97-
</MacroExpansion>
84+
</BuildableProductRunnable>
9885
</ProfileAction>
9986
<AnalyzeAction
10087
buildConfiguration = "Debug">

FreeAPS/Sources/APS/FetchGlucoseManager.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
99
private let processQueue = DispatchQueue(label: "BaseGlucoseManager.processQueue")
1010
@Injected() var glucoseStorage: GlucoseStorage!
1111
@Injected() var nightscoutManager: NightscoutManager!
12+
@Injected() var libreLinkManager: LibreLinkManager!
1213
@Injected() var apsManager: APSManager!
1314
@Injected() var settingsManager: SettingsManager!
1415
@Injected() var libreTransmitter: LibreTransmitterSource!
1516
@Injected() var healthKitManager: HealthKitManager!
1617
@Injected() var deviceDataManager: DeviceDataManager!
18+
@Injected() private var keychain: Keychain!
1719

1820
private var lifetime = Lifetime()
1921
private let timer = DispatchTimer(timeInterval: 1.minutes.timeInterval)
@@ -83,8 +85,10 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
8385
self.glucoseStorage.storeGlucose(filtered)
8486
self.apsManager.heartbeat(date: date)
8587
self.nightscoutManager.uploadGlucose()
86-
let glucoseForHealth = filteredByDate.filter { !glucoseFromHealth.contains($0) }
8788

89+
self.libreLinkManager.uploadIfNeeded()
90+
91+
let glucoseForHealth = filteredByDate.filter { !glucoseFromHealth.contains($0) }
8892
guard glucoseForHealth.isNotEmpty else { return }
8993
self.healthKitManager.saveIfNeeded(bloodGlucose: glucoseForHealth)
9094
}

FreeAPS/Sources/Assemblies/NetworkAssembly.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ final class NetworkAssembly: Assembly {
88
}
99

1010
container.register(NightscoutManager.self) { r in BaseNightscoutManager(resolver: r) }
11+
container.register(LibreLinkManager.self) { r in BaseLibreLinkManager(resolver: r) }
1112
}
1213
}

FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ Enact a temp Basal or a temp target */
224224
/* */
225225
"Manual Temp Basal" = "Manual Temp Basal";
226226

227-
/* Allow uploads tp NS */
227+
/* Allow uploads to different services */
228228
"Allow uploads" = "Allow uploads";
229229

230230
/* API secret in NS */
@@ -1066,3 +1066,68 @@ Enact a temp Basal or a temp target */
10661066

10671067
/* "Noisy CGM Target Multiplier" */
10681068
"Defaults to 1.3. Increase target by this amount when looping off raw/noisy CGM data" = "Defaults to 1.3. Increase target by this amount when looping off raw/noisy CGM data";
1069+
1070+
/* Libre View --------------------*/
1071+
/* */
1072+
"LibreView config" = "LibreView config";
1073+
1074+
/* Secription on LibreView settings screen */
1075+
"To use LibreView, you need to enter credentials and create a connection" = "To use LibreView, you need to enter credentials and create a connection";
1076+
1077+
/* Button on LibreView settings screen */
1078+
"Update a connection" = "Update a connection";
1079+
1080+
/* Button on LibreView settings screen */
1081+
"Create a connection" = "Create a connection";
1082+
1083+
/* Setting on LibreView settings screen */
1084+
"Custom server" = "Custom server";
1085+
1086+
/* Section on LibreView settings screen */
1087+
"Connection settings" = "Connection settings";
1088+
1089+
/* Button on LibreView settings screen */
1090+
"Remove a connection" = "Remove a connection";
1091+
1092+
/* Alert message on LibreView settings screen */
1093+
"Please, set correct LibreView server" = "Please, set correct LibreView server";
1094+
1095+
/* Setting on LibreView settings screen */
1096+
"LibreView Server" = "LibreView Server";
1097+
1098+
/* Button on LibreView settings screen */
1099+
"Force upload glocose" = "Force upload glocose";
1100+
1101+
/* Message after success uploading of glusoce to LibreView server */
1102+
"Glucose was upload success" = "Glucose was upload success";
1103+
1104+
"Last upload date to LibreLink is more, that current date. Try later or check preferences" = "Last upload date to LibreLink is more, that current date. Try later or check preferences";
1105+
1106+
"Have not new glucose to upload" = "Have not new glucose to upload";
1107+
1108+
"Wrong connection's token" = "Wrong connection's token";
1109+
1110+
"Actions" = "Actions";
1111+
1112+
"Frequency of uploads" = "Frequency of uploads";
1113+
"Each Loop" = "Each Loop";
1114+
"Every 15 minutes" = "Every 15 minutes";
1115+
"Every 30 minutes" = "Every 30 minutes";
1116+
"Every hour" = "Every hour";
1117+
"Every 4 hours" = "Every 4 hours";
1118+
"Random upload, but less than 4 hours after the last one" = "Random upload, but less than 4 hours after the last one";
1119+
"It is recommended to use random uploads, they are more natural" = "It is recommended to use random uploads, they are more natural";
1120+
"Last upload on %@. Next upload no earlier than %@" = "Last upload on %@. Next upload no earlier than %@";
1121+
1122+
/* Credentials and autentification --------------------*/
1123+
/* */
1124+
"Credentials" = "Credentials";
1125+
1126+
/* */
1127+
"Login" = "Login";
1128+
1129+
/* */
1130+
"Password" = "Password";
1131+
1132+
/* */
1133+
"Wrong password or login" = "Wrong password or login";

FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ Enact a temp Basal or a temp target */
224224
/* */
225225
"Manual Temp Basal" = "Ручная ВБС";
226226

227-
/* Allow uploads tp NS */
227+
/* Allow uploads data to different services */
228228
"Allow uploads" = "Разрешить выгрузку";
229229

230230
/* API secret in NS */
@@ -1066,3 +1066,68 @@ Enact a temp Basal or a temp target */
10661066

10671067
/* "Noisy CGM Target Multiplier" */
10681068
"Defaults to 1.3. Increase target by this amount when looping off raw/noisy CGM data" = "По умолчанию 1,3. Увеличивает цель на эту величину, когда цикл отключается из за шума сенсора";
1069+
1070+
/* Libre View --------------------*/
1071+
/* */
1072+
"LibreView config" = "Настройки LibreView";
1073+
1074+
/* Secription on LibreView settings screen */
1075+
"To use LibreView, you need to enter credentials and create a connection" = "Для использования LibreView вам необходимо ввести данные авторизации и создать подключение";
1076+
1077+
/* Button on LibreView settings screen */
1078+
"Update a connection" = "Обновить подключение";
1079+
1080+
/* Button on LibreView settings screen */
1081+
"Create a connection" = "Создать подключение";
1082+
1083+
/* Setting on LibreView settings screen */
1084+
"Custom server" = "Собственный сервер";
1085+
1086+
/* Section on LibreView settings screen */
1087+
"Connection settings" = "Настройки подключения";
1088+
1089+
/* Button on LibreView settings screen */
1090+
"Remove a connection" = "Удалить подключение";
1091+
1092+
/* Alert message on LibreView settings screen */
1093+
"Please, set correct LibreView server" = "Пожалуйста, установите корректный адрес сервера";
1094+
1095+
/* Setting on LibreView settings screen */
1096+
"LibreView Server" = "Сервер LibreView";
1097+
1098+
/* Button on LibreView settings screen */
1099+
"Force upload glocose" = "Принудительная выгрузка глюкозы";
1100+
1101+
/* Message after success uploading of glusoce to LibreView server */
1102+
"Glucose was upload success" = "Глюкоза была успешно выгружена";
1103+
1104+
"Last upload date to LibreLink is more, that current date. Try later or check preferences" = "Дата последней выгрузки больше текущей даты. Попробуйте позже или проверьте настройки";
1105+
1106+
"Have not new glucose to upload" = "Новая глюкоза для выгрузки отсутсвует";
1107+
1108+
"Wrong connection's token" = "Неверный токен безопасности";
1109+
1110+
"Actions" = "Действия";
1111+
1112+
"Frequency of uploads" = "Частота выгрузки";
1113+
"Each Loop" = "Каждый цикл петли";
1114+
"Every 15 minutes" = "Каждые 15 минут";
1115+
"Every 30 minutes" = "Каждые 30 минут";
1116+
"Every hour" = "Каждый час";
1117+
"Every 4 hours" = "Каждые 4 часа";
1118+
"Random upload, but less than 4 hours after the last one" = "Случайные выгрузки, но не менее 1 раза в 4 часа";
1119+
"It is recommended to use random uploads, they are more natural" = "Рекомендовано использовать случайную частоту выгрузки, так как она более естественна";
1120+
"Last upload on %@. Next upload no earlier than %@" = "Последняя выгрузка %@. Следующая не ранее, чем %@";
1121+
1122+
/* Credentials and autentification --------------------*/
1123+
/* */
1124+
"Credentials" = "Данные для входа";
1125+
1126+
/* */
1127+
"Login" = "Логин";
1128+
1129+
/* */
1130+
"Password" = "Пароль";
1131+
1132+
/* */
1133+
"Wrong password or login" = "Неверный логин или пароль";

0 commit comments

Comments
 (0)