From 53e457f01b115f3ae68822f625d89254538f721c Mon Sep 17 00:00:00 2001 From: GPclips <14160706+GPclips@users.noreply.github.com> Date: Thu, 6 Aug 2020 16:16:34 +0200 Subject: [PATCH 01/27] Update ReadMe #395 (#973) https://github.com/corona-warn-app/cwa-documentation/issues/395 Co-authored-by: Philipp Woessner <64482866+pwoessner@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 42b078628d6..cc6619e1978 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ The following channels are available for discussions, feedback, and support requ | Type | Channel | | ------------------------ | ------------------------------------------------------ | | **General Discussion** | | -| **Feature Requests** | | +| **Feature Requests** | | | **Concept Feedback** | | | **Android App Issue** | | | **Backend Issue** | | From f98ac2dd5f8d757005887301b2af76eb9c93b782 Mon Sep 17 00:00:00 2001 From: Fabian-K Date: Fri, 7 Aug 2020 14:31:06 +0200 Subject: [PATCH 02/27] plausible deniability (#946) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added requestPadding property to all VerficationService requests * Added fake calls to the WebReqeustBuilder * 🚧 initial draft to enable plausible deniability * Switched from SubmissionConstants to KeyType enum everywhere * basic playbook implementation with fake and real requests * Playbook - ensure request pattern for playbooks is always the same VerificationService - apply padding to ensure equal request size (header & body) SecurityHelper - extract hash256 to HashHelper. This simplifies tests that use only the hash function (and therefore don´t need to initialize SecurityHelper and its dependencies) * Implemented random chance of dummy playbook execution on app open Signed-off-by: Kolya Opahle * Playbook - ignore exceptions for fake requests SubmissionService - add padding header to fake request for same header size WebRequestBuilder - include fake keys in upload (🏗) * DiagnosisKeyService: removed (low value & difficult to test) SubmissionService & SubmitDiagnosisKeysTransaction - inline playbook & backgroundNoise property to prevent issues during testing DiagnosisKeyConstantsTest, SubmissionServiceTest, SubmitDiagnosisKeysTransactionTest & SubmissionViewModelTest - adjusted to changes * Dummy playbook will now be repeated and delayed randomly Signed-off-by: Kolya Opahle * Linting Signed-off-by: Kolya Opahle * Initial Code for background noise worker Signed-off-by: Kolya Opahle * First implementation of noise background worker Signed-off-by: Kolya Opahle * Linting Signed-off-by: Kolya Opahle * PlaybookImpl - ensure that fake requests are executed when real requests fail SubmissionService & VerificationService - adjust header name for padding WebRequestBuilder - add padding to dummy submission * BackgroundNoise is now trigger-only PlaybookImpl - include follow-up executions after every playbook - logging SubmissionViewModel.kt, SubmissionService.kt, SubmitDiagnosisKeysTransaction.kt, MainActivity.kt, BackgroundNoisePeriodicWorker.kt, DiagnosisTestResultRetrievalPeriodicWorker.kt - propagate context for coroutine VerificationService - ensure body size of 1000 * WebRequestBuilder.kt - adjust fake key generation PlaybookImplTest.kt - remove unused server.enqueue SubmissionService.kt 6 SubmitDiagnosisKeysTransaction.kt - remove commented out code * revert temporary changes to SubmissionResultPositiveOtherWarningFragment.kt * Background job scheduling implemented Signed-off-by: Kolya Opahle * - adjust fake key size - remove temporary comment * Moved build work calls to own file to fix linting Signed-off-by: Kolya Opahle * - initialize coroutine scope within the playbook, revert passing it from outside - remove experimental test dependency for coroutines * - use single endpoint per server for fake requests - reduce request size from 1000 to 250 for the verification server - include dummy registration token in fake request to fulfill verification on server side - prepare for randomized count of submitted keys - always include headers cwa-authorization & cwa-header-padding for submission server * - simplify empty header using constant Co-authored-by: Kolya Opahle --- Corona-Warn-App/build.gradle | 1 + .../coronawarnapp/http/WebRequestBuilder.kt | 89 ++++++++-- .../http/playbook/BackgroundNoise.kt | 36 ++++ .../coronawarnapp/http/playbook/Playbook.kt | 24 +++ .../http/playbook/PlaybookImpl.kt | 144 +++++++++++++++ .../http/requests/RegistrationRequest.kt | 4 +- .../http/requests/RegistrationTokenRequest.kt | 6 +- .../http/requests/TanRequestBody.kt | 4 +- .../http/service/SubmissionService.kt | 3 +- .../http/service/VerificationService.kt | 3 + .../diagnosiskey/DiagnosisKeyConstants.kt | 8 +- .../diagnosiskey/DiagnosisKeyService.kt | 60 ------- .../service/submission/SubmissionConstants.kt | 37 +++- .../service/submission/SubmissionService.kt | 23 ++- .../SubmitDiagnosisKeysTransaction.kt | 30 ++-- .../rki/coronawarnapp/ui/main/MainActivity.kt | 10 ++ .../coronawarnapp/util/security/HashHelper.kt | 10 ++ .../util/security/SecurityHelper.kt | 7 - .../worker/BackgroundConstants.kt | 41 +++++ .../worker/BackgroundNoiseOneTimeWorker.kt | 46 +++++ .../worker/BackgroundNoisePeriodicWorker.kt | 64 +++++++ .../worker/BackgroundWorkBuilder.kt | 137 +++++++++++++++ .../worker/BackgroundWorkHelper.kt | 17 ++ .../worker/BackgroundWorkScheduler.kt | 128 ++++++-------- .../http/playbook/PlaybookImplTest.kt | 166 ++++++++++++++++++ .../http/service/SubmissionServiceTest.kt | 44 +++++ .../http/service/VerificationServiceTest.kt | 61 +++++++ .../diagnosiskey/DiagnosisKeyConstantsTest.kt | 14 +- .../submission/SubmissionConstantsTest.kt | 12 +- .../submission/SubmissionServiceTest.kt | 33 +++- .../SubmitDiagnosisKeysTransactionTest.kt | 38 +++- .../ui/viewmodel/SubmissionViewModelTest.kt | 18 ++ .../coronawarnapp/util/MockWebServerUtil.kt | 50 ++++++ .../src/main/proto/keyExportFormat.proto | 1 + 34 files changed, 1143 insertions(+), 226 deletions(-) create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/playbook/BackgroundNoise.kt create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/playbook/Playbook.kt create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/playbook/PlaybookImpl.kt delete mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/diagnosiskey/DiagnosisKeyService.kt create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/HashHelper.kt create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundNoiseOneTimeWorker.kt create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundNoisePeriodicWorker.kt create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundWorkBuilder.kt create mode 100644 Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/playbook/PlaybookImplTest.kt create mode 100644 Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/service/SubmissionServiceTest.kt create mode 100644 Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/service/VerificationServiceTest.kt create mode 100644 Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/MockWebServerUtil.kt diff --git a/Corona-Warn-App/build.gradle b/Corona-Warn-App/build.gradle index b458c3b2956..21ff433d908 100644 --- a/Corona-Warn-App/build.gradle +++ b/Corona-Warn-App/build.gradle @@ -249,6 +249,7 @@ dependencies { exclude group: 'com.google.protobuf' } testImplementation "io.mockk:mockk:1.10.0" + testImplementation "com.squareup.okhttp3:mockwebserver:4.8.0" testImplementation 'org.hamcrest:hamcrest-library:2.2' androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test.ext:junit:1.1.1' diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/WebRequestBuilder.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/WebRequestBuilder.kt index 5c6de861a45..b6dc003eb62 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/WebRequestBuilder.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/WebRequestBuilder.kt @@ -20,22 +20,24 @@ package de.rki.coronawarnapp.http import KeyExportFormat +import com.google.protobuf.ByteString import com.google.protobuf.InvalidProtocolBufferException import de.rki.coronawarnapp.exception.ApplicationConfigurationCorruptException import de.rki.coronawarnapp.exception.ApplicationConfigurationInvalidException -import de.rki.coronawarnapp.http.requests.RegistrationTokenRequest import de.rki.coronawarnapp.http.requests.RegistrationRequest +import de.rki.coronawarnapp.http.requests.RegistrationTokenRequest import de.rki.coronawarnapp.http.requests.TanRequestBody import de.rki.coronawarnapp.http.service.DistributionService import de.rki.coronawarnapp.http.service.SubmissionService import de.rki.coronawarnapp.http.service.VerificationService import de.rki.coronawarnapp.server.protocols.ApplicationConfigurationOuterClass.ApplicationConfiguration import de.rki.coronawarnapp.service.diagnosiskey.DiagnosisKeyConstants +import de.rki.coronawarnapp.service.submission.KeyType import de.rki.coronawarnapp.service.submission.SubmissionConstants import de.rki.coronawarnapp.storage.FileStorageHelper import de.rki.coronawarnapp.util.TimeAndDateExtensions.toServerFormat import de.rki.coronawarnapp.util.ZipHelper.unzip -import de.rki.coronawarnapp.util.security.SecurityHelper +import de.rki.coronawarnapp.util.security.HashHelper import de.rki.coronawarnapp.util.security.VerificationKeys import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext @@ -43,6 +45,7 @@ import timber.log.Timber import java.io.File import java.util.Date import java.util.UUID +import kotlin.math.max class WebRequestBuilder( private val distributionService: DistributionService, @@ -136,17 +139,24 @@ class WebRequestBuilder( suspend fun asyncGetRegistrationToken( key: String, - keyType: String + keyType: KeyType ): String = withContext(Dispatchers.IO) { - val keyStr = if (keyType == SubmissionConstants.QR_CODE_KEY_TYPE) { - SecurityHelper.hash256(key) + val keyStr = if (keyType == KeyType.GUID) { + HashHelper.hash256(key) } else { key } + + val paddingLength = when (keyType) { + KeyType.GUID -> SubmissionConstants.PADDING_LENGTH_BODY_REGISTRATION_TOKEN_GUID + KeyType.TELETAN -> SubmissionConstants.PADDING_LENGTH_BODY_REGISTRATION_TOKEN_TELETAN + } + verificationService.getRegistrationToken( SubmissionConstants.REGISTRATION_TOKEN_URL, "0", - RegistrationTokenRequest(keyType, keyStr) + requestPadding(SubmissionConstants.PADDING_LENGTH_HEADER_REGISTRATION_TOKEN), + RegistrationTokenRequest(keyType.name, keyStr, requestPadding(paddingLength)) ).registrationToken } @@ -155,7 +165,12 @@ class WebRequestBuilder( ): Int = withContext(Dispatchers.IO) { verificationService.getTestResult( SubmissionConstants.TEST_RESULT_URL, - "0", RegistrationRequest(registrationToken) + "0", + requestPadding(SubmissionConstants.PADDING_LENGTH_HEADER_TEST_RESULT), + RegistrationRequest( + registrationToken, + requestPadding(SubmissionConstants.PADDING_LENGTH_BODY_TEST_RESULT) + ) ).testResult } @@ -163,30 +178,78 @@ class WebRequestBuilder( registrationToken: String ): String = withContext(Dispatchers.IO) { verificationService.getTAN( - SubmissionConstants.TAN_REQUEST_URL, "0", + SubmissionConstants.TAN_REQUEST_URL, + "0", + requestPadding(SubmissionConstants.PADDING_LENGTH_HEADER_TAN), TanRequestBody( - registrationToken + registrationToken, + requestPadding(SubmissionConstants.PADDING_LENGTH_BODY_TAN) ) ).tan } + suspend fun asyncFakeVerification() = withContext(Dispatchers.IO) { + verificationService.getTAN( + SubmissionConstants.TAN_REQUEST_URL, + "1", + requestPadding(SubmissionConstants.PADDING_LENGTH_HEADER_TAN), + TanRequestBody( + registrationToken = SubmissionConstants.DUMMY_REGISTRATION_TOKEN, + requestPadding = requestPadding(SubmissionConstants.PADDING_LENGTH_BODY_TAN_FAKE) + ) + ) + } + suspend fun asyncSubmitKeysToServer( authCode: String, - faked: Boolean, keyList: List ) = withContext(Dispatchers.IO) { Timber.d("Writing ${keyList.size} Keys to the Submission Payload.") + + val randomAdditions = 0 // prepare for random addition of keys + val fakeKeyCount = + max(SubmissionConstants.minKeyCountForSubmission + randomAdditions - keyList.size, 0) + val fakeKeyPadding = requestPadding(SubmissionConstants.fakeKeySize * fakeKeyCount) + val submissionPayload = KeyExportFormat.SubmissionPayload.newBuilder() .addAllKeys(keyList) + .setPadding(ByteString.copyFromUtf8(fakeKeyPadding)) .build() - var fakeHeader = "0" - if (faked) fakeHeader = Math.random().toInt().toString() submissionService.submitKeys( DiagnosisKeyConstants.DIAGNOSIS_KEYS_SUBMISSION_URL, authCode, - fakeHeader, + "0", + SubmissionConstants.EMPTY_HEADER, submissionPayload ) return@withContext } + + suspend fun asyncFakeSubmission() = withContext(Dispatchers.IO) { + + val randomAdditions = 0 // prepare for random addition of keys + val fakeKeyCount = SubmissionConstants.minKeyCountForSubmission + randomAdditions + + val fakeKeyPadding = + requestPadding(SubmissionConstants.fakeKeySize * fakeKeyCount) + + val submissionPayload = KeyExportFormat.SubmissionPayload.newBuilder() + .setPadding(ByteString.copyFromUtf8(fakeKeyPadding)) + .build() + + submissionService.submitKeys( + DiagnosisKeyConstants.DIAGNOSIS_KEYS_SUBMISSION_URL, + SubmissionConstants.EMPTY_HEADER, + "1", + requestPadding(SubmissionConstants.PADDING_LENGTH_HEADER_SUBMISSION_FAKE), + submissionPayload + ) + } + + private fun requestPadding(length: Int): String { + val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9') + return (1..length) + .map { allowedChars.random() } + .joinToString("") + } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/playbook/BackgroundNoise.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/playbook/BackgroundNoise.kt new file mode 100644 index 00000000000..83032127d92 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/playbook/BackgroundNoise.kt @@ -0,0 +1,36 @@ +package de.rki.coronawarnapp.http.playbook + +import de.rki.coronawarnapp.http.WebRequestBuilder +import de.rki.coronawarnapp.service.submission.SubmissionConstants +import de.rki.coronawarnapp.storage.LocalData +import de.rki.coronawarnapp.worker.BackgroundWorkScheduler +import kotlin.random.Random + +class BackgroundNoise { + companion object { + @Volatile + private var instance: BackgroundNoise? = null + + fun getInstance(): BackgroundNoise { + return instance ?: synchronized(this) { + instance ?: BackgroundNoise().also { + instance = it + } + } + } + } + + fun scheduleDummyPattern() { + BackgroundWorkScheduler.scheduleBackgroundNoisePeriodicWork() + } + + suspend fun foregroundScheduleCheck() { + if (LocalData.isAllowedToSubmitDiagnosisKeys() == true) { + val chance = Random.nextFloat() * 100 + if (chance < SubmissionConstants.probabilityToExecutePlaybookWhenOpenApp) { + PlaybookImpl(WebRequestBuilder.getInstance()) + .dummy() + } + } + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/playbook/Playbook.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/playbook/Playbook.kt new file mode 100644 index 00000000000..7ed7537bc8a --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/playbook/Playbook.kt @@ -0,0 +1,24 @@ +package de.rki.coronawarnapp.http.playbook + +import KeyExportFormat +import de.rki.coronawarnapp.service.submission.KeyType +import de.rki.coronawarnapp.util.formatter.TestResult + +interface Playbook { + + suspend fun initialRegistration( + key: String, + keyType: KeyType + ): String /* registration token */ + + suspend fun testResult( + registrationToken: String + ): TestResult + + suspend fun submission( + registrationToken: String, + keys: List + ) + + suspend fun dummy() +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/playbook/PlaybookImpl.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/playbook/PlaybookImpl.kt new file mode 100644 index 00000000000..7ba36966d0b --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/playbook/PlaybookImpl.kt @@ -0,0 +1,144 @@ +package de.rki.coronawarnapp.http.playbook + +import KeyExportFormat +import de.rki.coronawarnapp.http.WebRequestBuilder +import de.rki.coronawarnapp.service.submission.KeyType +import de.rki.coronawarnapp.service.submission.SubmissionConstants +import de.rki.coronawarnapp.util.formatter.TestResult +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import timber.log.Timber +import java.util.UUID +import java.util.concurrent.TimeUnit +import kotlin.random.Random + +class PlaybookImpl( + private val webRequestBuilder: WebRequestBuilder +) : Playbook { + + private val uid = UUID.randomUUID().toString() + private val coroutineScope: CoroutineScope = CoroutineScope(Dispatchers.IO) + + override suspend fun initialRegistration(key: String, keyType: KeyType): String { + Timber.i("[$uid] New Initial Registration Playbook") + + // real registration + val (registrationToken, exception) = + executeCapturingExceptions { webRequestBuilder.asyncGetRegistrationToken(key, keyType) } + + // fake verification + ignoreExceptions { webRequestBuilder.asyncFakeVerification() } + + // fake submission + ignoreExceptions { webRequestBuilder.asyncFakeSubmission() } + + coroutineScope.launch { followUpPlaybooks() } + + return registrationToken ?: propagateException(exception) + } + + override suspend fun testResult(registrationToken: String): TestResult { + Timber.i("[$uid] New Test Result Playbook") + + // real test result + val (testResult, exception) = + executeCapturingExceptions { webRequestBuilder.asyncGetTestResult(registrationToken) } + + // fake verification + ignoreExceptions { webRequestBuilder.asyncFakeVerification() } + + // fake submission + ignoreExceptions { webRequestBuilder.asyncFakeSubmission() } + + coroutineScope.launch { followUpPlaybooks() } + + return testResult?.let { TestResult.fromInt(it) } + ?: propagateException(exception) + } + + override suspend fun submission( + registrationToken: String, + keys: List + ) { + Timber.i("[$uid] New Submission Playbook") + + // real auth code + val (authCode, exception) = executeCapturingExceptions { + webRequestBuilder.asyncGetTan( + registrationToken + ) + } + + // fake verification + ignoreExceptions { webRequestBuilder.asyncFakeVerification() } + + // real submission + if (authCode != null) { + webRequestBuilder.asyncSubmitKeysToServer(authCode, keys) + coroutineScope.launch { followUpPlaybooks() } + } else { + webRequestBuilder.asyncFakeSubmission() + coroutineScope.launch { followUpPlaybooks() } + propagateException(exception) + } + } + + private suspend fun dummy(launchFollowUp: Boolean) { + // fake verification + ignoreExceptions { webRequestBuilder.asyncFakeVerification() } + + // fake verification + ignoreExceptions { webRequestBuilder.asyncFakeVerification() } + + // fake submission + ignoreExceptions { webRequestBuilder.asyncFakeSubmission() } + + if (launchFollowUp) + coroutineScope.launch { followUpPlaybooks() } + } + + override suspend fun dummy() = dummy(true) + + private suspend fun followUpPlaybooks() { + val runsToExecute = Random.nextInt( + SubmissionConstants.minNumberOfSequentialPlaybooks, + SubmissionConstants.maxNumberOfSequentialPlaybooks + ) + Timber.i("[$uid] Follow Up: launching $runsToExecute follow up playbooks") + + repeat(runsToExecute) { + val executionDelay = Random.nextInt( + SubmissionConstants.minDelayBetweenSequentialPlaybooks, + SubmissionConstants.maxDelayBetweenSequentialPlaybooks + ) + Timber.i("[$uid] Follow Up: (${it + 1}/$runsToExecute) waiting $executionDelay[s]...") + delay(TimeUnit.SECONDS.toMillis(executionDelay.toLong())) + + dummy(false) + } + Timber.i("[$uid] Follow Up: finished") + } + + private suspend fun ignoreExceptions(body: suspend () -> Unit) { + try { + body.invoke() + } catch (e: Exception) { + Timber.d(e, "Ignoring dummy request exception") + } + } + + private suspend fun executeCapturingExceptions(body: suspend () -> T): Pair { + return try { + val result = body.invoke() + result to null + } catch (e: Exception) { + null to e + } + } + + private fun propagateException(exception: Exception?): Nothing { + throw exception ?: IllegalStateException() + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/requests/RegistrationRequest.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/requests/RegistrationRequest.kt index 78d7d1d62cf..6a20e507c21 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/requests/RegistrationRequest.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/requests/RegistrationRequest.kt @@ -4,5 +4,7 @@ import com.google.gson.annotations.SerializedName data class RegistrationRequest( @SerializedName("registrationToken") - val registrationToken: String + val registrationToken: String? = null, + @SerializedName("requestPadding") + val requestPadding: String? = null ) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/requests/RegistrationTokenRequest.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/requests/RegistrationTokenRequest.kt index 64b51092bc8..9667101c70a 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/requests/RegistrationTokenRequest.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/requests/RegistrationTokenRequest.kt @@ -4,7 +4,9 @@ import com.google.gson.annotations.SerializedName data class RegistrationTokenRequest( @SerializedName("keyType") - val keyType: String, + val keyType: String? = null, @SerializedName("key") - val key: String + val key: String? = null, + @SerializedName("requestPadding") + val requestPadding: String? = null ) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/requests/TanRequestBody.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/requests/TanRequestBody.kt index a06f7aa9b56..ce6c1235515 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/requests/TanRequestBody.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/requests/TanRequestBody.kt @@ -4,5 +4,7 @@ import com.google.gson.annotations.SerializedName data class TanRequestBody( @SerializedName("registrationToken") - val registrationToken: String + val registrationToken: String? = null, + @SerializedName("requestPadding") + val requestPadding: String? = null ) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/service/SubmissionService.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/service/SubmissionService.kt index 13e8fca37c6..a2092edea1a 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/service/SubmissionService.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/service/SubmissionService.kt @@ -11,8 +11,9 @@ interface SubmissionService { @POST suspend fun submitKeys( @Url url: String, - @Header("cwa-authorization") authCode: String, + @Header("cwa-authorization") authCode: String?, @Header("cwa-fake") fake: String, + @Header("cwa-header-padding") headerPadding: String?, @Body requestBody: KeyExportFormat.SubmissionPayload ): ResponseBody } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/service/VerificationService.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/service/VerificationService.kt index 4f47c3bedf0..9974fe50fa5 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/service/VerificationService.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/service/VerificationService.kt @@ -17,6 +17,7 @@ interface VerificationService { suspend fun getRegistrationToken( @Url url: String, @Header("cwa-fake") fake: String, + @Header("cwa-header-padding") headerPadding: String?, @Body requestBody: RegistrationTokenRequest ): RegistrationTokenResponse @@ -24,6 +25,7 @@ interface VerificationService { suspend fun getTestResult( @Url url: String, @Header("cwa-fake") fake: String, + @Header("cwa-header-padding") headerPadding: String?, @Body request: RegistrationRequest ): TestResultResponse @@ -31,6 +33,7 @@ interface VerificationService { suspend fun getTAN( @Url url: String, @Header("cwa-fake") fake: String, + @Header("cwa-header-padding") headerPadding: String?, @Body requestBody: TanRequestBody ): TanResponse } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/diagnosiskey/DiagnosisKeyConstants.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/diagnosiskey/DiagnosisKeyConstants.kt index 2121c167960..c9010f1086d 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/diagnosiskey/DiagnosisKeyConstants.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/diagnosiskey/DiagnosisKeyConstants.kt @@ -20,9 +20,7 @@ package de.rki.coronawarnapp.service.diagnosiskey /** - * The Diagnosis Key constants are used inside the DiagnosisKeyService - * - * @see DiagnosisKeyService + * The Diagnosis Key constants */ object DiagnosisKeyConstants { /** version resource variable for REST-like Service Calls */ @@ -51,10 +49,10 @@ object DiagnosisKeyConstants { private var CURRENT_COUNTRY = "DE" /** Distribution URL built from CDN URL's and REST resources */ - private var VERSIONED_DISTRIBUTION_CDN_URL = "/$VERSION/$CURRENT_VERSION" + private var VERSIONED_DISTRIBUTION_CDN_URL = "$VERSION/$CURRENT_VERSION" /** Submission URL built from CDN URL's and REST resources */ - private var VERSIONED_SUBMISSION_CDN_URL = "/$VERSION/$CURRENT_VERSION" + private var VERSIONED_SUBMISSION_CDN_URL = "$VERSION/$CURRENT_VERSION" /** Parameter Download URL built from CDN URL's and REST resources */ private val PARAMETERS_DOWNLOAD_URL = "$VERSIONED_DISTRIBUTION_CDN_URL/$PARAMETERS" diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/diagnosiskey/DiagnosisKeyService.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/diagnosiskey/DiagnosisKeyService.kt deleted file mode 100644 index c2dc27c88dc..00000000000 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/diagnosiskey/DiagnosisKeyService.kt +++ /dev/null @@ -1,60 +0,0 @@ -/****************************************************************************** - * Corona-Warn-App * - * * - * SAP SE and all other contributors / * - * copyright owners license this file to you under the Apache * - * License, Version 2.0 (the "License"); you may not use this * - * file except in compliance with the License. * - * You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ******************************************************************************/ - -package de.rki.coronawarnapp.service.diagnosiskey - -import KeyExportFormat -import de.rki.coronawarnapp.exception.DiagnosisKeyRetrievalException -import de.rki.coronawarnapp.exception.DiagnosisKeySubmissionException -import de.rki.coronawarnapp.http.WebRequestBuilder -import timber.log.Timber - -/** - * The Diagnosis Key Service is used to interact with the Server to submit and retrieve keys through - * predefined structures. - * - * @throws DiagnosisKeyRetrievalException An Exception thrown when an error occurs during Key Retrieval from the Server - * @throws DiagnosisKeySubmissionException An Exception thrown when an error occurs during Key Reporting to the Server - */ -object DiagnosisKeyService { - - private val TAG: String? = DiagnosisKeyService::class.simpleName - - /** - * Asynchronously submits keys to the Server with the WebRequestBuilder by retrieving - * keys out of the Google API. - * - * - * @throws de.rki.coronawarnapp.exception.DiagnosisKeySubmissionException An Exception thrown when an error occurs during Key Reporting to the Server - * - * @param authCode - TAN Authorization Code used to validate the request - * @param keysToReport - KeyList in the Server Format to submit to the Server - */ - suspend fun asyncSubmitKeys( - authCode: String, - keysToReport: List - ) { - Timber.d("Diagnosis Keys will be submitted.") - WebRequestBuilder.getInstance().asyncSubmitKeysToServer( - authCode, - false, - keysToReport - ) - } -} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/submission/SubmissionConstants.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/submission/SubmissionConstants.kt index 4150a275b99..eabb63b2fcf 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/submission/SubmissionConstants.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/submission/SubmissionConstants.kt @@ -10,9 +10,6 @@ object SubmissionConstants { private val VERSIONED_VERIFICATION_CDN_URL = "$VERSION/$CURRENT_VERSION" - const val QR_CODE_KEY_TYPE = "GUID" - const val TELE_TAN_KEY_TYPE = "TELETAN" - val REGISTRATION_TOKEN_URL = "$VERSIONED_VERIFICATION_CDN_URL/$REGISTRATION_TOKEN" val TEST_RESULT_URL = "$VERSIONED_VERIFICATION_CDN_URL/$TEST_RESULT" val TAN_REQUEST_URL = "$VERSIONED_VERIFICATION_CDN_URL/$TAN" @@ -22,4 +19,38 @@ object SubmissionConstants { const val GUID_SEPARATOR = '?' const val SERVER_ERROR_CODE_400 = 400 + + const val EMPTY_HEADER = "" + + // padding registration token + private const val VERIFICATION_BODY_FILL = 139 + + const val PADDING_LENGTH_HEADER_REGISTRATION_TOKEN = 0 + const val PADDING_LENGTH_BODY_REGISTRATION_TOKEN_TELETAN = 51 + VERIFICATION_BODY_FILL + const val PADDING_LENGTH_BODY_REGISTRATION_TOKEN_GUID = 0 + VERIFICATION_BODY_FILL + + // padding test result + const val PADDING_LENGTH_HEADER_TEST_RESULT = 7 + const val PADDING_LENGTH_BODY_TEST_RESULT = 31 + VERIFICATION_BODY_FILL + + // padding tan + const val PADDING_LENGTH_HEADER_TAN = 14 + const val PADDING_LENGTH_BODY_TAN = 31 + VERIFICATION_BODY_FILL + const val PADDING_LENGTH_BODY_TAN_FAKE = 31 + VERIFICATION_BODY_FILL + const val DUMMY_REGISTRATION_TOKEN = "11111111-2222-4444-8888-161616161616" + + const val PADDING_LENGTH_HEADER_SUBMISSION_FAKE = 36 + + const val probabilityToExecutePlaybookWhenOpenApp = 1f + const val minNumberOfSequentialPlaybooks = 1 + const val maxNumberOfSequentialPlaybooks = 3 + const val minDelayBetweenSequentialPlaybooks = 5 + const val maxDelayBetweenSequentialPlaybooks = 10 + + const val minKeyCountForSubmission = 14 + const val fakeKeySize = (1 * 16 /* key data*/) + (3 * 4 /* 3x int32*/) +} + +enum class KeyType { + GUID, TELETAN; } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/submission/SubmissionService.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/submission/SubmissionService.kt index a5026b3fe8f..10dc0ec346f 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/submission/SubmissionService.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/submission/SubmissionService.kt @@ -4,14 +4,15 @@ import com.google.android.gms.nearby.exposurenotification.TemporaryExposureKey import de.rki.coronawarnapp.exception.NoGUIDOrTANSetException import de.rki.coronawarnapp.exception.NoRegistrationTokenSetException import de.rki.coronawarnapp.http.WebRequestBuilder -import de.rki.coronawarnapp.service.submission.SubmissionConstants.QR_CODE_KEY_TYPE -import de.rki.coronawarnapp.service.submission.SubmissionConstants.TELE_TAN_KEY_TYPE +import de.rki.coronawarnapp.http.playbook.BackgroundNoise +import de.rki.coronawarnapp.http.playbook.PlaybookImpl import de.rki.coronawarnapp.storage.LocalData import de.rki.coronawarnapp.transaction.SubmitDiagnosisKeysTransaction import de.rki.coronawarnapp.util.formatter.TestResult import de.rki.coronawarnapp.worker.BackgroundWorkScheduler object SubmissionService { + suspend fun asyncRegisterDevice() { val testGUID = LocalData.testGUID() val testTAN = LocalData.teletan() @@ -22,13 +23,14 @@ object SubmissionService { else -> throw NoGUIDOrTANSetException() } LocalData.devicePairingSuccessfulTimestamp(System.currentTimeMillis()) + BackgroundNoise.getInstance().scheduleDummyPattern() } private suspend fun asyncRegisterDeviceViaGUID(guid: String) { val registrationToken = - WebRequestBuilder.getInstance().asyncGetRegistrationToken( + PlaybookImpl(WebRequestBuilder.getInstance()).initialRegistration( guid, - QR_CODE_KEY_TYPE + KeyType.GUID ) LocalData.registrationToken(registrationToken) @@ -37,19 +39,15 @@ object SubmissionService { private suspend fun asyncRegisterDeviceViaTAN(tan: String) { val registrationToken = - WebRequestBuilder.getInstance().asyncGetRegistrationToken( + PlaybookImpl(WebRequestBuilder.getInstance()).initialRegistration( tan, - TELE_TAN_KEY_TYPE + KeyType.TELETAN ) LocalData.registrationToken(registrationToken) deleteTeleTAN() } - suspend fun asyncRequestAuthCode(registrationToken: String): String { - return WebRequestBuilder.getInstance().asyncGetTan(registrationToken) - } - suspend fun asyncSubmitExposureKeys(keys: List) { val registrationToken = LocalData.registrationToken() ?: throw NoRegistrationTokenSetException() @@ -59,9 +57,8 @@ object SubmissionService { suspend fun asyncRequestTestResult(): TestResult { val registrationToken = LocalData.registrationToken() ?: throw NoRegistrationTokenSetException() - return TestResult.fromInt( - WebRequestBuilder.getInstance().asyncGetTestResult(registrationToken) - ) + + return PlaybookImpl(WebRequestBuilder.getInstance()).testResult(registrationToken) } fun containsValidGUID(scanResult: String): Boolean { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/SubmitDiagnosisKeysTransaction.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/SubmitDiagnosisKeysTransaction.kt index b9a5d52c8dc..326cffe113f 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/SubmitDiagnosisKeysTransaction.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/SubmitDiagnosisKeysTransaction.kt @@ -1,13 +1,13 @@ package de.rki.coronawarnapp.transaction import com.google.android.gms.nearby.exposurenotification.TemporaryExposureKey -import de.rki.coronawarnapp.service.diagnosiskey.DiagnosisKeyService +import de.rki.coronawarnapp.http.WebRequestBuilder +import de.rki.coronawarnapp.http.playbook.PlaybookImpl import de.rki.coronawarnapp.service.submission.SubmissionService import de.rki.coronawarnapp.transaction.SubmitDiagnosisKeysTransaction.SubmitDiagnosisKeysTransactionState.CLOSE -import de.rki.coronawarnapp.transaction.SubmitDiagnosisKeysTransaction.SubmitDiagnosisKeysTransactionState.RETRIEVE_TAN +import de.rki.coronawarnapp.transaction.SubmitDiagnosisKeysTransaction.SubmitDiagnosisKeysTransactionState.RETRIEVE_TAN_AND_SUBMIT_KEYS import de.rki.coronawarnapp.transaction.SubmitDiagnosisKeysTransaction.SubmitDiagnosisKeysTransactionState.RETRIEVE_TEMPORARY_EXPOSURE_KEY_HISTORY import de.rki.coronawarnapp.transaction.SubmitDiagnosisKeysTransaction.SubmitDiagnosisKeysTransactionState.STORE_SUCCESS -import de.rki.coronawarnapp.transaction.SubmitDiagnosisKeysTransaction.SubmitDiagnosisKeysTransactionState.SUBMIT_KEYS import de.rki.coronawarnapp.util.ProtoFormatConverterExtensions.limitKeyCount import de.rki.coronawarnapp.util.ProtoFormatConverterExtensions.transformKeyHistoryToExternalFormat @@ -41,22 +41,17 @@ object SubmitDiagnosisKeysTransaction : Transaction() { /** possible transaction states */ private enum class SubmitDiagnosisKeysTransactionState : TransactionState { - RETRIEVE_TAN, RETRIEVE_TEMPORARY_EXPOSURE_KEY_HISTORY, - SUBMIT_KEYS, + RETRIEVE_TAN_AND_SUBMIT_KEYS, STORE_SUCCESS, CLOSE } /** initiates the transaction. This suspend function guarantees a successful transaction once completed. */ - suspend fun start(registrationToken: String, keys: List) = lockAndExecuteUnique { - /**************************************************** - * RETRIEVE TAN - ****************************************************/ - val authCode = executeState(RETRIEVE_TAN) { - SubmissionService.asyncRequestAuthCode(registrationToken) - } - + suspend fun start( + registrationToken: String, + keys: List + ) = lockAndExecuteUnique { /**************************************************** * RETRIEVE TEMPORARY EXPOSURE KEY HISTORY ****************************************************/ @@ -65,10 +60,13 @@ object SubmitDiagnosisKeysTransaction : Transaction() { .transformKeyHistoryToExternalFormat() } /**************************************************** - * SUBMIT KEYS + * RETRIEVE TAN & SUBMIT KEYS ****************************************************/ - executeState(SUBMIT_KEYS) { - DiagnosisKeyService.asyncSubmitKeys(authCode, temporaryExposureKeyList) + executeState(RETRIEVE_TAN_AND_SUBMIT_KEYS) { + PlaybookImpl(WebRequestBuilder.getInstance()).submission( + registrationToken, + temporaryExposureKeyList + ) } /**************************************************** * STORE SUCCESS diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivity.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivity.kt index 2302135b625..fd3d3941807 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivity.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivity.kt @@ -9,14 +9,17 @@ import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.lifecycle.ViewModelProviders +import androidx.lifecycle.lifecycleScope import de.rki.coronawarnapp.R import de.rki.coronawarnapp.storage.LocalData +import de.rki.coronawarnapp.http.playbook.BackgroundNoise import de.rki.coronawarnapp.ui.viewmodel.SettingsViewModel import de.rki.coronawarnapp.util.ConnectivityHelper import de.rki.coronawarnapp.util.DialogHelper import de.rki.coronawarnapp.util.ExternalActionHelper import de.rki.coronawarnapp.util.PowerManagementHelper import de.rki.coronawarnapp.worker.BackgroundWorkScheduler +import kotlinx.coroutines.launch /** * This activity holds all the fragments (except onboarding) and also registers a listener for @@ -96,6 +99,13 @@ class MainActivity : AppCompatActivity() { settingsViewModel.updateBackgroundJobEnabled(ConnectivityHelper.autoModeEnabled(this)) scheduleWork() checkShouldDisplayBackgroundWarning() + doBackgroundNoiseCheck() + } + + private fun doBackgroundNoiseCheck() { + lifecycleScope.launch { + BackgroundNoise.getInstance().foregroundScheduleCheck() + } } private fun showEnergyOptimizedEnabledForBackground() { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/HashHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/HashHelper.kt new file mode 100644 index 00000000000..b0726ae7c3d --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/HashHelper.kt @@ -0,0 +1,10 @@ +package de.rki.coronawarnapp.util.security + +import java.security.MessageDigest + +object HashHelper { + fun hash256(input: String): String = MessageDigest + .getInstance(SecurityConstants.DIGEST_ALGORITHM) + .digest(input.toByteArray()) + .fold("", { str, it -> str + "%02x".format(it) }) +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/SecurityHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/SecurityHelper.kt index 3b77bc8a155..57617a039fa 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/SecurityHelper.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/SecurityHelper.kt @@ -31,9 +31,7 @@ import de.rki.coronawarnapp.exception.CwaSecurityException import de.rki.coronawarnapp.util.security.SecurityConstants.CWA_APP_SQLITE_DB_PW import de.rki.coronawarnapp.util.security.SecurityConstants.DB_PASSWORD_MAX_LENGTH import de.rki.coronawarnapp.util.security.SecurityConstants.DB_PASSWORD_MIN_LENGTH -import de.rki.coronawarnapp.util.security.SecurityConstants.DIGEST_ALGORITHM import de.rki.coronawarnapp.util.security.SecurityConstants.ENCRYPTED_SHARED_PREFERENCES_FILE -import java.security.MessageDigest import java.security.SecureRandom /** @@ -110,11 +108,6 @@ object SecurityHelper { return password } - fun hash256(input: String): String = MessageDigest - .getInstance(DIGEST_ALGORITHM) - .digest(input.toByteArray()) - .fold("", { str, it -> str + "%02x".format(it) }) - fun withSecurityCatch(doInCatch: () -> T) = try { doInCatch.invoke() } catch (e: Exception) { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundConstants.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundConstants.kt index df62ad1ccc6..8f7c14ffae0 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundConstants.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundConstants.kt @@ -24,6 +24,16 @@ object BackgroundConstants { */ const val DIAGNOSIS_TEST_RESULT_PERIODIC_WORKER_TAG = "DIAGNOSIS_TEST_RESULT_PERIODIC_WORKER" + /** + * Tag for background noise playbook periodic work + */ + const val BACKGROUND_NOISE_PERIODIC_WORKER_TAG = "BACKGROUND_NOISE_PERIODIC_WORKER" + + /** + * Tag for background noise playbook one time work + */ + const val BACKGROUND_NOISE_ONE_TIME_WORKER_TAG = "BACKGROUND_NOISE_PERIODIC_WORKER" + /** * Unique name for diagnosis key retrieval one time work */ @@ -39,6 +49,16 @@ object BackgroundConstants { */ const val DIAGNOSIS_TEST_RESULT_PERIODIC_WORK_NAME = "DiagnosisTestResultBackgroundPeriodicWork" + /** + * Unique name for background noise playbook periodic work + */ + const val BACKGROUND_NOISE_PERIODIC_WORK_NAME = "BackgroundNoisePeriodicWork" + + /** + * Unique name for background noise playbook one time work + */ + const val BACKGROUND_NOISE_ONE_TIME_WORK_NAME = "BackgroundNoiseOneTimeWork" + /** * Total minutes in one day */ @@ -94,4 +114,25 @@ object BackgroundConstants { * @see TimeUnit.MINUTES */ const val BACKOFF_INITIAL_DELAY = 8L + + /** + * The minimum time in hours to wait between playbook executions + * + * @see TimeUnit.HOURS + */ + const val MIN_HOURS_TO_NEXT_BACKGROUND_NOISE_EXECUTION = 4L + + /** + * The maximum time in hours to wait between playbook executions + * + * @see TimeUnit.HOURS + */ + const val MAX_HOURS_TO_NEXT_BACKGROUND_NOISE_EXECUTION = 12L + + /** + * The total time in days to run the playbook + * + * @see TimeUnit.DAYS + */ + const val NUMBER_OF_DAYS_TO_RUN_PLAYBOOK = 16 } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundNoiseOneTimeWorker.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundNoiseOneTimeWorker.kt new file mode 100644 index 00000000000..87e9a8c5517 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundNoiseOneTimeWorker.kt @@ -0,0 +1,46 @@ +package de.rki.coronawarnapp.worker + +import android.content.Context +import androidx.work.CoroutineWorker +import androidx.work.WorkerParameters +import de.rki.coronawarnapp.http.WebRequestBuilder +import de.rki.coronawarnapp.http.playbook.PlaybookImpl + +/** + * One time background noise worker + * + * @see BackgroundWorkScheduler + */ +class BackgroundNoiseOneTimeWorker( + val context: Context, + workerParams: WorkerParameters +) : + CoroutineWorker(context, workerParams) { + + companion object { + private val TAG: String? = BackgroundNoiseOneTimeWorker::class.simpleName + } + + /** + * Work execution + * + * @return Result + */ + override suspend fun doWork(): Result { + var result = Result.success() + + try { + PlaybookImpl(WebRequestBuilder.getInstance()) + .dummy() + } catch (e: Exception) { + // TODO: Should we even retry here? + result = if (runAttemptCount > BackgroundConstants.WORKER_RETRY_COUNT_THRESHOLD) { + Result.failure() + } else { + Result.retry() + } + } + + return result + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundNoisePeriodicWorker.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundNoisePeriodicWorker.kt new file mode 100644 index 00000000000..3b9a93eb9fd --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundNoisePeriodicWorker.kt @@ -0,0 +1,64 @@ +package de.rki.coronawarnapp.worker + +import android.content.Context +import androidx.work.CoroutineWorker +import androidx.work.WorkerParameters +import de.rki.coronawarnapp.storage.LocalData +import de.rki.coronawarnapp.worker.BackgroundWorkScheduler.stop +import org.joda.time.DateTime +import org.joda.time.DateTimeZone +import timber.log.Timber + +/** + * Periodic background noise worker + * + * @see BackgroundWorkScheduler + */ +class BackgroundNoisePeriodicWorker( + val context: Context, + workerParams: WorkerParameters +) : + CoroutineWorker(context, workerParams) { + + companion object { + private val TAG: String? = BackgroundNoisePeriodicWorker::class.simpleName + } + + /** + * Work execution + * + * @return Result + * + * @see BackgroundConstants.NUMBER_OF_DAYS_TO_RUN_PLAYBOOK + */ + override suspend fun doWork(): Result { + Timber.d("Background job started. Run attempt: $runAttemptCount") + + var result = Result.success() + try { + val initialPairingDate = DateTime( + LocalData.devicePairingSuccessfulTimestamp(), + DateTimeZone.UTC + ) + + // Check if the numberOfDaysToRunPlaybook are over + if (initialPairingDate.plusDays(BackgroundConstants.NUMBER_OF_DAYS_TO_RUN_PLAYBOOK).isBeforeNow) { + stopWorker() + return result + } + + BackgroundWorkScheduler.scheduleBackgroundNoiseOneTimeWork() + } catch (e: Exception) { + result = if (runAttemptCount > BackgroundConstants.WORKER_RETRY_COUNT_THRESHOLD) { + Result.failure() + } else { + Result.retry() + } + } + return result + } + + private fun stopWorker() { + BackgroundWorkScheduler.WorkType.BACKGROUND_NOISE_PERIODIC_WORK.stop() + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundWorkBuilder.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundWorkBuilder.kt new file mode 100644 index 00000000000..4578ebaac7e --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundWorkBuilder.kt @@ -0,0 +1,137 @@ +package de.rki.coronawarnapp.worker + +import androidx.work.BackoffPolicy +import androidx.work.OneTimeWorkRequestBuilder +import androidx.work.PeriodicWorkRequestBuilder +import de.rki.coronawarnapp.worker.BackgroundWorkScheduler.WorkTag +import java.util.concurrent.TimeUnit + +/** + * Build diagnosis key periodic work request + * Set "kind delay" for accessibility reason. + * Backoff criteria set to Linear type. + * + * @return PeriodicWorkRequest + * + * @see WorkTag.DIAGNOSIS_KEY_RETRIEVAL_PERIODIC_WORKER + * @see BackgroundConstants.KIND_DELAY + * @see BackgroundConstants.BACKOFF_INITIAL_DELAY + * @see BackoffPolicy.LINEAR + */ +fun buildDiagnosisKeyRetrievalPeriodicWork() = + PeriodicWorkRequestBuilder( + BackgroundWorkHelper.getDiagnosisKeyRetrievalPeriodicWorkTimeInterval(), TimeUnit.MINUTES + ) + .addTag(WorkTag.DIAGNOSIS_KEY_RETRIEVAL_PERIODIC_WORKER.tag) + .setInitialDelay( + BackgroundConstants.KIND_DELAY, + TimeUnit.MINUTES + ) + .setBackoffCriteria( + BackoffPolicy.EXPONENTIAL, + BackgroundConstants.BACKOFF_INITIAL_DELAY, + TimeUnit.MINUTES + ) + .build() + +/** + * Build diagnosis key one time work request + * Set random initial delay for security reason. + * Backoff criteria set to Linear type. + * + * @return OneTimeWorkRequest + * + * @see WorkTag.DIAGNOSIS_KEY_RETRIEVAL_ONE_TIME_WORKER + * @see buildDiagnosisKeyRetrievalOneTimeWork + * @see BackgroundConstants.BACKOFF_INITIAL_DELAY + * @see BackoffPolicy.LINEAR + */ +fun buildDiagnosisKeyRetrievalOneTimeWork() = + OneTimeWorkRequestBuilder() + .addTag(WorkTag.DIAGNOSIS_KEY_RETRIEVAL_ONE_TIME_WORKER.tag) + .setConstraints(BackgroundWorkHelper.getConstraintsForDiagnosisKeyOneTimeBackgroundWork()) + .setInitialDelay( + BackgroundConstants.KIND_DELAY, + TimeUnit.MINUTES + ) + .setBackoffCriteria( + BackoffPolicy.EXPONENTIAL, + BackgroundConstants.BACKOFF_INITIAL_DELAY, + TimeUnit.MINUTES + ) + .build() + +/** + * Build diagnosis Test Result periodic work request + * Set "kind delay" for accessibility reason. + * + * @return PeriodicWorkRequest + * + * @see WorkTag.DIAGNOSIS_TEST_RESULT_RETRIEVAL_PERIODIC_WORKER + * @see BackgroundConstants.KIND_DELAY + */ +fun buildDiagnosisTestResultRetrievalPeriodicWork() = + PeriodicWorkRequestBuilder( + BackgroundWorkHelper.getDiagnosisTestResultRetrievalPeriodicWorkTimeInterval(), + TimeUnit.MINUTES + ) + .addTag(WorkTag.DIAGNOSIS_TEST_RESULT_RETRIEVAL_PERIODIC_WORKER.tag) + .setConstraints(BackgroundWorkHelper.getConstraintsForDiagnosisKeyOneTimeBackgroundWork()) + .setInitialDelay( + BackgroundConstants.DIAGNOSIS_TEST_RESULT_PERIODIC_INITIAL_DELAY, + TimeUnit.SECONDS + ).setBackoffCriteria( + BackoffPolicy.LINEAR, + BackgroundConstants.KIND_DELAY, + TimeUnit.MINUTES + ) + .build() + +/** + * Build background noise one time work request + * Set BackgroundNoiseOneTimeWorkDelay for timing randomness. + * + * @return PeriodicWorkRequest + * + * @see WorkTag.BACKGROUND_NOISE_ONE_TIME_WORKER + * @see BackgroundWorkHelper.getBackgroundNoiseOneTimeWorkDelay + */ +fun buildBackgroundNoiseOneTimeWork() = + OneTimeWorkRequestBuilder() + .addTag(WorkTag.BACKGROUND_NOISE_ONE_TIME_WORKER.tag) + .setConstraints(BackgroundWorkHelper.getConstraintsForDiagnosisKeyOneTimeBackgroundWork()) + .setInitialDelay( + BackgroundWorkHelper.getBackgroundNoiseOneTimeWorkDelay(), + TimeUnit.HOURS + ).setBackoffCriteria( + BackoffPolicy.LINEAR, + BackgroundConstants.KIND_DELAY, + TimeUnit.MINUTES + ) + .build() + +/** + * Build background noise periodic work request + * Set "kind delay" for accessibility reason. + * + * @return PeriodicWorkRequest + * + * @see BackgroundConstants.MIN_HOURS_TO_NEXT_BACKGROUND_NOISE_EXECUTION + * @see WorkTag.BACKGROUND_NOISE_PERIODIC_WORKER + * @see BackgroundConstants.KIND_DELAY + */ +fun buildBackgroundNoisePeriodicWork() = + PeriodicWorkRequestBuilder( + BackgroundConstants.MIN_HOURS_TO_NEXT_BACKGROUND_NOISE_EXECUTION, + TimeUnit.HOURS + ) + .addTag(WorkTag.BACKGROUND_NOISE_PERIODIC_WORKER.tag) + .setInitialDelay( + BackgroundConstants.KIND_DELAY, + TimeUnit.SECONDS + ).setBackoffCriteria( + BackoffPolicy.LINEAR, + BackgroundConstants.KIND_DELAY, + TimeUnit.MINUTES + ) + .build() diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundWorkHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundWorkHelper.kt index ddaac2c8a35..c7e797fa3a0 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundWorkHelper.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundWorkHelper.kt @@ -5,6 +5,7 @@ import androidx.work.Constraints import androidx.work.NetworkType import de.rki.coronawarnapp.notification.NotificationHelper import de.rki.coronawarnapp.storage.LocalData +import kotlin.random.Random /** * Singleton class for background work helper functions @@ -49,6 +50,22 @@ object BackgroundWorkHelper { BackgroundConstants.DIAGNOSIS_KEY_RETRIEVAL_TRIES_PER_DAY .coerceAtMost(BackgroundConstants.GOOGLE_API_MAX_CALLS_PER_DAY) + /** + * Get background noise one time work delay + * The periodic job is already delayed by MIN_HOURS_TO_NEXT_BACKGROUND_NOISE_EXECUTION + * so we only need to delay further by the difference between min and max. + * + * @return Long + * + * @see BackgroundConstants.MAX_HOURS_TO_NEXT_BACKGROUND_NOISE_EXECUTION + * @see BackgroundConstants.MIN_HOURS_TO_NEXT_BACKGROUND_NOISE_EXECUTION + */ + fun getBackgroundNoiseOneTimeWorkDelay() = Random.nextLong( + 0, + BackgroundConstants.MAX_HOURS_TO_NEXT_BACKGROUND_NOISE_EXECUTION - + BackgroundConstants.MIN_HOURS_TO_NEXT_BACKGROUND_NOISE_EXECUTION + ) + /** * Constraints for diagnosis key one time work * Requires battery not low and any network connection diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundWorkScheduler.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundWorkScheduler.kt index 02a7c2e7c53..51ca8ea55de 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundWorkScheduler.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundWorkScheduler.kt @@ -1,19 +1,15 @@ package de.rki.coronawarnapp.worker -import androidx.work.BackoffPolicy import androidx.work.ExistingPeriodicWorkPolicy import androidx.work.ExistingWorkPolicy -import androidx.work.OneTimeWorkRequestBuilder import androidx.work.Operation -import androidx.work.PeriodicWorkRequestBuilder -import androidx.work.WorkInfo import androidx.work.WorkManager +import androidx.work.WorkInfo import de.rki.coronawarnapp.BuildConfig import de.rki.coronawarnapp.CoronaWarnApplication import de.rki.coronawarnapp.storage.LocalData import timber.log.Timber import java.util.concurrent.ExecutionException -import java.util.concurrent.TimeUnit /** * Singleton class for background work handling @@ -32,11 +28,15 @@ object BackgroundWorkScheduler { * @see BackgroundConstants.DIAGNOSIS_KEY_ONE_TIME_WORKER_TAG * @see BackgroundConstants.DIAGNOSIS_KEY_PERIODIC_WORKER_TAG * @see BackgroundConstants.DIAGNOSIS_TEST_RESULT_PERIODIC_WORKER_TAG + * @see BackgroundConstants.BACKGROUND_NOISE_ONE_TIME_WORKER_TAG + * @see BackgroundConstants.BACKGROUND_NOISE_PERIODIC_WORKER_TAG */ enum class WorkTag(val tag: String) { DIAGNOSIS_KEY_RETRIEVAL_ONE_TIME_WORKER(BackgroundConstants.DIAGNOSIS_KEY_ONE_TIME_WORKER_TAG), DIAGNOSIS_KEY_RETRIEVAL_PERIODIC_WORKER(BackgroundConstants.DIAGNOSIS_KEY_PERIODIC_WORKER_TAG), - DIAGNOSIS_TEST_RESULT_RETRIEVAL_PERIODIC_WORKER(BackgroundConstants.DIAGNOSIS_TEST_RESULT_PERIODIC_WORKER_TAG) + DIAGNOSIS_TEST_RESULT_RETRIEVAL_PERIODIC_WORKER(BackgroundConstants.DIAGNOSIS_TEST_RESULT_PERIODIC_WORKER_TAG), + BACKGROUND_NOISE_ONE_TIME_WORKER(BackgroundConstants.BACKGROUND_NOISE_ONE_TIME_WORKER_TAG), + BACKGROUND_NOISE_PERIODIC_WORKER(BackgroundConstants.BACKGROUND_NOISE_PERIODIC_WORKER_TAG) } /** @@ -47,11 +47,15 @@ object BackgroundWorkScheduler { * @see BackgroundConstants.DIAGNOSIS_KEY_ONE_TIME_WORK_NAME * @see BackgroundConstants.DIAGNOSIS_KEY_PERIODIC_WORK_NAME * @see BackgroundConstants.DIAGNOSIS_TEST_RESULT_PERIODIC_WORK_NAME + * @see BackgroundConstants.BACKGROUND_NOISE_PERIODIC_WORK_NAME + * @see BackgroundConstants.BACKGROUND_NOISE_ONE_TIME_WORK_NAME */ enum class WorkType(val uniqueName: String) { DIAGNOSIS_KEY_BACKGROUND_ONE_TIME_WORK(BackgroundConstants.DIAGNOSIS_KEY_ONE_TIME_WORK_NAME), DIAGNOSIS_KEY_BACKGROUND_PERIODIC_WORK(BackgroundConstants.DIAGNOSIS_KEY_PERIODIC_WORK_NAME), - DIAGNOSIS_TEST_RESULT_PERIODIC_WORKER(BackgroundConstants.DIAGNOSIS_TEST_RESULT_PERIODIC_WORK_NAME) + DIAGNOSIS_TEST_RESULT_PERIODIC_WORKER(BackgroundConstants.DIAGNOSIS_TEST_RESULT_PERIODIC_WORK_NAME), + BACKGROUND_NOISE_PERIODIC_WORK(BackgroundConstants.BACKGROUND_NOISE_PERIODIC_WORK_NAME), + BACKGROUND_NOISE_ONE_TIME_WORK(BackgroundConstants.BACKGROUND_NOISE_ONE_TIME_WORK_NAME) } /** @@ -162,6 +166,24 @@ object BackgroundWorkScheduler { WorkType.DIAGNOSIS_KEY_BACKGROUND_ONE_TIME_WORK.start() } + /** + * Schedule background noise periodic work + * + * @see WorkType.BACKGROUND_NOISE_PERIODIC_WORK + */ + fun scheduleBackgroundNoisePeriodicWork() { + WorkType.BACKGROUND_NOISE_PERIODIC_WORK.start() + } + + /** + * Schedule background noise one time work + * + * @see WorkType.DIAGNOSIS_KEY_BACKGROUND_ONE_TIME_WORK + */ + fun scheduleBackgroundNoiseOneTimeWork() { + WorkType.DIAGNOSIS_KEY_BACKGROUND_ONE_TIME_WORK.start() + } + /** * Enqueue operation for work type defined in WorkType enum class * @@ -173,6 +195,8 @@ object BackgroundWorkScheduler { WorkType.DIAGNOSIS_KEY_BACKGROUND_PERIODIC_WORK -> enqueueDiagnosisKeyBackgroundPeriodicWork() WorkType.DIAGNOSIS_KEY_BACKGROUND_ONE_TIME_WORK -> enqueueDiagnosisKeyBackgroundOneTimeWork() WorkType.DIAGNOSIS_TEST_RESULT_PERIODIC_WORKER -> enqueueDiagnosisTestResultBackgroundPeriodicWork() + WorkType.BACKGROUND_NOISE_PERIODIC_WORK -> enqueueBackgroundNoisePeriodicWork() + WorkType.BACKGROUND_NOISE_ONE_TIME_WORK -> enqueueBackgroundNoiseOneTimeWork() } /** @@ -220,84 +244,34 @@ object BackgroundWorkScheduler { ).also { it.logOperationSchedule(WorkType.DIAGNOSIS_TEST_RESULT_PERIODIC_WORKER) } /** - * Build diagnosis key periodic work request - * Set "kind delay" for accessibility reason. - * Backoff criteria set to Linear type. - * - * @return PeriodicWorkRequest - * - * @see WorkTag.DIAGNOSIS_KEY_RETRIEVAL_PERIODIC_WORKER - * @see BackgroundConstants.KIND_DELAY - * @see BackgroundConstants.BACKOFF_INITIAL_DELAY - * @see BackoffPolicy.LINEAR - */ - private fun buildDiagnosisKeyRetrievalPeriodicWork() = - PeriodicWorkRequestBuilder( - BackgroundWorkHelper.getDiagnosisKeyRetrievalPeriodicWorkTimeInterval(), TimeUnit.MINUTES - ) - .addTag(WorkTag.DIAGNOSIS_KEY_RETRIEVAL_PERIODIC_WORKER.tag) - .setInitialDelay( - BackgroundConstants.KIND_DELAY, - TimeUnit.MINUTES - ) - .setBackoffCriteria( - BackoffPolicy.EXPONENTIAL, - BackgroundConstants.BACKOFF_INITIAL_DELAY, - TimeUnit.MINUTES - ) - .build() - - /** - * Build diagnosis key one time work request - * Set random initial delay for security reason. - * Backoff criteria set to Linear type. + * Enqueue background noise periodic + * Replace with new if older work exists. * - * @return OneTimeWorkRequest + * @return Operation * - * @see WorkTag.DIAGNOSIS_KEY_RETRIEVAL_ONE_TIME_WORKER - * @see buildDiagnosisKeyRetrievalOneTimeWork - * @see BackgroundConstants.BACKOFF_INITIAL_DELAY - * @see BackoffPolicy.LINEAR + * @see WorkType.BACKGROUND_NOISE_PERIODIC_WORK */ - private fun buildDiagnosisKeyRetrievalOneTimeWork() = - OneTimeWorkRequestBuilder() - .addTag(WorkTag.DIAGNOSIS_KEY_RETRIEVAL_ONE_TIME_WORKER.tag) - .setConstraints(BackgroundWorkHelper.getConstraintsForDiagnosisKeyOneTimeBackgroundWork()) - .setInitialDelay( - BackgroundConstants.KIND_DELAY, - TimeUnit.MINUTES - ) - .setBackoffCriteria( - BackoffPolicy.EXPONENTIAL, - BackgroundConstants.BACKOFF_INITIAL_DELAY, - TimeUnit.MINUTES - ) - .build() + private fun enqueueBackgroundNoisePeriodicWork() = + workManager.enqueueUniquePeriodicWork( + WorkType.BACKGROUND_NOISE_PERIODIC_WORK.uniqueName, + ExistingPeriodicWorkPolicy.REPLACE, + buildBackgroundNoisePeriodicWork() + ).also { it.logOperationSchedule(WorkType.BACKGROUND_NOISE_PERIODIC_WORK) } /** - * Build diagnosis Test Result periodic work request - * Set "kind delay" for accessibility reason. + * Enqueue background noise one time + * Replace with new if older work exists. * - * @return PeriodicWorkRequest + * @return Operation * - * @see WorkTag.DIAGNOSIS_TEST_RESULT_RETRIEVAL_PERIODIC_WORKER - * @see BackgroundConstants.KIND_DELAY + * @see WorkType.BACKGROUND_NOISE_ONE_TIME_WORK */ - private fun buildDiagnosisTestResultRetrievalPeriodicWork() = - PeriodicWorkRequestBuilder( - BackgroundWorkHelper.getDiagnosisTestResultRetrievalPeriodicWorkTimeInterval(), TimeUnit.MINUTES - ) - .addTag(WorkTag.DIAGNOSIS_TEST_RESULT_RETRIEVAL_PERIODIC_WORKER.tag) - .setConstraints(BackgroundWorkHelper.getConstraintsForDiagnosisKeyOneTimeBackgroundWork()) - .setInitialDelay( - BackgroundConstants.DIAGNOSIS_TEST_RESULT_PERIODIC_INITIAL_DELAY, - TimeUnit.SECONDS - ).setBackoffCriteria( - BackoffPolicy.LINEAR, - BackgroundConstants.KIND_DELAY, - TimeUnit.MINUTES - ) - .build() + private fun enqueueBackgroundNoiseOneTimeWork() = + workManager.enqueueUniqueWork( + WorkType.BACKGROUND_NOISE_ONE_TIME_WORK.uniqueName, + ExistingWorkPolicy.REPLACE, + buildBackgroundNoiseOneTimeWork() + ).also { it.logOperationSchedule(WorkType.BACKGROUND_NOISE_ONE_TIME_WORK) } /** * Log operation schedule diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/playbook/PlaybookImplTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/playbook/PlaybookImplTest.kt new file mode 100644 index 00000000000..3ddfb092af1 --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/playbook/PlaybookImplTest.kt @@ -0,0 +1,166 @@ +package de.rki.coronawarnapp.http.playbook + +import de.rki.coronawarnapp.exception.http.InternalServerErrorException +import de.rki.coronawarnapp.service.submission.KeyType +import de.rki.coronawarnapp.util.newWebRequestBuilder +import kotlinx.coroutines.runBlocking +import okhttp3.mockwebserver.MockResponse +import okhttp3.mockwebserver.MockWebServer +import org.hamcrest.MatcherAssert.assertThat +import org.hamcrest.Matchers +import org.hamcrest.Matchers.equalTo +import org.junit.Assert.fail +import org.junit.Test + +class PlaybookImplTest { + + @Test + fun hasRequestPattern_initialRegistration(): Unit = runBlocking { + val server = MockWebServer() + server.start() + + server.enqueue(MockResponse().setBody("""{"registrationToken":"response"}""")) + server.enqueue(MockResponse().setBody("{}")) + server.enqueue(MockResponse().setBody("{}")) + + PlaybookImpl(server.newWebRequestBuilder()) + .initialRegistration("9A3B578UMG", KeyType.TELETAN) + + // ensure request order is 2x verification and 1x submission + assertRequestPattern(server) + } + + @Test + fun hasRequestPattern_submission(): Unit = runBlocking { + val server = MockWebServer() + server.start() + + server.enqueue(MockResponse().setBody("""{"tan":"response"}""")) + server.enqueue(MockResponse().setBody("{}")) + server.enqueue(MockResponse().setBody("{}")) + + PlaybookImpl(server.newWebRequestBuilder()) + .submission("token", listOf()) + + // ensure request order is 2x verification and 1x submission + assertRequestPattern(server) + } + + @Test + fun hasRequestPattern_testResult(): Unit = runBlocking { + val server = MockWebServer() + server.start() + + server.enqueue(MockResponse().setBody("""{"testResult":0}""")) + server.enqueue(MockResponse().setBody("{}")) + server.enqueue(MockResponse().setBody("{}")) + + PlaybookImpl(server.newWebRequestBuilder()) + .testResult("token") + + // ensure request order is 2x verification and 1x submission + assertRequestPattern(server) + } + + @Test + fun hasRequestPattern_dummy(): Unit = runBlocking { + val server = MockWebServer() + server.start() + + server.enqueue(MockResponse().setBody("{}")) + server.enqueue(MockResponse().setBody("{}")) + server.enqueue(MockResponse().setBody("{}")) + + PlaybookImpl(server.newWebRequestBuilder()) + .dummy() + + // ensure request order is 2x verification and 1x submission + assertRequestPattern(server) + } + + @Test + fun shouldIgnoreFailuresForDummyRequests(): Unit = runBlocking { + val server = MockWebServer() + server.start() + + val expectedRegistrationToken = "token" + server.enqueue(MockResponse().setBody("""{"registrationToken":"$expectedRegistrationToken"}""")) + server.enqueue(MockResponse().setResponseCode(500)) + server.enqueue(MockResponse().setResponseCode(500)) + + val registrationToken = PlaybookImpl(server.newWebRequestBuilder()) + .initialRegistration("key", KeyType.GUID) + + assertThat(registrationToken, equalTo(expectedRegistrationToken)) + } + + @Test + fun hasRequestPatternWhenRealRequestFails_initialRegistration(): Unit = runBlocking { + val server = MockWebServer() + server.start() + + server.enqueue(MockResponse().setResponseCode(500)) + server.enqueue(MockResponse().setBody("{}")) + server.enqueue(MockResponse().setBody("{}")) + + try { + + PlaybookImpl(server.newWebRequestBuilder()) + .initialRegistration("9A3B578UMG", KeyType.TELETAN) + fail("exception propagation expected") + } catch (e: InternalServerErrorException) { + } + + // ensure request order is 2x verification and 1x submission + assertRequestPattern(server) + } + + + @Test + fun hasRequestPatternWhenRealRequestFails_testResult(): Unit = runBlocking { + val server = MockWebServer() + server.start() + + server.enqueue(MockResponse().setResponseCode(500)) + server.enqueue(MockResponse().setBody("{}")) + server.enqueue(MockResponse().setBody("{}")) + + try { + + PlaybookImpl(server.newWebRequestBuilder()) + .testResult("token") + fail("exception propagation expected") + } catch (e: InternalServerErrorException) { + } + + // ensure request order is 2x verification and 1x submission + assertRequestPattern(server) + } + + @Test + fun hasRequestPatternWhenRealRequestFails_submission(): Unit = runBlocking { + val server = MockWebServer() + server.start() + + server.enqueue(MockResponse().setResponseCode(500)) + server.enqueue(MockResponse().setBody("{}")) + server.enqueue(MockResponse().setBody("{}")) + + try { + PlaybookImpl(server.newWebRequestBuilder()) + .submission("token", listOf()) + fail("exception propagation expected") + } catch (e: InternalServerErrorException) { + } + + // ensure request order is 2x verification and 1x submission + assertRequestPattern(server) + } + + private fun assertRequestPattern(server: MockWebServer) { + assertThat(server.takeRequest().path, Matchers.startsWith("/verification/")) + assertThat(server.takeRequest().path, Matchers.startsWith("/verification/")) + assertThat(server.takeRequest().path, Matchers.startsWith("/submission/")) + } + +} \ No newline at end of file diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/service/SubmissionServiceTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/service/SubmissionServiceTest.kt new file mode 100644 index 00000000000..00d958ccaed --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/service/SubmissionServiceTest.kt @@ -0,0 +1,44 @@ +package de.rki.coronawarnapp.http.service + +import de.rki.coronawarnapp.util.headerSizeIgnoringContentLength +import de.rki.coronawarnapp.util.newWebRequestBuilder +import kotlinx.coroutines.runBlocking +import okhttp3.mockwebserver.MockResponse +import okhttp3.mockwebserver.MockWebServer +import org.junit.Assert +import org.junit.Test + + +class SubmissionServiceTest { + + @Test + fun allRequestHaveSameFootprintForPlausibleDeniability(): Unit = runBlocking { + + val server = MockWebServer() + server.start() + + val webRequestBuilder = server.newWebRequestBuilder() + + val authCodeExample = "39ec4930-7a1f-4d5d-921f-bfad3b6f1269" + + server.enqueue(MockResponse().setBody("{}")) + webRequestBuilder.asyncSubmitKeysToServer(authCodeExample, listOf()) + + server.enqueue(MockResponse().setBody("{}")) + webRequestBuilder.asyncFakeSubmission() + + val requests = listOf( + server.takeRequest(), + server.takeRequest() + ) + + // ensure all request have same size (header & body) + requests.zipWithNext().forEach { (a, b) -> + Assert.assertEquals( + "Header size mismatch: ", + a.headerSizeIgnoringContentLength(), + b.headerSizeIgnoringContentLength() + ) + } + } +} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/service/VerificationServiceTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/service/VerificationServiceTest.kt new file mode 100644 index 00000000000..fc80e2f344f --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/service/VerificationServiceTest.kt @@ -0,0 +1,61 @@ +package de.rki.coronawarnapp.http.service + +import de.rki.coronawarnapp.service.submission.KeyType +import de.rki.coronawarnapp.util.headerSizeIgnoringContentLength +import de.rki.coronawarnapp.util.newWebRequestBuilder +import kotlinx.coroutines.runBlocking +import okhttp3.mockwebserver.MockResponse +import okhttp3.mockwebserver.MockWebServer +import org.hamcrest.MatcherAssert.assertThat +import org.hamcrest.Matchers.equalTo +import org.junit.Test + + +class VerificationServiceTest { + + @Test + fun allRequestHaveSameFootprintForPlausibleDeniability(): Unit = runBlocking { + + val server = MockWebServer() + server.start() + + val webRequestBuilder = server.newWebRequestBuilder() + + val guidExample = "3BF1D4-1C6003DD-733D-41F1-9F30-F85FA7406BF7" + val teletanExample = "9A3B578UMG" + val registrationTokenExample = "63b4d3ff-e0de-4bd4-90c1-17c2bb683a2f" + + server.enqueue(MockResponse().setBody("{}")) + webRequestBuilder.asyncGetRegistrationToken(guidExample, KeyType.GUID) + + server.enqueue(MockResponse().setBody("{}")) + webRequestBuilder.asyncGetRegistrationToken(teletanExample, KeyType.TELETAN) + + server.enqueue(MockResponse().setBody("{}")) + webRequestBuilder.asyncGetTestResult(registrationTokenExample) + + server.enqueue(MockResponse().setBody("{}")) + webRequestBuilder.asyncGetTan(registrationTokenExample) + + server.enqueue(MockResponse().setBody("{}")) + webRequestBuilder.asyncFakeVerification() + + val requests = listOf( + server.takeRequest(), + server.takeRequest(), + server.takeRequest(), + server.takeRequest(), + server.takeRequest() + ) + + // ensure all request have same size (header & body) + requests.forEach { assertThat(it.bodySize, equalTo(250L)) } + + requests.zipWithNext().forEach { (a, b) -> + assertThat( + a.headerSizeIgnoringContentLength(), + equalTo(b.headerSizeIgnoringContentLength()) + ) + } + } +} \ No newline at end of file diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/diagnosiskey/DiagnosisKeyConstantsTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/diagnosiskey/DiagnosisKeyConstantsTest.kt index a81429b89ff..a7a85c26881 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/diagnosiskey/DiagnosisKeyConstantsTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/diagnosiskey/DiagnosisKeyConstantsTest.kt @@ -9,15 +9,15 @@ class DiagnosisKeyConstantsTest { fun allDiagnosisKeyConstants() { Assert.assertEquals(DiagnosisKeyConstants.HOUR, "hour") Assert.assertEquals(DiagnosisKeyConstants.SERVER_ERROR_CODE_403, 403) - Assert.assertEquals(DiagnosisKeyConstants.INDEX_DOWNLOAD_URL, "/version/v1/index.txt") - Assert.assertEquals(DiagnosisKeyConstants.DIAGNOSIS_KEYS_DOWNLOAD_URL, "/version/v1/diagnosis-keys") - Assert.assertEquals(DiagnosisKeyConstants.DIAGNOSIS_KEYS_SUBMISSION_URL, "/version/v1/diagnosis-keys") - Assert.assertEquals(DiagnosisKeyConstants.PARAMETERS_COUNTRY_DOWNLOAD_URL, "/version/v1/parameters/country") - Assert.assertEquals(DiagnosisKeyConstants.APPCONFIG_COUNTRY_DOWNLOAD_URL, "/version/v1/configuration/country") + Assert.assertEquals(DiagnosisKeyConstants.INDEX_DOWNLOAD_URL, "version/v1/index.txt") + Assert.assertEquals(DiagnosisKeyConstants.DIAGNOSIS_KEYS_DOWNLOAD_URL, "version/v1/diagnosis-keys") + Assert.assertEquals(DiagnosisKeyConstants.DIAGNOSIS_KEYS_SUBMISSION_URL, "version/v1/diagnosis-keys") + Assert.assertEquals(DiagnosisKeyConstants.PARAMETERS_COUNTRY_DOWNLOAD_URL, "version/v1/parameters/country") + Assert.assertEquals(DiagnosisKeyConstants.APPCONFIG_COUNTRY_DOWNLOAD_URL, "version/v1/configuration/country") Assert.assertEquals( DiagnosisKeyConstants.COUNTRY_APPCONFIG_DOWNLOAD_URL, - "/version/v1/configuration/country/DE/app_config" + "version/v1/configuration/country/DE/app_config" ) - Assert.assertEquals(DiagnosisKeyConstants.AVAILABLE_DATES_URL, "/version/v1/diagnosis-keys/country/DE/date") + Assert.assertEquals(DiagnosisKeyConstants.AVAILABLE_DATES_URL, "version/v1/diagnosis-keys/country/DE/date") } } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/submission/SubmissionConstantsTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/submission/SubmissionConstantsTest.kt index a26f3012622..98efa5fec86 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/submission/SubmissionConstantsTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/submission/SubmissionConstantsTest.kt @@ -7,8 +7,10 @@ class SubmissionConstantsTest { @Test fun allSubmissionConstants() { - Assert.assertEquals(SubmissionConstants.QR_CODE_KEY_TYPE, "GUID") - Assert.assertEquals(SubmissionConstants.TELE_TAN_KEY_TYPE, "TELETAN") + // TODO: Should we really keep these now? + Assert.assertEquals(KeyType.GUID.name, "GUID") + Assert.assertEquals(KeyType.TELETAN.name, "TELETAN") + Assert.assertEquals(SubmissionConstants.REGISTRATION_TOKEN_URL, "version/v1/registrationToken") Assert.assertEquals(SubmissionConstants.TEST_RESULT_URL, "version/v1/testresult") Assert.assertEquals(SubmissionConstants.TAN_REQUEST_URL, "version/v1/tan") @@ -18,5 +20,11 @@ class SubmissionConstantsTest { Assert.assertEquals(SubmissionConstants.GUID_SEPARATOR, '?') Assert.assertEquals(SubmissionConstants.SERVER_ERROR_CODE_400, 400) + + // dummy token passes server verification + Assert.assertTrue( + Regex("^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}\$") + .matches(SubmissionConstants.DUMMY_REGISTRATION_TOKEN) + ) } } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/submission/SubmissionServiceTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/submission/SubmissionServiceTest.kt index f086a73f7ab..9d1f958c689 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/submission/SubmissionServiceTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/submission/SubmissionServiceTest.kt @@ -3,12 +3,15 @@ package de.rki.coronawarnapp.service.submission import de.rki.coronawarnapp.exception.NoGUIDOrTANSetException import de.rki.coronawarnapp.exception.NoRegistrationTokenSetException import de.rki.coronawarnapp.http.WebRequestBuilder +import de.rki.coronawarnapp.http.playbook.BackgroundNoise import de.rki.coronawarnapp.storage.LocalData import de.rki.coronawarnapp.transaction.SubmitDiagnosisKeysTransaction import de.rki.coronawarnapp.util.formatter.TestResult +import io.mockk.MockKAnnotations import io.mockk.Runs import io.mockk.coEvery import io.mockk.every +import io.mockk.impl.annotations.MockK import io.mockk.just import io.mockk.mockkObject import io.mockk.verify @@ -22,11 +25,23 @@ class SubmissionServiceTest { private val guid = "123456-12345678-1234-4DA7-B166-B86D85475064" private val registrationToken = "asdjnskjfdniuewbheboqudnsojdff" + @MockK + private lateinit var webRequestBuilder: WebRequestBuilder + + @MockK + private lateinit var backgroundNoise: BackgroundNoise + @Before fun setUp() { - mockkObject(LocalData) - mockkObject(WebRequestBuilder) + MockKAnnotations.init(this) + mockkObject(WebRequestBuilder.Companion) + every { WebRequestBuilder.getInstance() } returns webRequestBuilder + + mockkObject(BackgroundNoise.Companion) + every { BackgroundNoise.getInstance() } returns backgroundNoise + mockkObject(SubmitDiagnosisKeysTransaction) + mockkObject(LocalData) every { LocalData.teletan() } returns null every { LocalData.testGUID() } returns null @@ -49,9 +64,9 @@ class SubmissionServiceTest { every { LocalData.devicePairingSuccessfulTimestamp(any()) } just Runs coEvery { - WebRequestBuilder.getInstance() - .asyncGetRegistrationToken(any(), SubmissionConstants.QR_CODE_KEY_TYPE) + webRequestBuilder.asyncGetRegistrationToken(any(), KeyType.GUID) } returns registrationToken + every { backgroundNoise.scheduleDummyPattern() } just Runs runBlocking { SubmissionService.asyncRegisterDevice() @@ -61,6 +76,7 @@ class SubmissionServiceTest { LocalData.registrationToken(registrationToken) LocalData.devicePairingSuccessfulTimestamp(any()) LocalData.testGUID(null) + backgroundNoise.scheduleDummyPattern() } } @@ -73,9 +89,9 @@ class SubmissionServiceTest { every { LocalData.devicePairingSuccessfulTimestamp(any()) } just Runs coEvery { - WebRequestBuilder.getInstance() - .asyncGetRegistrationToken(any(), SubmissionConstants.TELE_TAN_KEY_TYPE) + webRequestBuilder.asyncGetRegistrationToken(any(), KeyType.TELETAN) } returns registrationToken + every { backgroundNoise.scheduleDummyPattern() } just Runs runBlocking { SubmissionService.asyncRegisterDevice() @@ -85,6 +101,7 @@ class SubmissionServiceTest { LocalData.registrationToken(registrationToken) LocalData.devicePairingSuccessfulTimestamp(any()) LocalData.teletan(null) + backgroundNoise.scheduleDummyPattern() } } @@ -98,9 +115,7 @@ class SubmissionServiceTest { @Test fun requestTestResultSucceeds() { every { LocalData.registrationToken() } returns registrationToken - coEvery { - WebRequestBuilder.getInstance().asyncGetTestResult(registrationToken) - } returns TestResult.NEGATIVE.value + coEvery { webRequestBuilder.asyncGetTestResult(registrationToken) } returns TestResult.NEGATIVE.value runBlocking { assertThat(SubmissionService.asyncRequestTestResult(), equalTo(TestResult.NEGATIVE)) diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/transaction/SubmitDiagnosisKeysTransactionTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/transaction/SubmitDiagnosisKeysTransactionTest.kt index 60bef8b27d0..da3ead756a7 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/transaction/SubmitDiagnosisKeysTransactionTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/transaction/SubmitDiagnosisKeysTransactionTest.kt @@ -2,15 +2,18 @@ package de.rki.coronawarnapp.transaction import KeyExportFormat import com.google.android.gms.nearby.exposurenotification.TemporaryExposureKey +import de.rki.coronawarnapp.http.WebRequestBuilder +import de.rki.coronawarnapp.http.playbook.BackgroundNoise import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient -import de.rki.coronawarnapp.service.diagnosiskey.DiagnosisKeyService import de.rki.coronawarnapp.service.submission.SubmissionService import de.rki.coronawarnapp.storage.LocalData import de.rki.coronawarnapp.worker.BackgroundWorkScheduler +import io.mockk.MockKAnnotations import io.mockk.Runs import io.mockk.coEvery import io.mockk.coVerifyOrder import io.mockk.every +import io.mockk.impl.annotations.MockK import io.mockk.just import io.mockk.mockkObject import io.mockk.slot @@ -23,30 +26,45 @@ import org.junit.Before import org.junit.Test class SubmitDiagnosisKeysTransactionTest { + + @MockK + private lateinit var webRequestBuilder: WebRequestBuilder + + @MockK + private lateinit var backgroundNoise: BackgroundNoise + private val authString = "authString" + private val registrationToken = "123" @Before fun setUp() { + MockKAnnotations.init(this) + + mockkObject(WebRequestBuilder.Companion) + every { WebRequestBuilder.getInstance() } returns webRequestBuilder + + mockkObject(BackgroundNoise.Companion) + every { BackgroundNoise.getInstance() } returns backgroundNoise + mockkObject(LocalData) mockkObject(SubmissionService) mockkObject(InternalExposureNotificationClient) - mockkObject(DiagnosisKeyService) mockkObject(BackgroundWorkScheduler) every { BackgroundWorkScheduler.stopWorkScheduler() } just Runs every { LocalData.numberOfSuccessfulSubmissions(any()) } just Runs - coEvery { SubmissionService.asyncRequestAuthCode(any()) } returns authString + coEvery { webRequestBuilder.asyncGetTan(registrationToken) } returns authString } @Test fun testTransactionNoKeys() { coEvery { InternalExposureNotificationClient.asyncGetTemporaryExposureKeyHistory() } returns listOf() - coEvery { DiagnosisKeyService.asyncSubmitKeys(authString, listOf()) } just Runs + coEvery { webRequestBuilder.asyncSubmitKeysToServer(authString, listOf()) } just Runs runBlocking { - SubmitDiagnosisKeysTransaction.start("123", listOf()) + SubmitDiagnosisKeysTransaction.start(registrationToken, listOf()) coVerifyOrder { - DiagnosisKeyService.asyncSubmitKeys(authString, listOf()) + webRequestBuilder.asyncSubmitKeysToServer(authString, listOf()) SubmissionService.submissionSuccessful() } } @@ -64,13 +82,15 @@ class SubmitDiagnosisKeysTransactionTest { coEvery { InternalExposureNotificationClient.asyncGetTemporaryExposureKeyHistory() } returns listOf( key ) - coEvery { DiagnosisKeyService.asyncSubmitKeys(authString, capture(testList)) } just Runs + coEvery { + webRequestBuilder.asyncSubmitKeysToServer(authString, capture(testList)) + } just Runs runBlocking { - SubmitDiagnosisKeysTransaction.start("123", listOf(key)) + SubmitDiagnosisKeysTransaction.start(registrationToken, listOf(key)) coVerifyOrder { - DiagnosisKeyService.asyncSubmitKeys(authString, any()) + webRequestBuilder.asyncSubmitKeysToServer(authString, any()) SubmissionService.submissionSuccessful() } assertThat(testList.isCaptured, `is`(true)) diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModelTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModelTest.kt index 96f2ee16937..a7fa73cbf19 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModelTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModelTest.kt @@ -1,10 +1,14 @@ package de.rki.coronawarnapp.ui.viewmodel import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import de.rki.coronawarnapp.http.WebRequestBuilder +import de.rki.coronawarnapp.http.playbook.BackgroundNoise import de.rki.coronawarnapp.storage.LocalData import de.rki.coronawarnapp.ui.submission.ScanStatus +import io.mockk.MockKAnnotations import io.mockk.Runs import io.mockk.every +import io.mockk.impl.annotations.MockK import io.mockk.just import io.mockk.mockkObject import org.junit.Assert @@ -19,10 +23,24 @@ class SubmissionViewModelTest { @Rule var instantTaskExecutorRule: InstantTaskExecutorRule = InstantTaskExecutorRule() + @MockK + private lateinit var webRequestBuilder: WebRequestBuilder + + @MockK + private lateinit var backgroundNoise: BackgroundNoise + @Before fun setUp() { + MockKAnnotations.init(this) + mockkObject(LocalData) every { LocalData.testGUID(any()) } just Runs + + mockkObject(WebRequestBuilder.Companion) + every { WebRequestBuilder.getInstance() } returns webRequestBuilder + + mockkObject(BackgroundNoise.Companion) + every { BackgroundNoise.getInstance() } returns backgroundNoise } @Test diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/MockWebServerUtil.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/MockWebServerUtil.kt new file mode 100644 index 00000000000..d0a1ec7f072 --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/MockWebServerUtil.kt @@ -0,0 +1,50 @@ +package de.rki.coronawarnapp.util + +import de.rki.coronawarnapp.http.HttpErrorParser +import de.rki.coronawarnapp.http.WebRequestBuilder +import de.rki.coronawarnapp.http.interceptor.RetryInterceptor +import de.rki.coronawarnapp.http.service.DistributionService +import de.rki.coronawarnapp.http.service.SubmissionService +import de.rki.coronawarnapp.http.service.VerificationService +import de.rki.coronawarnapp.util.security.VerificationKeys +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import okhttp3.mockwebserver.MockWebServer +import okhttp3.mockwebserver.RecordedRequest +import okio.utf8Size +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import retrofit2.converter.protobuf.ProtoConverterFactory + +fun MockWebServer.newWebRequestBuilder(): WebRequestBuilder { + val httpClient = OkHttpClient.Builder() + .addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)) + .addInterceptor(RetryInterceptor()) + .addInterceptor(HttpErrorParser()) + .build() + + val retrofit = Retrofit.Builder() + .client(httpClient) + .addConverterFactory(ProtoConverterFactory.create()) + .addConverterFactory(GsonConverterFactory.create()) + + return WebRequestBuilder( + retrofit.baseUrl(this.url("/distribution/")).build() + .create(DistributionService::class.java), + retrofit.baseUrl(this.url("/verification/")).build() + .create(VerificationService::class.java), + retrofit.baseUrl(this.url("/submission/")).build() + .create(SubmissionService::class.java), + VerificationKeys() + ) +} + +fun RecordedRequest.requestHeaderWithoutContentLength() = + listOf(this.requestLine) + .plus( + this.headers.filter { (k, _) -> k != "Content-Length" }.toString() + ) + .joinToString("\n") + +fun RecordedRequest.headerSizeIgnoringContentLength() = + requestHeaderWithoutContentLength().utf8Size() \ No newline at end of file diff --git a/Server-Protocol-Buffer/src/main/proto/keyExportFormat.proto b/Server-Protocol-Buffer/src/main/proto/keyExportFormat.proto index 55e4cd3f155..3ef93b1da86 100644 --- a/Server-Protocol-Buffer/src/main/proto/keyExportFormat.proto +++ b/Server-Protocol-Buffer/src/main/proto/keyExportFormat.proto @@ -29,6 +29,7 @@ message SignatureInfo { message SubmissionPayload { repeated TemporaryExposureKey keys = 1; + optional bytes padding = 2; } message TemporaryExposureKey { From 90e9a6ae800af9b2438a56d8805ddb2ef2e41d99 Mon Sep 17 00:00:00 2001 From: Philipp Woessner Date: Fri, 7 Aug 2020 15:47:09 +0200 Subject: [PATCH 03/27] Fix: use the exposure summary directly from Google instead of the local db entry (EXPOSUREAPP-1837) --- .../storage/ExposureSummaryRepository.kt | 14 +++++----- .../transaction/RiskLevelTransaction.kt | 22 ++------------- .../ui/viewmodel/TracingViewModel.kt | 7 +++-- .../storage/ExposureSummaryRepositoryTest.kt | 27 +++++++++++++++++-- .../transaction/RiskLevelTransactionTest.kt | 8 +++--- 5 files changed, 44 insertions(+), 34 deletions(-) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/ExposureSummaryRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/ExposureSummaryRepository.kt index 60eb7bae150..f13165bced6 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/ExposureSummaryRepository.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/ExposureSummaryRepository.kt @@ -3,6 +3,7 @@ package de.rki.coronawarnapp.storage import androidx.lifecycle.MutableLiveData import com.google.android.gms.nearby.exposurenotification.ExposureSummary import de.rki.coronawarnapp.CoronaWarnApplication +import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient class ExposureSummaryRepository(private val exposureSummaryDao: ExposureSummaryDao) { companion object { @@ -46,13 +47,12 @@ class ExposureSummaryRepository(private val exposureSummaryDao: ExposureSummaryD ExposureSummaryRepository.daysSinceLastExposure.postValue(daysSinceLastExposure) } - suspend fun getLatestExposureSummary() = exposureSummaryDao - .getLatestExposureSummary() - ?.convertToExposureSummary() - .also { - matchedKeyCount.postValue(it?.matchedKeyCount) - daysSinceLastExposure.postValue(it?.daysSinceLastExposure) - } + suspend fun getLatestExposureSummary(token: String) = + InternalExposureNotificationClient.asyncGetExposureSummary(token) + .also { + matchedKeyCount.postValue(it.matchedKeyCount) + daysSinceLastExposure.postValue(it.daysSinceLastExposure) + } private fun ExposureSummaryEntity.convertToExposureSummary() = ExposureSummary.ExposureSummaryBuilder() diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/RiskLevelTransaction.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/RiskLevelTransaction.kt index bb272906f58..fd019cbe921 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/RiskLevelTransaction.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/RiskLevelTransaction.kt @@ -19,7 +19,6 @@ import de.rki.coronawarnapp.risk.RiskLevelCalculation import de.rki.coronawarnapp.risk.TimeVariables import de.rki.coronawarnapp.server.protocols.ApplicationConfigurationOuterClass import de.rki.coronawarnapp.service.applicationconfiguration.ApplicationConfigurationService -import de.rki.coronawarnapp.storage.ExposureSummaryRepository import de.rki.coronawarnapp.storage.LocalData import de.rki.coronawarnapp.storage.RiskLevelRepository import de.rki.coronawarnapp.transaction.RiskLevelTransaction.RiskLevelTransactionState.CHECK_APP_CONNECTIVITY @@ -355,9 +354,9 @@ object RiskLevelTransaction : Transaction() { */ private suspend fun executeRetrieveExposureSummary(): ExposureSummary = executeState(RETRIEVE_EXPOSURE_SUMMARY) { - val lastExposureSummary = getLastExposureSummary() ?: getNewExposureSummary() + val exposureSummary = getNewExposureSummary() - return@executeState lastExposureSummary.also { + return@executeState exposureSummary.also { Timber.v(TAG, "$transactionId - get the exposure summary for further calculation") } } @@ -466,20 +465,6 @@ object RiskLevelTransaction : Transaction() { return false } - /** - * Returns the last stored ExposureSummary from the storage. - * The ExposureSummary will be updated in the [de.rki.coronawarnapp.receiver.ExposureStateUpdateReceiver] - * once the BroadcastReceiver is triggered from the Google Exposure Notification API - * - * @return exposure summary from Google Exposure Notification API - */ - private suspend fun getLastExposureSummary(): ExposureSummary? { - return ExposureSummaryRepository.getExposureSummaryRepository() - .getLatestExposureSummary().also { - Timber.v("used exposure summary for the risk level calculation: $it") - } - } - /** * Make a call to the backend to retrieve the current application configuration values * @@ -540,9 +525,6 @@ object RiskLevelTransaction : Transaction() { val exposureSummary = InternalExposureNotificationClient.asyncGetExposureSummary(googleToken) - ExposureSummaryRepository.getExposureSummaryRepository() - .insertExposureSummaryEntity(exposureSummary) - return exposureSummary.also { Timber.v("$transactionId - generated new exposure summary with $googleToken") } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/TracingViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/TracingViewModel.kt index 145486acde5..8d3b8e0c5e1 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/TracingViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/TracingViewModel.kt @@ -158,8 +158,11 @@ class TracingViewModel : ViewModel() { fun refreshExposureSummary() { viewModelScope.launch { try { - ExposureSummaryRepository.getExposureSummaryRepository() - .getLatestExposureSummary() + val token = LocalData.googleApiToken() + if (token != null) { + ExposureSummaryRepository.getExposureSummaryRepository() + .getLatestExposureSummary(token) + } Timber.v("retrieved latest exposure summary from db") } catch (e: Exception) { e.report( diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/ExposureSummaryRepositoryTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/ExposureSummaryRepositoryTest.kt index 0fbfc2dcf9d..ed25927dd36 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/ExposureSummaryRepositoryTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/ExposureSummaryRepositoryTest.kt @@ -1,17 +1,20 @@ package de.rki.coronawarnapp.storage import com.google.android.gms.nearby.exposurenotification.ExposureSummary +import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient import io.mockk.MockKAnnotations import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.mockk +import io.mockk.mockkObject import io.mockk.unmockkAll import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test +import java.util.UUID /** * ExposureSummaryRepository test. @@ -27,6 +30,9 @@ class ExposureSummaryRepositoryTest { MockKAnnotations.init(this) repository = ExposureSummaryRepository(dao) + mockkObject(InternalExposureNotificationClient) + coEvery { InternalExposureNotificationClient.asyncGetExposureSummary(any()) } returns buildSummary() + coEvery { dao.getExposureSummaryEntities() } returns listOf() coEvery { dao.getLatestExposureSummary() } returns null coEvery { dao.insertExposureSummaryEntity(any()) } returns 0 @@ -52,10 +58,11 @@ class ExposureSummaryRepositoryTest { @Test fun testGetLatest() { runBlocking { - repository.getLatestExposureSummary() + val token = UUID.randomUUID().toString() + repository.getLatestExposureSummary(token) coVerify { - dao.getLatestExposureSummary() + InternalExposureNotificationClient.asyncGetExposureSummary(token) } } } @@ -81,6 +88,22 @@ class ExposureSummaryRepositoryTest { } } + private fun buildSummary( + maxRisk: Int = 0, + lowAttenuation: Int = 0, + midAttenuation: Int = 0, + highAttenuation: Int = 0 + ): ExposureSummary { + val intArray = IntArray(3) + intArray[0] = lowAttenuation + intArray[1] = midAttenuation + intArray[2] = highAttenuation + return ExposureSummary.ExposureSummaryBuilder() + .setMaximumRiskScore(maxRisk) + .setAttenuationDurations(intArray) + .build() + } + @After fun cleanUp() { unmockkAll() diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/transaction/RiskLevelTransactionTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/transaction/RiskLevelTransactionTest.kt index 288032cc3c7..3e30b2306e4 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/transaction/RiskLevelTransactionTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/transaction/RiskLevelTransactionTest.kt @@ -34,6 +34,7 @@ import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test +import java.util.UUID import java.util.concurrent.TimeUnit class RiskLevelTransactionTest { @@ -68,6 +69,7 @@ class RiskLevelTransactionTest { every { RiskLevel.riskLevelChangedBetweenLowAndHigh(any(), any()) } returns false every { LocalData.lastTimeRiskLevelCalculation() } returns System.currentTimeMillis() every { LocalData.lastTimeRiskLevelCalculation(any()) } just Runs + every { LocalData.googleApiToken() } returns UUID.randomUUID().toString() every { ConnectivityHelper.isNetworkEnabled(any()) } returns true every { CoronaWarnApplication.getAppContext() } returns context } @@ -247,7 +249,7 @@ class RiskLevelTransactionTest { // the risk score of the last exposure summary is above the high min threshold coEvery { ApplicationConfigurationService.asyncRetrieveApplicationConfiguration() } returns testAppConfig - coEvery { esRepositoryMock.getLatestExposureSummary() } returns testExposureSummary + coEvery { InternalExposureNotificationClient.asyncGetExposureSummary(any()) } returns testExposureSummary runBlocking { @@ -309,7 +311,7 @@ class RiskLevelTransactionTest { // the exposure summary risk score is not below high min score coEvery { ApplicationConfigurationService.asyncRetrieveApplicationConfiguration() } returns testAppConfig - coEvery { esRepositoryMock.getLatestExposureSummary() } returns testExposureSummary + coEvery { InternalExposureNotificationClient.asyncGetExposureSummary(any()) } returns testExposureSummary runBlocking { @@ -373,7 +375,7 @@ class RiskLevelTransactionTest { every { TimeVariables.getTimeActiveTracingDuration() } returns twoHoursAboveMinActiveTracingDuration coEvery { ApplicationConfigurationService.asyncRetrieveApplicationConfiguration() } returns testAppConfig - coEvery { esRepositoryMock.getLatestExposureSummary() } returns testExposureSummary + coEvery { InternalExposureNotificationClient.asyncGetExposureSummary(any()) } returns testExposureSummary runBlocking { From 04a579c17c2e863141caf87138ffd64999d54887 Mon Sep 17 00:00:00 2001 From: Kolya Opahle Date: Fri, 7 Aug 2020 16:25:06 +0200 Subject: [PATCH 04/27] Added support for new TestResult and DeviceUIState based on EXPOSUREAPP-1743 (#989) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added support for new TestResult and DeviceUIState based on EXPOSUREAPP-1743 Signed-off-by: Kolya Opahle * Removed empty strings from other translations and added English Co-authored-by: Jakob Möller --- .../storage/SubmissionRepository.kt | 1 + .../SubmissionTestResultFragment.kt | 19 ++++++++++++++ .../rki/coronawarnapp/util/DeviceUIState.kt | 1 + .../formatter/FormatterSubmissionHelper.kt | 25 +++++++++++++------ .../util/formatter/TestResult.kt | 3 ++- .../src/main/res/values-de/strings.xml | 7 ++++++ .../src/main/res/values/strings.xml | 7 ++++++ 7 files changed, 54 insertions(+), 9 deletions(-) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/SubmissionRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/SubmissionRepository.kt index a81018bd088..3190d0e48d5 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/SubmissionRepository.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/SubmissionRepository.kt @@ -58,6 +58,7 @@ object SubmissionRepository { TestResult.POSITIVE -> DeviceUIState.PAIRED_POSITIVE TestResult.PENDING -> DeviceUIState.PAIRED_NO_RESULT TestResult.INVALID -> DeviceUIState.PAIRED_ERROR + TestResult.REDEEMED -> DeviceUIState.PAIRED_REDEEMED } } catch (err: NoRegistrationTokenSetException) { return DeviceUIState.UNPAIRED diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultFragment.kt index 41c8ace2774..03aecc8b20e 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultFragment.kt @@ -9,6 +9,7 @@ import android.view.accessibility.AccessibilityEvent import androidx.activity.OnBackPressedCallback import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels +import androidx.lifecycle.Observer import androidx.navigation.fragment.findNavController import de.rki.coronawarnapp.R import de.rki.coronawarnapp.databinding.FragmentSubmissionTestResultBinding @@ -18,6 +19,7 @@ import de.rki.coronawarnapp.exception.http.CwaWebException import de.rki.coronawarnapp.ui.doNavigate import de.rki.coronawarnapp.ui.viewmodel.SubmissionViewModel import de.rki.coronawarnapp.ui.viewmodel.TracingViewModel +import de.rki.coronawarnapp.util.DeviceUIState import de.rki.coronawarnapp.util.DialogHelper import de.rki.coronawarnapp.util.observeEvent @@ -115,6 +117,23 @@ class SubmissionTestResultFragment : Fragment() { submissionViewModel.uiStateError.observeEvent(viewLifecycleOwner) { DialogHelper.showDialog(buildErrorDialog(it)) } + + submissionViewModel.deviceUiState.observe(viewLifecycleOwner, Observer { uiState -> + if (uiState == DeviceUIState.PAIRED_REDEEMED) { + showRedeemedTokenWarningDialog() + } + }) + } + + private fun showRedeemedTokenWarningDialog() { + val dialog = DialogHelper.DialogInstance( + requireActivity(), + R.string.submission_error_dialog_web_tan_redeemed_title, + R.string.submission_error_dialog_web_tan_redeemed_body, + R.string.submission_error_dialog_web_tan_redeemed_button_positive + ) + + DialogHelper.showDialog(dialog) } override fun onResume() { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/DeviceUIState.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/DeviceUIState.kt index 6049195d48c..bc304ab27c4 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/DeviceUIState.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/DeviceUIState.kt @@ -7,6 +7,7 @@ enum class DeviceUIState { PAIRED_POSITIVE_TELETAN, PAIRED_NEGATIVE, PAIRED_ERROR, + PAIRED_REDEEMED, SUBMITTED_INITIAL, SUBMITTED_FINAL } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterSubmissionHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterSubmissionHelper.kt index 5d93578b11d..fb6de1ec97b 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterSubmissionHelper.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterSubmissionHelper.kt @@ -64,7 +64,8 @@ fun formatTestResultCardContent(uiState: DeviceUIState?): Spannable { return when (uiState) { DeviceUIState.PAIRED_NO_RESULT -> SpannableString(appContext.getString(R.string.test_result_card_status_pending)) - DeviceUIState.PAIRED_ERROR -> + DeviceUIState.PAIRED_ERROR, + DeviceUIState.PAIRED_REDEEMED -> SpannableString(appContext.getString(R.string.test_result_card_status_invalid)) DeviceUIState.PAIRED_POSITIVE, @@ -81,7 +82,8 @@ fun formatTestStatusIcon(uiState: DeviceUIState?): Drawable? { DeviceUIState.PAIRED_POSITIVE_TELETAN, DeviceUIState.PAIRED_POSITIVE -> appContext.getDrawable(R.drawable.ic_test_result_illustration_positive) DeviceUIState.PAIRED_NEGATIVE -> appContext.getDrawable(R.drawable.ic_test_result_illustration_negative) - DeviceUIState.PAIRED_ERROR -> appContext.getDrawable(R.drawable.ic_test_result_illustration_invalid) + DeviceUIState.PAIRED_ERROR, + DeviceUIState.PAIRED_REDEEMED -> appContext.getDrawable(R.drawable.ic_test_result_illustration_invalid) else -> appContext.getDrawable(R.drawable.ic_test_result_illustration_invalid) } } @@ -102,13 +104,14 @@ fun formatTestResultPositiveStepsVisible(uiState: DeviceUIState?): Int = formatVisibility(uiState == DeviceUIState.PAIRED_POSITIVE || uiState == DeviceUIState.PAIRED_POSITIVE_TELETAN) fun formatTestResultInvalidStepsVisible(uiState: DeviceUIState?): Int = - formatVisibility(uiState == DeviceUIState.PAIRED_ERROR) + formatVisibility(uiState == DeviceUIState.PAIRED_ERROR || uiState == DeviceUIState.PAIRED_REDEEMED) fun formatSubmissionStatusCardSubtitleColor(uiState: DeviceUIState?): Int { val appContext = CoronaWarnApplication.getAppContext() return when (uiState) { DeviceUIState.PAIRED_NEGATIVE -> appContext.getColor(R.color.colorTextSemanticGreen) - DeviceUIState.PAIRED_ERROR -> appContext.getColor(R.color.colorTextSemanticNeutral) + DeviceUIState.PAIRED_ERROR, + DeviceUIState.PAIRED_REDEEMED -> appContext.getColor(R.color.colorTextSemanticNeutral) else -> appContext.getColor(R.color.colorTextPrimary1) } } @@ -117,7 +120,8 @@ fun formatSubmissionStatusCardSubtitleText(uiState: DeviceUIState?): String { val appContext = CoronaWarnApplication.getAppContext() return when (uiState) { DeviceUIState.PAIRED_NEGATIVE -> appContext.getString(R.string.submission_status_card_subtitle_negative) - DeviceUIState.PAIRED_ERROR -> appContext.getString(R.string.submission_status_card_subtitle_invalid) + DeviceUIState.PAIRED_ERROR, + DeviceUIState.PAIRED_REDEEMED -> appContext.getString(R.string.submission_status_card_subtitle_invalid) else -> "" } } @@ -126,6 +130,7 @@ fun formatSubmissionStatusCardContentTitleText(uiState: DeviceUIState?): String val appContext = CoronaWarnApplication.getAppContext() return when (uiState) { DeviceUIState.PAIRED_ERROR, + DeviceUIState.PAIRED_REDEEMED, DeviceUIState.PAIRED_NEGATIVE -> appContext.getString(R.string.submission_status_card_title_available) DeviceUIState.PAIRED_NO_RESULT -> appContext.getString(R.string.submission_status_card_title_pending) else -> appContext.getString(R.string.submission_status_card_title_pending) @@ -135,7 +140,8 @@ fun formatSubmissionStatusCardContentTitleText(uiState: DeviceUIState?): String fun formatSubmissionStatusCardContentBodyText(uiState: DeviceUIState?): String { val appContext = CoronaWarnApplication.getAppContext() return when (uiState) { - DeviceUIState.PAIRED_ERROR -> appContext.getString(R.string.submission_status_card_body_invalid) + DeviceUIState.PAIRED_ERROR, + DeviceUIState.PAIRED_REDEEMED -> appContext.getString(R.string.submission_status_card_body_invalid) DeviceUIState.PAIRED_NEGATIVE -> appContext.getString(R.string.submission_status_card_body_negative) DeviceUIState.PAIRED_NO_RESULT -> appContext.getString(R.string.submission_status_card_body_pending) else -> appContext.getString(R.string.submission_status_card_body_pending) @@ -145,6 +151,7 @@ fun formatSubmissionStatusCardContentBodyText(uiState: DeviceUIState?): String { fun formatSubmissionStatusCardContentStatusTextVisible(uiState: DeviceUIState?): Int { return when (uiState) { DeviceUIState.PAIRED_NEGATIVE, + DeviceUIState.PAIRED_REDEEMED, DeviceUIState.PAIRED_ERROR -> View.VISIBLE else -> View.GONE } @@ -157,7 +164,8 @@ fun formatSubmissionStatusCardContentIcon(uiState: DeviceUIState?): Drawable? { DeviceUIState.PAIRED_POSITIVE, DeviceUIState.PAIRED_POSITIVE_TELETAN -> appContext.getDrawable(R.drawable.ic_main_illustration_pending) DeviceUIState.PAIRED_NEGATIVE -> appContext.getDrawable(R.drawable.ic_main_illustration_negative) - DeviceUIState.PAIRED_ERROR -> appContext.getDrawable(R.drawable.ic_main_illustration_invalid) + DeviceUIState.PAIRED_ERROR, + DeviceUIState.PAIRED_REDEEMED -> appContext.getDrawable(R.drawable.ic_main_illustration_invalid) else -> appContext.getDrawable(R.drawable.ic_main_illustration_invalid) } } @@ -180,7 +188,8 @@ fun formatSubmissionStatusCardContentVisible( ): Int = formatVisibility( deviceUiState == DeviceUIState.PAIRED_ERROR || deviceUiState == DeviceUIState.PAIRED_NEGATIVE || - deviceUiState == DeviceUIState.PAIRED_NO_RESULT + deviceUiState == DeviceUIState.PAIRED_NO_RESULT || + deviceUiState == DeviceUIState.PAIRED_REDEEMED ) fun formatShowSubmissionStatusPositiveCard(deviceUiState: DeviceUIState?): Int = diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/TestResult.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/TestResult.kt index 31ec1a64d5e..c0cacc40a79 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/TestResult.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/TestResult.kt @@ -5,7 +5,8 @@ enum class TestResult(val value: Int) { PENDING(0), NEGATIVE(1), POSITIVE(2), - INVALID(3); + INVALID(3), + REDEEMED(4); companion object { fun fromInt(value: Int) = values().first { it.value == value } diff --git a/Corona-Warn-App/src/main/res/values-de/strings.xml b/Corona-Warn-App/src/main/res/values-de/strings.xml index 599eb7de369..227eb515bec 100644 --- a/Corona-Warn-App/src/main/res/values-de/strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/strings.xml @@ -726,6 +726,13 @@ "Zurück" + + "Test fehlerhaft" + + "Es gab ein Problem bei der Auswertung Ihres Tests. Ihr QR Code ist bereits abgelaufen." + + "OK" + "Kamera-Zugriff benötigt" diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index 82541082b88..60485feb00b 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -728,6 +728,13 @@ "Back" + + "Test has errors" + + "There was a problem evaluating your test. Your QR Code has already expired." + + "OK" + "Camera authorization required" From 9235f0d9bdadb02818c8119ea6fe8314961b7c2f Mon Sep 17 00:00:00 2001 From: Philipp Woessner Date: Fri, 7 Aug 2020 16:54:27 +0200 Subject: [PATCH 05/27] version bump to 1.3.0 --- Corona-Warn-App/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Corona-Warn-App/build.gradle b/Corona-Warn-App/build.gradle index 21ff433d908..5e15edbecec 100644 --- a/Corona-Warn-App/build.gradle +++ b/Corona-Warn-App/build.gradle @@ -33,8 +33,8 @@ android { applicationId 'de.rki.coronawarnapp' minSdkVersion 23 targetSdkVersion 29 - versionCode 35 - versionName "1.2.0" + versionCode 36 + versionName "1.3.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" From c47729f0982f5d39bb89aa3d7c435acdafd1423e Mon Sep 17 00:00:00 2001 From: SAP LX Lab Service Account Date: Tue, 11 Aug 2020 00:30:40 -0700 Subject: [PATCH 06/27] [INTERNAL] Translation delivery: commit by LX Lab (#994) Change-Id: Ifdc1d67fce54107796876a78263e305cdb33f710 --- .../src/main/res/values-bg/strings.xml | 7 + .../src/main/res/values-en/strings.xml | 7 + .../src/main/res/values-pl/strings.xml | 7 + .../src/main/res/values-ro/strings.xml | 7 + .../src/main/res/values-ru/strings.xml | 1119 +++++++++++++++++ .../src/main/res/values-tr/strings.xml | 7 + 6 files changed, 1154 insertions(+) create mode 100644 Corona-Warn-App/src/main/res/values-ru/strings.xml diff --git a/Corona-Warn-App/src/main/res/values-bg/strings.xml b/Corona-Warn-App/src/main/res/values-bg/strings.xml index 52b3410715b..d8fb6f62d79 100644 --- a/Corona-Warn-App/src/main/res/values-bg/strings.xml +++ b/Corona-Warn-App/src/main/res/values-bg/strings.xml @@ -726,6 +726,13 @@ "Назад" + + "Грешки в теста" + + "Възникнаха грешки при проверката на Вашия тест. Този QR код вече е изтекъл." + + "OK" + "Изисква се разрешение за използване на камерата" diff --git a/Corona-Warn-App/src/main/res/values-en/strings.xml b/Corona-Warn-App/src/main/res/values-en/strings.xml index bf58b61321e..facc4ff658c 100644 --- a/Corona-Warn-App/src/main/res/values-en/strings.xml +++ b/Corona-Warn-App/src/main/res/values-en/strings.xml @@ -726,6 +726,13 @@ "Back" + + "Test has errors" + + "There was a problem evaluating your test. Your QR code has already expired." + + "OK" + "Camera authorization required" diff --git a/Corona-Warn-App/src/main/res/values-pl/strings.xml b/Corona-Warn-App/src/main/res/values-pl/strings.xml index 2dd16fd2c24..85793c37e5c 100644 --- a/Corona-Warn-App/src/main/res/values-pl/strings.xml +++ b/Corona-Warn-App/src/main/res/values-pl/strings.xml @@ -726,6 +726,13 @@ "Wstecz" + + "Test zawiera błędy" + + "Podczas ustalania wyniku testu pojawił się błąd. Twój kod QR wygasł." + + "OK" + "Wymagana autoryzacja aparatu" diff --git a/Corona-Warn-App/src/main/res/values-ro/strings.xml b/Corona-Warn-App/src/main/res/values-ro/strings.xml index e933911ad01..f47711764ad 100644 --- a/Corona-Warn-App/src/main/res/values-ro/strings.xml +++ b/Corona-Warn-App/src/main/res/values-ro/strings.xml @@ -726,6 +726,13 @@ "Înapoi" + + "Testul are erori" + + "A apărut o problemă la evaluarea testului dvs. Codul dvs. QR a expirat deja." + + "OK" + "Este necesară autorizația pentru camera foto" diff --git a/Corona-Warn-App/src/main/res/values-ru/strings.xml b/Corona-Warn-App/src/main/res/values-ru/strings.xml new file mode 100644 index 00000000000..df8ef6833c4 --- /dev/null +++ b/Corona-Warn-App/src/main/res/values-ru/strings.xml @@ -0,0 +1,1119 @@ + + + + + + "shared_preferences_cwa" + + "preference_onboarding_completed" + + "preference_onboarding_completed_timestamp" + + "preference_background_check_done" + + "preference_reset_app" + + "preference_only_wifi" + + "preference_tracing" + + "preference_timestamp_diagnosis_keys_fetch" + + "preference_timestamp_manual_diagnosis_keys_retrieval" + + "preference_m_string_google_api_token" + + "preference_notifications_enabled" + + "preference_notifications_risk_enabled" + + "preference_notifications_test_enabled" + + "preference_background_job_enabled" + + "preference_mobile_data_enabled" + + "preference_registration_token" + + "preference_device_pairing_successful_time" + + "preference_initial_tracing_activation_time" + + "preference_initial_result_received_time" + + "preference_risk_level_score" + + "preference_risk_level_score_successful" + + "preference_timestamp_risk_level_calculation" + + "preference_test_guid" + + "preference_is_allowed_to_submit_diagnosis_keys" + + "preference_auth_code" + + "preference_database_password" + + "preference_total_non_active_tracing" + + "preference_last_non_active_tracing_timestamp" + + "preference_number_successful_submissions" + + "preference_teletan" + + "preference_last_three_hours_from_server" + + "preference_polling_test_result_started" + + "preference_test_result_notification" + + "preference_risk_days_explanation_shown" + + + + + "Назад" + + "Дальше" + + "Меню" + + "Закрыть" + + "Приложение Corona-Warn-App" + + "Кнопка" + + + + + "Обзор" + + "Информация о приложении" + + "Настройки" + + + + "de.rki.coronawarnapp.notification.exposureNotificationChannelId" + + "1" + + "Приложение Corona-Warn-App" + + "Уведомления от Corona-Warn-App" + + "Приложение Corona-Warn-App" + + "Есть новые сообщения от приложения Corona-Warn-App." + + + + + "Доступно обновление" + + "Для дальнейшего использования приложения Corona-Warn-App установите последнее обновление." + + "Обновить" + + + + + "Пока нет контактов" + + + "%1$s контакт" + "%1$s контакта" + "Пока нет контактов" + "%1$s контакта" + "%1$s контакта" + "%1$s контактов" + + + + "%1$s контакт" + "%1$s контакта" + "Пока нет контактов" + "%1$s контакта" + "%1$s контакта" + "%1$s контактов" + + + "Определение риска активно %1$s из 14 прошедших дней." + + "Определение риска постоянно активно." + + "Контакты еще не проверены." + + "Обновлено: %1$s" + + "Обновляется ежедневно" + + "Обновить" + + "Обновление через %1$s" + + "Активировать определение риска" + + "Активируйте определение риска, чтобы оценить свой статус риска сегодня." + + "Низкий риск" + + "Повышенный риск" + + + "%1$s день с последнего контакта" + "%1$s дня с последнего контакта" + "%1$s дней с последнего контакта" + "%1$s дня с последнего контакта" + "%1$s дня с последнего контакта" + "%1$s дней с последнего контакта" + + + "Неизвестный риск" + + "С момента активации определения риска не прошло достаточно времени, чтобы рассчитать Ваш риск заражения." + + "Определение риска остановлено" + + "Последнее определение риска:""\n""%1$s" + + "Определение риска невозможно" + + "Не удается обновить определение риска более 24 часов." + + "Ваш статус риска не обновлялся более 48 часов: обновите свой статус риска." + + "Проверка выполняется..." + + "Текущие данные выгружаются и проверяются. Это может занять несколько минут." + + + + + "Часто задаваемые вопросы" + + "Здесь Вы найдете ответы на часто задаваемые вопросы о приложении Corona-Warn-App. Вы будете переадресованы на внешний веб-сайт." + + "https://www.bundesregierung.de/corona-warn-app-faq-englisch" + + "Здесь Вы найдете ответы на часто задаваемые вопросы о приложении Corona-Warn-App. Вы будете переадресованы на внешний веб-сайт." + + + + + "Поделиться Corona-Warn-App" + + "Давайте победим коронавирус вместе" + + "Чем больше пользователей приложения, тем быстрее мы сможем остановить передачу инфекции. Предложите своим родным и друзьям выгрузить приложение." + + "Отправить ссылку для выгрузки" + + "Победим коронавирус вместе""\n""Я участвую, а ты?""\n""https://www.corona-warn-app.de""\n""\n" + + "Человек делится приложением Corona-Warn-App с четырьмя другими людьми." + + + + + "Обзор" + + "Обзор" + + "Определение риска" + + "Определение риска - одна из трех основных функций приложения. Когда она активирована, регистрируются контакты с устройствами других людей. Вам не нужно ничего делать." + + "Риск заражения" + + "Если Вы в течение последних 14 дней контактировали с лицом с положительным тестом на COVID-19, приложение рассчитает Ваш риск заражения. Для этого оцениваются продолжительность и близость контакта." + + "Статус риска может иметь следующие значения:" + + "Повышенный риск" + + "Низкий риск" + + "Неизвестный риск" + + "Уведомление других пользователей" + + "Еще одна из основных функций - регистрация Вашего теста и получение результата. Если у Вас положительный текст на COVID-19, Вы можете уведомить других людей и остановить передачу инфекции." + + "Терминология:" + + "Журнал контактов" + + "Список полученных и случайных идентификаторов, временно сохраненных в хранилище операционной системы. Этот список считывается при проверке контактов. Все случайные идентификаторы автоматически удаляются через 14 дней." + + "Проверка контактов" + + "Данные журнала контактов вызываются и синхронизируются с зарегистрированными заражениями других пользователей. Проверка контактов выполняется автоматически с интервалом около двух часов." + + "Контакты" + + "Продолжительные и близкие контакты с лицом, у которого диагностирован COVID-19." + + "Уведомление о контакте" + + "Отображение уведомлений в приложении Corona-Warn-App." + + "Случайные идентификаторы" + + "Случайные идентификаторы представляют собой комбинации цифр и букв, генерируемые произвольно. Они передаются между устройствами в непосредственной близости. По случайным идентификаторам нельзя отследить конкретных лиц. Они автоматически удаляются через 14 дней. Лица с положительным тестом на COVID-19 могут по желанию поделиться своими случайными идентификаторами за срок до 14 дней с другими пользователями приложения." + + "На смартфоне отображается разное содержимое, пронумерованное от 1 до 3." + + "Главная страница приложения Corona-Warn-App" + + + + + "Ваш статус риска" + + "Инструкции" + + "Вот что Вам нужно сделать" + + "По возможности возвращайтесь домой и оставайтесь дома." + + "Контакты для вопросов о симптомах, доступности тестирования и самоизоляции:" + + "Регулярно мойте руки." + + "Носите защитную маску при контактах с другими людьми." + + "Соблюдайте расстояние не менее 1,5 м от других людей." + + "Во время чихания и кашля прикрывайте рот сгибом локтя или салфеткой." + + "Ваш врач общей практики" + + "Скорая помощь (тел. 116117)" + + "Местный орган здравоохранения" + + "Риск заражения" + + "Период нахождения в системе" + + "Этот период включен в расчет." + + "Ваш риск заражения можно рассчитать только для периодов активного определения риска, поэтому функция определения должна быть постоянно активной." + + "Определение риска охватывает последние 14 дней. В течение этого времени функция определения на Вашем устройстве была активна %1$s дн. Приложение автоматически удаляет старые журналы, как только они теряют значение для предотвращения заражения." + + "Вот как был рассчитан Ваш риск" + + "Вот как рассчитывается Ваш риск" + + "С момента активации определения риска не прошло достаточно времени, чтобы рассчитать Ваш риск заражения." + + "Не удается обновить определение риска более 24 часов." + + "У Вас низкий риск заражения, поскольку не зарегистрировано контактов с лицами с положительным тестом на COVID-19 или контакты были кратковременными и на большом расстоянии." + + + "У Вас повышенный риск заражения, поскольку %1$s день назад у Вас был продолжительный близкий контакт минимум с одним лицом с положительным тестом на COVID-19." + "У Вас повышенный риск заражения, поскольку %1$s дня назад у Вас был продолжительный близкий контакт минимум с одним лицом с положительным тестом на COVID-19." + "У Вас повышенный риск заражения, поскольку %1$s дней назад у Вас был продолжительный близкий контакт минимум с одним лицом с положительным тестом на COVID-19." + "У Вас повышенный риск заражения, поскольку %1$s дня назад у Вас был продолжительный близкий контакт минимум с одним лицом с положительным тестом на COVID-19." + "У Вас повышенный риск заражения, поскольку %1$s дня назад у Вас был продолжительный близкий контакт минимум с одним лицом с положительным тестом на COVID-19." + "У Вас повышенный риск заражения, поскольку %1$s дней назад у Вас был продолжительный близкий контакт минимум с одним лицом с положительным тестом на COVID-19." + + + "Ваш риск заражения рассчитывается по локальным данным определения риска (продолжительности и близости) на Вашем устройстве. Данные риска заражения не показываются и не передаются другим лицам." + + @string/risk_card_button_update + + @string/risk_card_button_enable_tracing + + "Ваш статус риска" + + + "Информация о функции определения риска" + + "Подробнее см. на странице часто задаваемых вопросов." + + + + + "Не активировать" + + "Активировать" + + "Отменить" + + "Дальше" + + "Давайте начнем" + + "Назад" + + "Страница адаптации 1 из 5. Победим коронавирус вместе" + + "Давайте победим коронавирус вместе" + + "Более надежная защита для Вас и для всех нас. Приложение Corona-Warn-App поможет быстрее остановить передачу инфекции." + + "Сделайте из Вашего устройства систему предупреждения о коронавирусе. Просматривайте Ваш статус риска и определяйте, были ли у Вас близкие контакты с лицами с положительным тестом на COVID-19 за последние 14 дней." + + "Контакты людей регистрируются в приложении путем обмена зашифрованными случайными идентификаторами между устройствами без доступа к каким-либо персональным данным." + + "Группа людей использует свои смартфоны в городе." + + "Страница адаптации 2 из 5. Конфиденциальность данных. Далее идет подробный текст. Для продолжения нажмите кнопку внизу экрана." + + "Конфиденциальность данных" + + + "На смартфоне одной женщины установлено приложение Corona-Warn-App. Значок замка на фоне щита указывает на шифрование данных." + + "Страница адаптации 3 из 5. Активация определения риска" + + "Как активировать определение риска" + + "Чтобы узнать, есть ли у Вас риск заражения, нужно активировать функцию определения риска." + + "Для определения риска Ваше устройство получает по Bluetooth зашифрованные случайные идентификаторы других пользователей и передает Ваш случайный идентификатор на их устройства. Эту функцию можно деактивировать в любое время." + + "Зашифрованные случайные идентификаторы передают другим людям только информацию о дате, продолжительности и близости (по силе сигнала) контакта. Персональные данные, такие как имя, адрес или местоположение, никогда не регистрируются. Идентификация лица невозможна." + + "Заявление о согласии" + + "Чтобы узнать, был ли у Вас контакт с инфицированным лицом и есть ли риск заражения, Вам необходимо активировать в Приложении функцию \"Определение риска\". Вы даете свое согласие на активацию определения риска и соответствующую обработку данных, нажав \"Активировать определение риска\".""\n""\n""Для использования функции определения риска Вам также необходимо активировать на своем смартфоне разработанную компанией Google функцию записи контактов „COVID-19: отслеживание контактов“ и разрешить допуск к мобильному приложению Corona-Warn-App.""\n""\n""При активации функции записи контактов Ваш смартфон автоматически генерирует и посылает через Bluetooth случайные коды, которые могут быть получены другими смартфонами Apple и Android вблизи от Вас, в которых также активирована функция записи контактов. В свою очередь, Ваш смартфон получает случайные коды других смартфонов. Ваши собственные и полученные с других смартфонов случайные коды хранятся в течение 14 дней в журнале контактов функции «COVID-19: отслеживание контактов».""\n""\n""Для определения Вашего риска заражения Приложение загружает в течение дня, неоднократно или по запросу, список случайных кодов всех пользователей, которые сообщили через Приложение о своем подтвержденном диагнозе. Затем данный список сравнивается со списком случайных кодов, сохраненных в журнале контактов функции записи контактов. Если при этом Приложение зафиксирует возможный контакт с инфицированным пользователем, Приложение уведомит Вас о контакте с инфицированным лицом и о риске заражения. В этом случае Приложение получит доступ к остальным данным, сохраненным в журнале контактов функции «COVID-19: отслеживание контактов» Вашего смартфона (дата, длительность контакта и сила сигнала Bluetooth).""\n""\n""Сила сигнала Bluetooth помогает определить расстояние (чем сильнее сигнал, тем меньше расстояние). Приложение обрабатывает эти данные для того, чтобы оценить для Вас риск заражения коронавирусом и предоставить Вам рекомендации для дальнейших действий. Данная обработка данных осуществляется исключительно локально на Вашем смартфоне. Никто (в том числе ИРК), кроме Вас, не узнает о том, находились ли Вы в контакте с инфицированным лицом и каким был результат оценки риска заражения.""\n""\n""Чтобы отозвать свое согласие на определение риска, Вы можете деактивировать эту функцию в Приложении, нажав на ползунок, или удалить Приложение. Если Вы хотите снова использовать определение степени риска, активируйте заново ползунок или снова установите Приложение. При отключении функции определения риска Приложение больше не проверяет, был ли у Вас контакт с инфицированным пользователем. Чтобы остановить отправку и получение случайных кодов, Вам необходимо отключить в настройках Вашего смартфона функцию «COVID-19: отслеживание контактов». Обратите внимание, что Ваши и сторонние случайные коды, сохраненные в журнале контактов функции «COVID-19: отслеживание контактов» не удаляются в Приложении. Сохраненные данные в журнале контактов функции «COVID-19: отслеживание контактов» Вы можете удалить на долгосрочный период только в настройках смартфона.""\n""\n""Политика конфиденциальности Приложения (в том числе информация об обработке данных для определения степени риска) доступна в пункте меню «Информация о конфиденциальности данных»." + + "Активировать определение риска" + + "Авторизация" + + "Это означает, что приложение Corona-Warn-App не может отправлять и получать уведомления о Вашем статусе риска заражения COVID-19. Вы можете деактивировать эту функцию в любое время." + + "Не активировать" + + "Назад" + + "Обновление в фоновом режиме отключено" + + "Вы отключили обновление приложения Corona-Warn-App в фоновом режиме. Включите обновление в фоновом режиме для использования автоматического определения риска. При отключенном обновлении в фоновом режиме определение риска можно запустить только вручную. Активировать обновление в фоновом режиме можно в настройках своего устройства." + + "Открыть настройки устройства" + + "Запустить определение риска вручную" + + "Разрешить приоритетную фоновую активность" + + "Включите приоритетную фоновую активность, чтобы разрешить приложению влюбое время определять Ваш статус риска в фоновом режиме (рекомендуется). Такая настройка отключает оптимизацию расхода заряда аккумулятора только для приложения Corona-Warn-App. Мы не предполагаем, что это может существенно снизить расход Вашего аккумулятора.\n\nПри отказе от данной настройки рекомендуем Вам открывать приложении вручную хотя бы раз в 24 часа." + + "Разрешить" + + "Не разрешать" + + "Приоритетная фоновая активность отключена" + + "Обратите внимание, что при отключении приоритетной фоновой активности Вам нужно раз в 24 часа открывать приложение вручную, чтобы определить свой статус риска.\n\nВы в любое время можете включить приоритетную фоновую активность в настройках." + + "ОК" + + "Три человека активировали определение риска на своих устройствах, то есть их контакты друг с другом будут регистрироваться." + + "Разрешить доступ к местоположению" + + "Доступ к Вашему местоположению невозможен. Чтобы использовать Bluetooth, Google и/или Android требуется доступ к местоположению Вашего устройства." + + "Открыть настройки устройства" + + "Страница адаптации 4 из 5. Если у Вас положительный тест на COVID-19..." + + "Если у Вас положительный тест на COVID-19..." + + "…Укажите это в приложении Corona-Warn-App. Предоставление результата Вашего теста является добровольным и безопасным. Просим Вас об этом ради здоровья других людей." + + "Ваше уведомление шифруется для защиты и обрабатывается на безопасном сервере. Людям, от которых Ваше устройство получило зашифрованные случайные идентификаторы, отправляется предупреждение вместе с рекомендуемыми действиями." + + "Зашифрованная информация о положительном тесте передается в систему, и другим пользователям отправляются предупреждения." + + "Страница адаптации 5 из 5. Получение предупреждений и определение риска" + + "Получение предупреждений и определение риска" + + "Приложение может автоматически уведомлять о Вашем статусе риска и предупреждать о новых инфицированных людях среди Ваших контактов. Разрешите приложению уведомлять Вас." + + "Тогда Вы сможете самоизолироваться для защиты окружающих и узнать, где сдать тест." + + "Женщина получает уведомление от приложения Corona-Warn-App." + + + + + "Настройки" + + "Вкл." + + "Выкл." + + "Определение риска" + + "Вот как работает определение риска" + + "Разрешите генерацию и предоставление случайных идентификаторов COVID-19." + + "Определение риска активно" + + "Определение риска остановлено" + + "Сервисы определения местоположения отключены" + + "Чтобы определить наличие риска заражения включите функцию определения риска. Для идентификации риска Ваше устройство должно получать по Bluetooth зашифрованные случайные идентификаторы других пользователей и передавать Ваш случайный идентификатор на их устройства. Эту функцию можно в любое время отключить.""\n""\nЗашифрованные случайные идентификаторы передают другим людям только информацию о дате, продолжительности и близости (рассчитанной по силе сигнала) контакта. Персональные данные, например имя, адрес или местоположение, никогда не регистрируются. Персональная идентификация невозможна." + + "Активно" + + "Остановлено" + + "Ограничено" + + "Нет соединения с Интернетом" + + "Bluetooth выключен" + + "Включить Bluetooth" + + "Bluetooth нужно включить для регистрации контактов функцией определения риска. Включите Bluetooth в настройках вашего устройства." + + "Открыть настройки устройства" + + "Разрешить доступ к местоположению" + + "Доступ к Вашему местоположению невозможен. Чтобы использовать Bluetooth, Google и/или Android требуется доступ к местоположению Вашего устройства." + + "Открыть настройки устройства" + + "Установить соединение с Интернетом" + + "Для расчета контактов функцией определения риска требуется соединение с Интернетом. Включите Wi-Fi или мобильные данные в настройках устройства." + + "Открыть настройки устройства" + + + "Определение риска активно в течение %1$s дня.\nДля надежной проверки контактов функция определения риска должна быть активна всегда." + "Определение риска активно в течение %1$s дня.\nДля надежной проверки контактов функция определения риска должна быть активна всегда." + "Определение риска активно в течение %1$s дней.\nДля надежной проверки контактов функция определения риска должна быть активна всегда." + "Определение риска активно в течение %1$s дней.\nДля надежной проверки контактов функция определения риска должна быть активна всегда." + "Определение риска активно в течение %1$s дней.\nДля надежной проверки контактов функция определения риска должна быть активна всегда." + "Определение риска активно в течение %1$s дней.\nДля надежной проверки контактов функция определения риска должна быть активна всегда." + + + "Три человека активировали определение риска на своих устройствах, то есть их контакты друг с другом будут регистрироваться." + + "Человек деактивировал определение риска на своем смартфоне, то есть его контакты с двумя другими людьми не будут регистрироваться." + + "Человек выключил Bluetooth на своем смартфоне, то есть его контакты с двумя другими людьми не будут регистрироваться." + + + + "Человек отключил соединение с Интернетом на своем смартфоне, то есть его контакты с двумя другими людьми не будут регистрироваться." + + + "Уведомления" + + "Активировать уведомления о Вашем статусе риска заражения COVID-19?" + + "Уведомления деактивированы" + + "Разрешить автоматические уведомления о статусе риска заражения COVID-19" + + "Укажите уведомления, которые Вы хотите получать." + + "Чтобы активировать уведомления, нужно разрешить уведомления от приложения Corona-Warn-App в настройках Вашего устройства." + + "Активировать уведомления" + + "Уведомления" + + "Ваш риск заражения изменился" + + "Статус Вашего теста на COVID-19" + + "Открыть настройки устройства" + + "Женщина получает уведомление от приложения Corona-Warn-App." + + "Женщина деактивировала уведомления от приложения Corona-Warn-App." + + "Сбросить приложение" + + "Удалить все Ваши данные в приложении." + + "Действительно сбросить приложение?" + + "Вы больше не будете получать уведомления о контактах и не сможете предупреждать других пользователей." + + "Удалить журнал ""\n""контактов" + + "Журнал контактов удаляется отдельно в настройках Вашего устройства." + + "Сбросить приложение" + + "Отменить" + + "Рука держит смартфон, на котором отображается значок выполняемого сброса приложения." + + "Сбросить приложение" + + "Вы больше не будете получать уведомления о контактах и не сможете предупреждать других пользователей. Это действие нельзя отменить." + + "Отменить" + + "Сброс" + + "Приоритетная фоновая активность" + + "Разрешить автоматические обновления статуса риска" + + "Запускать Corona-Warn-App в фоновом режиме" + + "Приложение Corona-Warn-App всегда работает в фоновом режиме, если активировать приоритетную фоновую активность. Это позволяет приложению определять Ваш статус риска в любое время." + + + + "Чтобы отключить приоритетную фоновую активность, деактивируйте ее в нстройках устройства." + + "Открыть настройки устройства" + + "Отключить приоритетную фоновую активность" + + + + + "Информация о приложении" + + "Версия: %1s" + + "О приложении" + + "Давайте победим коронавирус вместе" + + "Институт Роберта Коха (РКИ) — это центральный федеральный институт Германии в области здравоохранения. По поручению федерального правительства РКИ выпустил приложение Corona-Warn-App. Приложение задумано как цифровое дополнение к уже принятым санитарным мерам: социальной дистанции, гигиене и ношению защитных масок." + + "Каждый пользователь приложения помогает отслеживать и останавливать передачу инфекции. Приложение регистрирует контакты с другими людьми локально на вашем устройстве. Вы получаете уведомления о контактах с людьми, которые впоследствии получили положительный результат теста на COVID-19. Ваши персональные данные и конфиденциальность надежно защищены." + + "Группа людей использует свои смартфоны в городе." + + "Конфиденциальность данных" + + "На смартфоне одной женщины установлено приложение Corona-Warn-App. Значок замка на фоне щита указывает на шифрование данных." + + "privacy_ru.html" + + "Условия использования" + + "Содержимое" + + "Рука держит смартфон с длинным текстом на экране. Рядом с текстом отображается галочка, символизирующая принятия условий использования." + + "terms_ru.html" + + "Горячая линия по техническим вопросам" + + "Чем мы можем Вам помочь?" + + "По техническим вопросам о приложении Corona-Warn-App обращайтесь на нашу горячую линию." + + "Горячая линия по техническим вопросам:" + + "+49 800 7540001" + + "+49 800 7540001" + + "Наша служба поддержки всегда готова помочь." + + "Языки: немецкий, английский, турецкий\nЧасы работы:""\n""пн-сб, 7:00-22:00""\n(кроме государственных праздников)""\nВсе звонки бесплатны." + + "По всем медицинским вопросам обращайтесь к вашему врачу общей практики или в скорую помощь по телефону: 116 117." + + "Человек совершает телефонный звонок с использованием гарнитуры." + + "Часто задаваемые вопросы" + + "Часто задаваемые вопросы. Вы будете переадресованы на внешний веб-сайт." + + "Правовые уведомления" + + "Рука держит смартфон с длинным текстом на экране. Рядом с текстом отображается значок весов, представляющий правовые уведомления." + + "technical_ru.html" + + "Правовая информация" + + "Опубликовано" + + "(ответственность согласно § 5 п. 1 TMG, § 55 п. 1 RStV, DS-GVO, BDSG)" + + "Институт Роберта Коха""\n""Nordufer 20""\n""13353 Berlin (Германия)""\n""\n""в лице его президента" + + "Контакты" + + "Эл. почта: CoronaWarnApp@rki.de""\n""Тел.: +49 30 18754 5100" + + "ИНН" + + "DE 165 893 430" + + "Рука держит смартфон с длинным текстом на экране. Рядом с текстом отображается значок параграфа, представляющий правовую информацию." + + + + + + "Ошибка" + + "Не удалось установить соединение (%1$d). Повторите попытку." + + "Не удалось установить соединение. Повторите попытку." + + "Назад" + + + "Ошибка" + + "QR-код/TAN недействителен или уже использовался. Повторите попытку или обратитесь на горячую линию по техническим вопросам по пути: Информация о приложении -> Горячая линия по техническим вопросам." + + "Назад" + + + "Ошибка" + + "Не удалось сгенерировать TAN для отправки. Обратитесь на горячую линию по техническим вопросам по пути: Информация о приложении -> Горячая линия по техническим вопросам." + + "Назад" + + + "Ошибка" + + "Сгенерированный TAN не действителен для отправки. Обратитесь на горячую линию по техническим вопросам, выбрав: Информация о приложении → Горячая линия по техническим вопросам." + + "Назад" + + + "В тесте есть ошибки" + + "Обнаружена проблема при анализе вашего теста. Ваш QR-код уже просрочен." + + "ОК" + + + + "Требуется разрешение на доступ к камере" + + "Разрешить приложению использовать камеру для сканирования QR-кода." + + "Разрешить" + + "Не разрешать" + + + + "Требуется доступ к камере" + + "Откройте системные настройки и разрешите приложению использовать камеру для сканирования QR-кода." + + "ОК" + + + + "Неверный QR-код" + + "Неверный QR-код. Повторите попытку." + + "Повторите попытку." + + "Отменить" + + + "Наведите рамку на QR-код." + + "Наведите рамку на QR-код." + + + + "Результат теста" + + "Как это работает:" + + "Тест успешно добавлен." + + "Ваш тест сохранен в приложении Corona-Warn-App." + + "Результат теста еще не доступен" + + "Ваш результат теста еще не доступен." + + "Обновить" + + "Удалить тест" + + "Ваш результат теста" + + "Лабораторное исследование не показало инфицирования коронавирусом SARS-CoV-2.\n\nУдалите тест из приложения Corona-Warn-App, чтобы здесь можно было сохранить новый код теста." + + "Удалить тест" + + "Ваш результат теста" + + "Ваш результат теста положительный." + + "Предупреждение других людей" + + "Предоставьте ваши случайные идентификаторы за последние 14 дней, чтобы защитить других людей и остановить передачу инфекции." + + "Дальше" + + "Ваш результат теста" + + "При анализе вашего теста возникла проблема. Обратитесь в местный орган здравоохранения за дальнейшими рекомендациями.\n\nУдалите тест из приложения Corona-Warn-App, чтобы здесь можно было сохранить новый код теста." + + "Удалить тест" + + "Требуется определение риска" + + "Активируйте определение риска, чтобы предупредить других людей" + + "ОК" + + "Удалить тест?" + + "Тест будет безвозвратно удален из приложения Corona-Warn-App без возможности повторного добавления. Это действие нельзя отменить." + + "Удалить" + + "Отменить" + + "Положительный тест на SARS-CoV-2" + + "Ваш тест на вирус SARS-CoV-2 положительный." + + + + "Ввод TAN" + + "Введите полученный 10-значный TAN." + + "Дальше" + + "Ввод TAN" + + "Неверный TAN, проверьте введенные данные." + + "Неверно, проверьте введенные данные." + + + + "Вы сдали тест?" + + "Вот как работает приложение Corona-Warn-App" + + "Чтобы приложение работало, нам нужна поддержка людей с положительным тестом на COVID-19.\n\nПоскольку передаются только зашифрованные случайные идентификаторы, анонимность будет сохранена. Вы можете выполнить следующие действия:" + + "Дальше" + + "Зашифрованная информация о положительном тесте передается в систему, и другим пользователям отправляются предупреждения." + + + "Если у Вас положительный тест на COVID-19, Вы можете уведомить других людей." + "Если Вы получили TAN для положительного теста, можете зарегистрировать свой тест по нему." + "Если у Вас нет TAN, Вы можете запросить его по телефону." + + + "Вы сдали тест? Вот как работает приложение Corona-Warn-App" + + + + "Выбор" + + "Какая информация есть у Вас?" + + "Документ с QR-кодом" + + "Отсканируйте QR-код из документа, чтобы зарегистрировать Ваш тест." + + "Заявление о согласии" + + "Нажав на «Принимаю», Вы соглашаетесь с тем, что Приложение вправе узнавать о статусе Вашего теста на коронавирус и высвечивать его в Приложении. Эта функция доступна, если Вы получили QR-код и дали свое согласие на передачу результатов теста в серверную систему Приложения. После того как тестирующая лаборатория разместит результаты теста на сервере, Вы сможете увидеть их в Приложении. Если Вы активировали уведомления, Вас проинформируют о получении результатов теста и вне Приложения. Сам же результат теста, тем не менее, будет показан только в Приложении, в целях обеспечения конфиденциальности. Вы можете в любое время отозвать данное согласие, удалив в Приложении регистрирование теста. Отзыв согласия не затрагивает правомерность обработки, осуществлявшейся до него. Дальнейшую информацию см. в пункте меню «Информация о конфиденциальности данных»." + + "Принимаю" + + "Не принимаю" + + "TAN" + + "Чтобы зарегистрировать Ваш тест, введите TAN вручную." + + "Запросить TAN" + + "Позвоните нам, если у Вас положительный тест на COVID-19." + + "Какая информация есть у Вас?" + + + + "Предупреждение других людей" + + "Помогите всем нам!" + + "Далее Вы можете разрешить приложению Corona-Warn-App предоставление ваших случайных идентификаторов за последние 14 дней другим людям. Так Вы предупредите их и поможете остановить передачу инфекции.\n\nПоскольку передаются только обезличенные случайные идентификаторы, Ваша анонимность сохраняется." + + "Конфиденциальность данных" + + "Нажав на «Принимаю», Вы выражаете свое согласие на передачу Приложением положительного результата Вашего теста вместе с Вашими случайными кодами за последние 14 дней в серверную систему Приложения, чтобы другие пользователи Приложения с активированной функцией определения риска были автоматически проинформированы о том, что они могли быть подвержены риску заражения. Передаваемые случайные коды не содержат никакой информации, которая бы раскрыла Вашу личность.\n\nПередача Вашего результата теста через Приложение является добровольной. Если Вы не передадите результат своего теста, никакого наказания не последует. Ввиду того, что невозможно проследить и проконтролировать, пользуетесь ли Вы Приложением и как Вы это делаете, никто, кроме Вас, не будет знать, передали ли Вы информацию об инфицировании.\n\nВы можете в любое время отозвать свое согласие, удалив Приложение. Отзыв согласия не затрагивает правомерность обработки, осуществлявшейся до момента отзыва. Дальнейшую информацию см. в пункте меню «Информация о конфиденциальности данных»." + + "Дальше" + + "Устройство передает зашифрованную информацию о положительном тесте в систему." + + + + + "Спасибо!" + + "Ваш вклад очень ценен. Благодарим за поддержку. Теперь другие люди получат предупреждение и смогут принять необходимые меры." + + "Внимание!" + + "Вы заразны." + + "Изолируйтесь от других людей." + + "Дополнительная информация:" + + + "Карантин обычно длится 14 дней. Наблюдайте за симптомами и их развитием." + "Ваш местный орган здравоохранения попросит Вас составить список людей, с которыми Вы контактировали. Вам нужно указать всех людей, с которыми у Вас были близкие контакты (личное общение на расстоянии менее 2 м) дольше 15 мин в последние два дня до появления у Вас симптомов." + "Особенно важно вспомнить людей, которые не будут уведомлены приложением, так как у них нет установленного приложения или даже смартфона." + "Даже если у Вас больше нет симптомов и Вы чувствуете себя хорошо, Вы еще можете быть заразны." + + + "Готово" + + "Группа людей радуется, потому что кто-то поделился результатом теста." + + + + "Запросить TAN" + + "Как это работает:" + + "Для запроса TAN просим Вас подготовить результат теста (если есть) и Ваш номер телефона." + + "Позвонить" + + "Ввести TAN" + + "Позвоните на горячую линию и запросите TAN:" + + "+49 800 7540002" + + "+49 800 7540002" + + "Чтобы зарегистрировать тест, введите TAN в приложении." + + "Языки: \nнемецкий, английский, турецкий\n\nЧасы работы:\nпн-вс, круглосуточно\n\nВсе звонки бесплатны." + + + "Позвонить на горячую линию и запросить TAN" + + "Первый шаг - это звонок на горячую линию для запроса TAN. Телефон горячей линии: +49 800 7540002. Она работает с 8:00 до 22:00 с понедельника по пятницу и с 10:00 до 22:00 в субботу и воскресенье. Все звонки бесплатны." + + "Второй шаг - регистрация Вашего теста в приложении по полученному TAN." + + + + "Данные вызываются..." + + "Вы сдали тест?" + + "Ваш результат еще не доступен" + + "Ваш результат доступен" + + "Положительный тест" + + "Недействительный тест" + + "Отрицательный тест" + + "Ваш результат обновляется" + + "Уведомьте других людей, чтобы остановить передачу инфекции." + + "Анализ вашего теста еще не завершен." + + "Не удалось проанализировать ваш тест." + + "Ваш тест на SARS-CoV-2 положительный." + + "Ваш тест на SARS-CoV-2 отрицательный." + + "Узнать больше и помочь" + + "Просмотреть тест" + + "Внимание!" + + "Вы заразны. Изолируйтесь от других людей." + + "Ваш местный орган здравоохранения свяжется с Вами в ближайшие дни по телефону или почте." + + "Поделитесь Вашими случайными идентификаторами, чтобы предупредить других людей." + + + "Ваш диагноз:" + + "SARS-CoV-2" + + "Зарегистрировано %s" + + "Отрицательный" + + "Положительный" + + "Анализ невозможен" + + "Ваш результат пока не доступен" + + "Дополнительная информация:" + + + "Все еще плохо себя чувствуете? Если Вам плохо и/или симптомы ухудшились, обратитесь к Вашему врачу общей практики." + "Оставайтесь дома до выздоровления. Заражение коронавирусом (SARS-CoV-2) в ослабленном состоянии из-за другой инфекции может привести к серьезным осложнениям." + "Не ходите на работу, если Вы плохо себя чувствуете, чтобы не ставить под угрозу здоровье других людей. Если симптомы ухудшились, сдайте тест на SARS-CoV-2." + + + + + "На предыдущую страницу" + + "Кнопка \"Продолжить\"" + + "Поделиться" + + "Меню" + + "Кнопка" + + "Изображение" + + + + "Нет соединения с Интернетом." + + "Недостаточно свободного места в памяти." + + "Ошибка связи с интерфейсом Google" + + "Невозможно выполнить это действие. Обратитесь на горячую линию." + + "Приложение Corona-Warn-App правильно установлено, но сервис уведомления о контактах с лицами, инфицированными COVID-19 недоступен в операционной системе Вашего смартфона. Это означает, что Вы не можете использовать Corona-Warn-App. Подробнее см. на странице часто задаваемых вопросов: https://www.coronawarn.app/en/faq/" + + "Приложение Corona-Warn-App выполняется корректно, но мы не можем обновить Ваш текущий статус риска. Определение риска остается активным и выполняется корректно. Подробнее см. на странице часто задаваемых вопросов: https://www.coronawarn.app/en/faq/" + + + + "Что-то пошло не так." + + "Причина" + + "ОК" + + "Сведения" + + "Неизвестная ошибка." + + + + "Lorem Ipsum" + + "Test API" + + "Test Risk Level" + + "Test Notification" + + "Android API Test(Manual Test)" + + "Start (Broadcast/Receive Bluetooth)" + + "Get Exposure keys (my keys history from api)" + + "Share my keys via Email" + + "Submit Exposure Key" + + "Show QR Code" + + "Submit keys to Server" + + "Scan Exposure Key" + + "Last 3 Hours Mode" + + "Check Exposure Summary" + + "Exposure summary" + + "Days since last exposure: %1$s" + + "Attenuation Durations in Minutes: %1$s" + + "Summation Risk Score: %1$s" + + "Matched key count: %1$s" + + "Maximum risk score %1$s" + + "My keys (count: %1$d)" + + "Other key" + + "Calculate Risk Level" + + \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/values-tr/strings.xml b/Corona-Warn-App/src/main/res/values-tr/strings.xml index fbb7cf3600e..e4a7145f562 100644 --- a/Corona-Warn-App/src/main/res/values-tr/strings.xml +++ b/Corona-Warn-App/src/main/res/values-tr/strings.xml @@ -726,6 +726,13 @@ "Geri" + + "Testte hata var" + + "Testinizi değerlendirirken bir problem oluştu. QR kodunuzun süresi dolmuş." + + "Tamam" + "Kamera yetkisi gereklidir" From 50109523cae97a27056408242f49d95240e29be6 Mon Sep 17 00:00:00 2001 From: Philipp Woessner <64482866+pwoessner@users.noreply.github.com> Date: Tue, 11 Aug 2020 09:41:52 +0200 Subject: [PATCH 07/27] Check if ENF is enabled before getting the exposure summary (EXPOSUREAPP-2080) (#992) * check if ENF is enabled before getting the exposure summary * added mock for InternalExposureNotificationClient.asyncIsEnabled() * deleted ru translation file --- .../storage/ExposureSummaryRepository.kt | 14 +- .../src/main/res/values-ru/strings.xml | 1119 ----------------- .../src/main/res/values/strings.xml | 2 +- .../storage/ExposureSummaryRepositoryTest.kt | 1 + 4 files changed, 10 insertions(+), 1126 deletions(-) delete mode 100644 Corona-Warn-App/src/main/res/values-ru/strings.xml diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/ExposureSummaryRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/ExposureSummaryRepository.kt index f13165bced6..f1836e794d8 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/ExposureSummaryRepository.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/ExposureSummaryRepository.kt @@ -47,12 +47,14 @@ class ExposureSummaryRepository(private val exposureSummaryDao: ExposureSummaryD ExposureSummaryRepository.daysSinceLastExposure.postValue(daysSinceLastExposure) } - suspend fun getLatestExposureSummary(token: String) = - InternalExposureNotificationClient.asyncGetExposureSummary(token) - .also { - matchedKeyCount.postValue(it.matchedKeyCount) - daysSinceLastExposure.postValue(it.daysSinceLastExposure) - } + suspend fun getLatestExposureSummary(token: String) { + if (InternalExposureNotificationClient.asyncIsEnabled()) + InternalExposureNotificationClient.asyncGetExposureSummary(token) + .also { + matchedKeyCount.postValue(it.matchedKeyCount) + daysSinceLastExposure.postValue(it.daysSinceLastExposure) + } + } private fun ExposureSummaryEntity.convertToExposureSummary() = ExposureSummary.ExposureSummaryBuilder() diff --git a/Corona-Warn-App/src/main/res/values-ru/strings.xml b/Corona-Warn-App/src/main/res/values-ru/strings.xml deleted file mode 100644 index df8ef6833c4..00000000000 --- a/Corona-Warn-App/src/main/res/values-ru/strings.xml +++ /dev/null @@ -1,1119 +0,0 @@ - - - - - - "shared_preferences_cwa" - - "preference_onboarding_completed" - - "preference_onboarding_completed_timestamp" - - "preference_background_check_done" - - "preference_reset_app" - - "preference_only_wifi" - - "preference_tracing" - - "preference_timestamp_diagnosis_keys_fetch" - - "preference_timestamp_manual_diagnosis_keys_retrieval" - - "preference_m_string_google_api_token" - - "preference_notifications_enabled" - - "preference_notifications_risk_enabled" - - "preference_notifications_test_enabled" - - "preference_background_job_enabled" - - "preference_mobile_data_enabled" - - "preference_registration_token" - - "preference_device_pairing_successful_time" - - "preference_initial_tracing_activation_time" - - "preference_initial_result_received_time" - - "preference_risk_level_score" - - "preference_risk_level_score_successful" - - "preference_timestamp_risk_level_calculation" - - "preference_test_guid" - - "preference_is_allowed_to_submit_diagnosis_keys" - - "preference_auth_code" - - "preference_database_password" - - "preference_total_non_active_tracing" - - "preference_last_non_active_tracing_timestamp" - - "preference_number_successful_submissions" - - "preference_teletan" - - "preference_last_three_hours_from_server" - - "preference_polling_test_result_started" - - "preference_test_result_notification" - - "preference_risk_days_explanation_shown" - - - - - "Назад" - - "Дальше" - - "Меню" - - "Закрыть" - - "Приложение Corona-Warn-App" - - "Кнопка" - - - - - "Обзор" - - "Информация о приложении" - - "Настройки" - - - - "de.rki.coronawarnapp.notification.exposureNotificationChannelId" - - "1" - - "Приложение Corona-Warn-App" - - "Уведомления от Corona-Warn-App" - - "Приложение Corona-Warn-App" - - "Есть новые сообщения от приложения Corona-Warn-App." - - - - - "Доступно обновление" - - "Для дальнейшего использования приложения Corona-Warn-App установите последнее обновление." - - "Обновить" - - - - - "Пока нет контактов" - - - "%1$s контакт" - "%1$s контакта" - "Пока нет контактов" - "%1$s контакта" - "%1$s контакта" - "%1$s контактов" - - - - "%1$s контакт" - "%1$s контакта" - "Пока нет контактов" - "%1$s контакта" - "%1$s контакта" - "%1$s контактов" - - - "Определение риска активно %1$s из 14 прошедших дней." - - "Определение риска постоянно активно." - - "Контакты еще не проверены." - - "Обновлено: %1$s" - - "Обновляется ежедневно" - - "Обновить" - - "Обновление через %1$s" - - "Активировать определение риска" - - "Активируйте определение риска, чтобы оценить свой статус риска сегодня." - - "Низкий риск" - - "Повышенный риск" - - - "%1$s день с последнего контакта" - "%1$s дня с последнего контакта" - "%1$s дней с последнего контакта" - "%1$s дня с последнего контакта" - "%1$s дня с последнего контакта" - "%1$s дней с последнего контакта" - - - "Неизвестный риск" - - "С момента активации определения риска не прошло достаточно времени, чтобы рассчитать Ваш риск заражения." - - "Определение риска остановлено" - - "Последнее определение риска:""\n""%1$s" - - "Определение риска невозможно" - - "Не удается обновить определение риска более 24 часов." - - "Ваш статус риска не обновлялся более 48 часов: обновите свой статус риска." - - "Проверка выполняется..." - - "Текущие данные выгружаются и проверяются. Это может занять несколько минут." - - - - - "Часто задаваемые вопросы" - - "Здесь Вы найдете ответы на часто задаваемые вопросы о приложении Corona-Warn-App. Вы будете переадресованы на внешний веб-сайт." - - "https://www.bundesregierung.de/corona-warn-app-faq-englisch" - - "Здесь Вы найдете ответы на часто задаваемые вопросы о приложении Corona-Warn-App. Вы будете переадресованы на внешний веб-сайт." - - - - - "Поделиться Corona-Warn-App" - - "Давайте победим коронавирус вместе" - - "Чем больше пользователей приложения, тем быстрее мы сможем остановить передачу инфекции. Предложите своим родным и друзьям выгрузить приложение." - - "Отправить ссылку для выгрузки" - - "Победим коронавирус вместе""\n""Я участвую, а ты?""\n""https://www.corona-warn-app.de""\n""\n" - - "Человек делится приложением Corona-Warn-App с четырьмя другими людьми." - - - - - "Обзор" - - "Обзор" - - "Определение риска" - - "Определение риска - одна из трех основных функций приложения. Когда она активирована, регистрируются контакты с устройствами других людей. Вам не нужно ничего делать." - - "Риск заражения" - - "Если Вы в течение последних 14 дней контактировали с лицом с положительным тестом на COVID-19, приложение рассчитает Ваш риск заражения. Для этого оцениваются продолжительность и близость контакта." - - "Статус риска может иметь следующие значения:" - - "Повышенный риск" - - "Низкий риск" - - "Неизвестный риск" - - "Уведомление других пользователей" - - "Еще одна из основных функций - регистрация Вашего теста и получение результата. Если у Вас положительный текст на COVID-19, Вы можете уведомить других людей и остановить передачу инфекции." - - "Терминология:" - - "Журнал контактов" - - "Список полученных и случайных идентификаторов, временно сохраненных в хранилище операционной системы. Этот список считывается при проверке контактов. Все случайные идентификаторы автоматически удаляются через 14 дней." - - "Проверка контактов" - - "Данные журнала контактов вызываются и синхронизируются с зарегистрированными заражениями других пользователей. Проверка контактов выполняется автоматически с интервалом около двух часов." - - "Контакты" - - "Продолжительные и близкие контакты с лицом, у которого диагностирован COVID-19." - - "Уведомление о контакте" - - "Отображение уведомлений в приложении Corona-Warn-App." - - "Случайные идентификаторы" - - "Случайные идентификаторы представляют собой комбинации цифр и букв, генерируемые произвольно. Они передаются между устройствами в непосредственной близости. По случайным идентификаторам нельзя отследить конкретных лиц. Они автоматически удаляются через 14 дней. Лица с положительным тестом на COVID-19 могут по желанию поделиться своими случайными идентификаторами за срок до 14 дней с другими пользователями приложения." - - "На смартфоне отображается разное содержимое, пронумерованное от 1 до 3." - - "Главная страница приложения Corona-Warn-App" - - - - - "Ваш статус риска" - - "Инструкции" - - "Вот что Вам нужно сделать" - - "По возможности возвращайтесь домой и оставайтесь дома." - - "Контакты для вопросов о симптомах, доступности тестирования и самоизоляции:" - - "Регулярно мойте руки." - - "Носите защитную маску при контактах с другими людьми." - - "Соблюдайте расстояние не менее 1,5 м от других людей." - - "Во время чихания и кашля прикрывайте рот сгибом локтя или салфеткой." - - "Ваш врач общей практики" - - "Скорая помощь (тел. 116117)" - - "Местный орган здравоохранения" - - "Риск заражения" - - "Период нахождения в системе" - - "Этот период включен в расчет." - - "Ваш риск заражения можно рассчитать только для периодов активного определения риска, поэтому функция определения должна быть постоянно активной." - - "Определение риска охватывает последние 14 дней. В течение этого времени функция определения на Вашем устройстве была активна %1$s дн. Приложение автоматически удаляет старые журналы, как только они теряют значение для предотвращения заражения." - - "Вот как был рассчитан Ваш риск" - - "Вот как рассчитывается Ваш риск" - - "С момента активации определения риска не прошло достаточно времени, чтобы рассчитать Ваш риск заражения." - - "Не удается обновить определение риска более 24 часов." - - "У Вас низкий риск заражения, поскольку не зарегистрировано контактов с лицами с положительным тестом на COVID-19 или контакты были кратковременными и на большом расстоянии." - - - "У Вас повышенный риск заражения, поскольку %1$s день назад у Вас был продолжительный близкий контакт минимум с одним лицом с положительным тестом на COVID-19." - "У Вас повышенный риск заражения, поскольку %1$s дня назад у Вас был продолжительный близкий контакт минимум с одним лицом с положительным тестом на COVID-19." - "У Вас повышенный риск заражения, поскольку %1$s дней назад у Вас был продолжительный близкий контакт минимум с одним лицом с положительным тестом на COVID-19." - "У Вас повышенный риск заражения, поскольку %1$s дня назад у Вас был продолжительный близкий контакт минимум с одним лицом с положительным тестом на COVID-19." - "У Вас повышенный риск заражения, поскольку %1$s дня назад у Вас был продолжительный близкий контакт минимум с одним лицом с положительным тестом на COVID-19." - "У Вас повышенный риск заражения, поскольку %1$s дней назад у Вас был продолжительный близкий контакт минимум с одним лицом с положительным тестом на COVID-19." - - - "Ваш риск заражения рассчитывается по локальным данным определения риска (продолжительности и близости) на Вашем устройстве. Данные риска заражения не показываются и не передаются другим лицам." - - @string/risk_card_button_update - - @string/risk_card_button_enable_tracing - - "Ваш статус риска" - - - "Информация о функции определения риска" - - "Подробнее см. на странице часто задаваемых вопросов." - - - - - "Не активировать" - - "Активировать" - - "Отменить" - - "Дальше" - - "Давайте начнем" - - "Назад" - - "Страница адаптации 1 из 5. Победим коронавирус вместе" - - "Давайте победим коронавирус вместе" - - "Более надежная защита для Вас и для всех нас. Приложение Corona-Warn-App поможет быстрее остановить передачу инфекции." - - "Сделайте из Вашего устройства систему предупреждения о коронавирусе. Просматривайте Ваш статус риска и определяйте, были ли у Вас близкие контакты с лицами с положительным тестом на COVID-19 за последние 14 дней." - - "Контакты людей регистрируются в приложении путем обмена зашифрованными случайными идентификаторами между устройствами без доступа к каким-либо персональным данным." - - "Группа людей использует свои смартфоны в городе." - - "Страница адаптации 2 из 5. Конфиденциальность данных. Далее идет подробный текст. Для продолжения нажмите кнопку внизу экрана." - - "Конфиденциальность данных" - - - "На смартфоне одной женщины установлено приложение Corona-Warn-App. Значок замка на фоне щита указывает на шифрование данных." - - "Страница адаптации 3 из 5. Активация определения риска" - - "Как активировать определение риска" - - "Чтобы узнать, есть ли у Вас риск заражения, нужно активировать функцию определения риска." - - "Для определения риска Ваше устройство получает по Bluetooth зашифрованные случайные идентификаторы других пользователей и передает Ваш случайный идентификатор на их устройства. Эту функцию можно деактивировать в любое время." - - "Зашифрованные случайные идентификаторы передают другим людям только информацию о дате, продолжительности и близости (по силе сигнала) контакта. Персональные данные, такие как имя, адрес или местоположение, никогда не регистрируются. Идентификация лица невозможна." - - "Заявление о согласии" - - "Чтобы узнать, был ли у Вас контакт с инфицированным лицом и есть ли риск заражения, Вам необходимо активировать в Приложении функцию \"Определение риска\". Вы даете свое согласие на активацию определения риска и соответствующую обработку данных, нажав \"Активировать определение риска\".""\n""\n""Для использования функции определения риска Вам также необходимо активировать на своем смартфоне разработанную компанией Google функцию записи контактов „COVID-19: отслеживание контактов“ и разрешить допуск к мобильному приложению Corona-Warn-App.""\n""\n""При активации функции записи контактов Ваш смартфон автоматически генерирует и посылает через Bluetooth случайные коды, которые могут быть получены другими смартфонами Apple и Android вблизи от Вас, в которых также активирована функция записи контактов. В свою очередь, Ваш смартфон получает случайные коды других смартфонов. Ваши собственные и полученные с других смартфонов случайные коды хранятся в течение 14 дней в журнале контактов функции «COVID-19: отслеживание контактов».""\n""\n""Для определения Вашего риска заражения Приложение загружает в течение дня, неоднократно или по запросу, список случайных кодов всех пользователей, которые сообщили через Приложение о своем подтвержденном диагнозе. Затем данный список сравнивается со списком случайных кодов, сохраненных в журнале контактов функции записи контактов. Если при этом Приложение зафиксирует возможный контакт с инфицированным пользователем, Приложение уведомит Вас о контакте с инфицированным лицом и о риске заражения. В этом случае Приложение получит доступ к остальным данным, сохраненным в журнале контактов функции «COVID-19: отслеживание контактов» Вашего смартфона (дата, длительность контакта и сила сигнала Bluetooth).""\n""\n""Сила сигнала Bluetooth помогает определить расстояние (чем сильнее сигнал, тем меньше расстояние). Приложение обрабатывает эти данные для того, чтобы оценить для Вас риск заражения коронавирусом и предоставить Вам рекомендации для дальнейших действий. Данная обработка данных осуществляется исключительно локально на Вашем смартфоне. Никто (в том числе ИРК), кроме Вас, не узнает о том, находились ли Вы в контакте с инфицированным лицом и каким был результат оценки риска заражения.""\n""\n""Чтобы отозвать свое согласие на определение риска, Вы можете деактивировать эту функцию в Приложении, нажав на ползунок, или удалить Приложение. Если Вы хотите снова использовать определение степени риска, активируйте заново ползунок или снова установите Приложение. При отключении функции определения риска Приложение больше не проверяет, был ли у Вас контакт с инфицированным пользователем. Чтобы остановить отправку и получение случайных кодов, Вам необходимо отключить в настройках Вашего смартфона функцию «COVID-19: отслеживание контактов». Обратите внимание, что Ваши и сторонние случайные коды, сохраненные в журнале контактов функции «COVID-19: отслеживание контактов» не удаляются в Приложении. Сохраненные данные в журнале контактов функции «COVID-19: отслеживание контактов» Вы можете удалить на долгосрочный период только в настройках смартфона.""\n""\n""Политика конфиденциальности Приложения (в том числе информация об обработке данных для определения степени риска) доступна в пункте меню «Информация о конфиденциальности данных»." - - "Активировать определение риска" - - "Авторизация" - - "Это означает, что приложение Corona-Warn-App не может отправлять и получать уведомления о Вашем статусе риска заражения COVID-19. Вы можете деактивировать эту функцию в любое время." - - "Не активировать" - - "Назад" - - "Обновление в фоновом режиме отключено" - - "Вы отключили обновление приложения Corona-Warn-App в фоновом режиме. Включите обновление в фоновом режиме для использования автоматического определения риска. При отключенном обновлении в фоновом режиме определение риска можно запустить только вручную. Активировать обновление в фоновом режиме можно в настройках своего устройства." - - "Открыть настройки устройства" - - "Запустить определение риска вручную" - - "Разрешить приоритетную фоновую активность" - - "Включите приоритетную фоновую активность, чтобы разрешить приложению влюбое время определять Ваш статус риска в фоновом режиме (рекомендуется). Такая настройка отключает оптимизацию расхода заряда аккумулятора только для приложения Corona-Warn-App. Мы не предполагаем, что это может существенно снизить расход Вашего аккумулятора.\n\nПри отказе от данной настройки рекомендуем Вам открывать приложении вручную хотя бы раз в 24 часа." - - "Разрешить" - - "Не разрешать" - - "Приоритетная фоновая активность отключена" - - "Обратите внимание, что при отключении приоритетной фоновой активности Вам нужно раз в 24 часа открывать приложение вручную, чтобы определить свой статус риска.\n\nВы в любое время можете включить приоритетную фоновую активность в настройках." - - "ОК" - - "Три человека активировали определение риска на своих устройствах, то есть их контакты друг с другом будут регистрироваться." - - "Разрешить доступ к местоположению" - - "Доступ к Вашему местоположению невозможен. Чтобы использовать Bluetooth, Google и/или Android требуется доступ к местоположению Вашего устройства." - - "Открыть настройки устройства" - - "Страница адаптации 4 из 5. Если у Вас положительный тест на COVID-19..." - - "Если у Вас положительный тест на COVID-19..." - - "…Укажите это в приложении Corona-Warn-App. Предоставление результата Вашего теста является добровольным и безопасным. Просим Вас об этом ради здоровья других людей." - - "Ваше уведомление шифруется для защиты и обрабатывается на безопасном сервере. Людям, от которых Ваше устройство получило зашифрованные случайные идентификаторы, отправляется предупреждение вместе с рекомендуемыми действиями." - - "Зашифрованная информация о положительном тесте передается в систему, и другим пользователям отправляются предупреждения." - - "Страница адаптации 5 из 5. Получение предупреждений и определение риска" - - "Получение предупреждений и определение риска" - - "Приложение может автоматически уведомлять о Вашем статусе риска и предупреждать о новых инфицированных людях среди Ваших контактов. Разрешите приложению уведомлять Вас." - - "Тогда Вы сможете самоизолироваться для защиты окружающих и узнать, где сдать тест." - - "Женщина получает уведомление от приложения Corona-Warn-App." - - - - - "Настройки" - - "Вкл." - - "Выкл." - - "Определение риска" - - "Вот как работает определение риска" - - "Разрешите генерацию и предоставление случайных идентификаторов COVID-19." - - "Определение риска активно" - - "Определение риска остановлено" - - "Сервисы определения местоположения отключены" - - "Чтобы определить наличие риска заражения включите функцию определения риска. Для идентификации риска Ваше устройство должно получать по Bluetooth зашифрованные случайные идентификаторы других пользователей и передавать Ваш случайный идентификатор на их устройства. Эту функцию можно в любое время отключить.""\n""\nЗашифрованные случайные идентификаторы передают другим людям только информацию о дате, продолжительности и близости (рассчитанной по силе сигнала) контакта. Персональные данные, например имя, адрес или местоположение, никогда не регистрируются. Персональная идентификация невозможна." - - "Активно" - - "Остановлено" - - "Ограничено" - - "Нет соединения с Интернетом" - - "Bluetooth выключен" - - "Включить Bluetooth" - - "Bluetooth нужно включить для регистрации контактов функцией определения риска. Включите Bluetooth в настройках вашего устройства." - - "Открыть настройки устройства" - - "Разрешить доступ к местоположению" - - "Доступ к Вашему местоположению невозможен. Чтобы использовать Bluetooth, Google и/или Android требуется доступ к местоположению Вашего устройства." - - "Открыть настройки устройства" - - "Установить соединение с Интернетом" - - "Для расчета контактов функцией определения риска требуется соединение с Интернетом. Включите Wi-Fi или мобильные данные в настройках устройства." - - "Открыть настройки устройства" - - - "Определение риска активно в течение %1$s дня.\nДля надежной проверки контактов функция определения риска должна быть активна всегда." - "Определение риска активно в течение %1$s дня.\nДля надежной проверки контактов функция определения риска должна быть активна всегда." - "Определение риска активно в течение %1$s дней.\nДля надежной проверки контактов функция определения риска должна быть активна всегда." - "Определение риска активно в течение %1$s дней.\nДля надежной проверки контактов функция определения риска должна быть активна всегда." - "Определение риска активно в течение %1$s дней.\nДля надежной проверки контактов функция определения риска должна быть активна всегда." - "Определение риска активно в течение %1$s дней.\nДля надежной проверки контактов функция определения риска должна быть активна всегда." - - - "Три человека активировали определение риска на своих устройствах, то есть их контакты друг с другом будут регистрироваться." - - "Человек деактивировал определение риска на своем смартфоне, то есть его контакты с двумя другими людьми не будут регистрироваться." - - "Человек выключил Bluetooth на своем смартфоне, то есть его контакты с двумя другими людьми не будут регистрироваться." - - - - "Человек отключил соединение с Интернетом на своем смартфоне, то есть его контакты с двумя другими людьми не будут регистрироваться." - - - "Уведомления" - - "Активировать уведомления о Вашем статусе риска заражения COVID-19?" - - "Уведомления деактивированы" - - "Разрешить автоматические уведомления о статусе риска заражения COVID-19" - - "Укажите уведомления, которые Вы хотите получать." - - "Чтобы активировать уведомления, нужно разрешить уведомления от приложения Corona-Warn-App в настройках Вашего устройства." - - "Активировать уведомления" - - "Уведомления" - - "Ваш риск заражения изменился" - - "Статус Вашего теста на COVID-19" - - "Открыть настройки устройства" - - "Женщина получает уведомление от приложения Corona-Warn-App." - - "Женщина деактивировала уведомления от приложения Corona-Warn-App." - - "Сбросить приложение" - - "Удалить все Ваши данные в приложении." - - "Действительно сбросить приложение?" - - "Вы больше не будете получать уведомления о контактах и не сможете предупреждать других пользователей." - - "Удалить журнал ""\n""контактов" - - "Журнал контактов удаляется отдельно в настройках Вашего устройства." - - "Сбросить приложение" - - "Отменить" - - "Рука держит смартфон, на котором отображается значок выполняемого сброса приложения." - - "Сбросить приложение" - - "Вы больше не будете получать уведомления о контактах и не сможете предупреждать других пользователей. Это действие нельзя отменить." - - "Отменить" - - "Сброс" - - "Приоритетная фоновая активность" - - "Разрешить автоматические обновления статуса риска" - - "Запускать Corona-Warn-App в фоновом режиме" - - "Приложение Corona-Warn-App всегда работает в фоновом режиме, если активировать приоритетную фоновую активность. Это позволяет приложению определять Ваш статус риска в любое время." - - - - "Чтобы отключить приоритетную фоновую активность, деактивируйте ее в нстройках устройства." - - "Открыть настройки устройства" - - "Отключить приоритетную фоновую активность" - - - - - "Информация о приложении" - - "Версия: %1s" - - "О приложении" - - "Давайте победим коронавирус вместе" - - "Институт Роберта Коха (РКИ) — это центральный федеральный институт Германии в области здравоохранения. По поручению федерального правительства РКИ выпустил приложение Corona-Warn-App. Приложение задумано как цифровое дополнение к уже принятым санитарным мерам: социальной дистанции, гигиене и ношению защитных масок." - - "Каждый пользователь приложения помогает отслеживать и останавливать передачу инфекции. Приложение регистрирует контакты с другими людьми локально на вашем устройстве. Вы получаете уведомления о контактах с людьми, которые впоследствии получили положительный результат теста на COVID-19. Ваши персональные данные и конфиденциальность надежно защищены." - - "Группа людей использует свои смартфоны в городе." - - "Конфиденциальность данных" - - "На смартфоне одной женщины установлено приложение Corona-Warn-App. Значок замка на фоне щита указывает на шифрование данных." - - "privacy_ru.html" - - "Условия использования" - - "Содержимое" - - "Рука держит смартфон с длинным текстом на экране. Рядом с текстом отображается галочка, символизирующая принятия условий использования." - - "terms_ru.html" - - "Горячая линия по техническим вопросам" - - "Чем мы можем Вам помочь?" - - "По техническим вопросам о приложении Corona-Warn-App обращайтесь на нашу горячую линию." - - "Горячая линия по техническим вопросам:" - - "+49 800 7540001" - - "+49 800 7540001" - - "Наша служба поддержки всегда готова помочь." - - "Языки: немецкий, английский, турецкий\nЧасы работы:""\n""пн-сб, 7:00-22:00""\n(кроме государственных праздников)""\nВсе звонки бесплатны." - - "По всем медицинским вопросам обращайтесь к вашему врачу общей практики или в скорую помощь по телефону: 116 117." - - "Человек совершает телефонный звонок с использованием гарнитуры." - - "Часто задаваемые вопросы" - - "Часто задаваемые вопросы. Вы будете переадресованы на внешний веб-сайт." - - "Правовые уведомления" - - "Рука держит смартфон с длинным текстом на экране. Рядом с текстом отображается значок весов, представляющий правовые уведомления." - - "technical_ru.html" - - "Правовая информация" - - "Опубликовано" - - "(ответственность согласно § 5 п. 1 TMG, § 55 п. 1 RStV, DS-GVO, BDSG)" - - "Институт Роберта Коха""\n""Nordufer 20""\n""13353 Berlin (Германия)""\n""\n""в лице его президента" - - "Контакты" - - "Эл. почта: CoronaWarnApp@rki.de""\n""Тел.: +49 30 18754 5100" - - "ИНН" - - "DE 165 893 430" - - "Рука держит смартфон с длинным текстом на экране. Рядом с текстом отображается значок параграфа, представляющий правовую информацию." - - - - - - "Ошибка" - - "Не удалось установить соединение (%1$d). Повторите попытку." - - "Не удалось установить соединение. Повторите попытку." - - "Назад" - - - "Ошибка" - - "QR-код/TAN недействителен или уже использовался. Повторите попытку или обратитесь на горячую линию по техническим вопросам по пути: Информация о приложении -> Горячая линия по техническим вопросам." - - "Назад" - - - "Ошибка" - - "Не удалось сгенерировать TAN для отправки. Обратитесь на горячую линию по техническим вопросам по пути: Информация о приложении -> Горячая линия по техническим вопросам." - - "Назад" - - - "Ошибка" - - "Сгенерированный TAN не действителен для отправки. Обратитесь на горячую линию по техническим вопросам, выбрав: Информация о приложении → Горячая линия по техническим вопросам." - - "Назад" - - - "В тесте есть ошибки" - - "Обнаружена проблема при анализе вашего теста. Ваш QR-код уже просрочен." - - "ОК" - - - - "Требуется разрешение на доступ к камере" - - "Разрешить приложению использовать камеру для сканирования QR-кода." - - "Разрешить" - - "Не разрешать" - - - - "Требуется доступ к камере" - - "Откройте системные настройки и разрешите приложению использовать камеру для сканирования QR-кода." - - "ОК" - - - - "Неверный QR-код" - - "Неверный QR-код. Повторите попытку." - - "Повторите попытку." - - "Отменить" - - - "Наведите рамку на QR-код." - - "Наведите рамку на QR-код." - - - - "Результат теста" - - "Как это работает:" - - "Тест успешно добавлен." - - "Ваш тест сохранен в приложении Corona-Warn-App." - - "Результат теста еще не доступен" - - "Ваш результат теста еще не доступен." - - "Обновить" - - "Удалить тест" - - "Ваш результат теста" - - "Лабораторное исследование не показало инфицирования коронавирусом SARS-CoV-2.\n\nУдалите тест из приложения Corona-Warn-App, чтобы здесь можно было сохранить новый код теста." - - "Удалить тест" - - "Ваш результат теста" - - "Ваш результат теста положительный." - - "Предупреждение других людей" - - "Предоставьте ваши случайные идентификаторы за последние 14 дней, чтобы защитить других людей и остановить передачу инфекции." - - "Дальше" - - "Ваш результат теста" - - "При анализе вашего теста возникла проблема. Обратитесь в местный орган здравоохранения за дальнейшими рекомендациями.\n\nУдалите тест из приложения Corona-Warn-App, чтобы здесь можно было сохранить новый код теста." - - "Удалить тест" - - "Требуется определение риска" - - "Активируйте определение риска, чтобы предупредить других людей" - - "ОК" - - "Удалить тест?" - - "Тест будет безвозвратно удален из приложения Corona-Warn-App без возможности повторного добавления. Это действие нельзя отменить." - - "Удалить" - - "Отменить" - - "Положительный тест на SARS-CoV-2" - - "Ваш тест на вирус SARS-CoV-2 положительный." - - - - "Ввод TAN" - - "Введите полученный 10-значный TAN." - - "Дальше" - - "Ввод TAN" - - "Неверный TAN, проверьте введенные данные." - - "Неверно, проверьте введенные данные." - - - - "Вы сдали тест?" - - "Вот как работает приложение Corona-Warn-App" - - "Чтобы приложение работало, нам нужна поддержка людей с положительным тестом на COVID-19.\n\nПоскольку передаются только зашифрованные случайные идентификаторы, анонимность будет сохранена. Вы можете выполнить следующие действия:" - - "Дальше" - - "Зашифрованная информация о положительном тесте передается в систему, и другим пользователям отправляются предупреждения." - - - "Если у Вас положительный тест на COVID-19, Вы можете уведомить других людей." - "Если Вы получили TAN для положительного теста, можете зарегистрировать свой тест по нему." - "Если у Вас нет TAN, Вы можете запросить его по телефону." - - - "Вы сдали тест? Вот как работает приложение Corona-Warn-App" - - - - "Выбор" - - "Какая информация есть у Вас?" - - "Документ с QR-кодом" - - "Отсканируйте QR-код из документа, чтобы зарегистрировать Ваш тест." - - "Заявление о согласии" - - "Нажав на «Принимаю», Вы соглашаетесь с тем, что Приложение вправе узнавать о статусе Вашего теста на коронавирус и высвечивать его в Приложении. Эта функция доступна, если Вы получили QR-код и дали свое согласие на передачу результатов теста в серверную систему Приложения. После того как тестирующая лаборатория разместит результаты теста на сервере, Вы сможете увидеть их в Приложении. Если Вы активировали уведомления, Вас проинформируют о получении результатов теста и вне Приложения. Сам же результат теста, тем не менее, будет показан только в Приложении, в целях обеспечения конфиденциальности. Вы можете в любое время отозвать данное согласие, удалив в Приложении регистрирование теста. Отзыв согласия не затрагивает правомерность обработки, осуществлявшейся до него. Дальнейшую информацию см. в пункте меню «Информация о конфиденциальности данных»." - - "Принимаю" - - "Не принимаю" - - "TAN" - - "Чтобы зарегистрировать Ваш тест, введите TAN вручную." - - "Запросить TAN" - - "Позвоните нам, если у Вас положительный тест на COVID-19." - - "Какая информация есть у Вас?" - - - - "Предупреждение других людей" - - "Помогите всем нам!" - - "Далее Вы можете разрешить приложению Corona-Warn-App предоставление ваших случайных идентификаторов за последние 14 дней другим людям. Так Вы предупредите их и поможете остановить передачу инфекции.\n\nПоскольку передаются только обезличенные случайные идентификаторы, Ваша анонимность сохраняется." - - "Конфиденциальность данных" - - "Нажав на «Принимаю», Вы выражаете свое согласие на передачу Приложением положительного результата Вашего теста вместе с Вашими случайными кодами за последние 14 дней в серверную систему Приложения, чтобы другие пользователи Приложения с активированной функцией определения риска были автоматически проинформированы о том, что они могли быть подвержены риску заражения. Передаваемые случайные коды не содержат никакой информации, которая бы раскрыла Вашу личность.\n\nПередача Вашего результата теста через Приложение является добровольной. Если Вы не передадите результат своего теста, никакого наказания не последует. Ввиду того, что невозможно проследить и проконтролировать, пользуетесь ли Вы Приложением и как Вы это делаете, никто, кроме Вас, не будет знать, передали ли Вы информацию об инфицировании.\n\nВы можете в любое время отозвать свое согласие, удалив Приложение. Отзыв согласия не затрагивает правомерность обработки, осуществлявшейся до момента отзыва. Дальнейшую информацию см. в пункте меню «Информация о конфиденциальности данных»." - - "Дальше" - - "Устройство передает зашифрованную информацию о положительном тесте в систему." - - - - - "Спасибо!" - - "Ваш вклад очень ценен. Благодарим за поддержку. Теперь другие люди получат предупреждение и смогут принять необходимые меры." - - "Внимание!" - - "Вы заразны." - - "Изолируйтесь от других людей." - - "Дополнительная информация:" - - - "Карантин обычно длится 14 дней. Наблюдайте за симптомами и их развитием." - "Ваш местный орган здравоохранения попросит Вас составить список людей, с которыми Вы контактировали. Вам нужно указать всех людей, с которыми у Вас были близкие контакты (личное общение на расстоянии менее 2 м) дольше 15 мин в последние два дня до появления у Вас симптомов." - "Особенно важно вспомнить людей, которые не будут уведомлены приложением, так как у них нет установленного приложения или даже смартфона." - "Даже если у Вас больше нет симптомов и Вы чувствуете себя хорошо, Вы еще можете быть заразны." - - - "Готово" - - "Группа людей радуется, потому что кто-то поделился результатом теста." - - - - "Запросить TAN" - - "Как это работает:" - - "Для запроса TAN просим Вас подготовить результат теста (если есть) и Ваш номер телефона." - - "Позвонить" - - "Ввести TAN" - - "Позвоните на горячую линию и запросите TAN:" - - "+49 800 7540002" - - "+49 800 7540002" - - "Чтобы зарегистрировать тест, введите TAN в приложении." - - "Языки: \nнемецкий, английский, турецкий\n\nЧасы работы:\nпн-вс, круглосуточно\n\nВсе звонки бесплатны." - - - "Позвонить на горячую линию и запросить TAN" - - "Первый шаг - это звонок на горячую линию для запроса TAN. Телефон горячей линии: +49 800 7540002. Она работает с 8:00 до 22:00 с понедельника по пятницу и с 10:00 до 22:00 в субботу и воскресенье. Все звонки бесплатны." - - "Второй шаг - регистрация Вашего теста в приложении по полученному TAN." - - - - "Данные вызываются..." - - "Вы сдали тест?" - - "Ваш результат еще не доступен" - - "Ваш результат доступен" - - "Положительный тест" - - "Недействительный тест" - - "Отрицательный тест" - - "Ваш результат обновляется" - - "Уведомьте других людей, чтобы остановить передачу инфекции." - - "Анализ вашего теста еще не завершен." - - "Не удалось проанализировать ваш тест." - - "Ваш тест на SARS-CoV-2 положительный." - - "Ваш тест на SARS-CoV-2 отрицательный." - - "Узнать больше и помочь" - - "Просмотреть тест" - - "Внимание!" - - "Вы заразны. Изолируйтесь от других людей." - - "Ваш местный орган здравоохранения свяжется с Вами в ближайшие дни по телефону или почте." - - "Поделитесь Вашими случайными идентификаторами, чтобы предупредить других людей." - - - "Ваш диагноз:" - - "SARS-CoV-2" - - "Зарегистрировано %s" - - "Отрицательный" - - "Положительный" - - "Анализ невозможен" - - "Ваш результат пока не доступен" - - "Дополнительная информация:" - - - "Все еще плохо себя чувствуете? Если Вам плохо и/или симптомы ухудшились, обратитесь к Вашему врачу общей практики." - "Оставайтесь дома до выздоровления. Заражение коронавирусом (SARS-CoV-2) в ослабленном состоянии из-за другой инфекции может привести к серьезным осложнениям." - "Не ходите на работу, если Вы плохо себя чувствуете, чтобы не ставить под угрозу здоровье других людей. Если симптомы ухудшились, сдайте тест на SARS-CoV-2." - - - - - "На предыдущую страницу" - - "Кнопка \"Продолжить\"" - - "Поделиться" - - "Меню" - - "Кнопка" - - "Изображение" - - - - "Нет соединения с Интернетом." - - "Недостаточно свободного места в памяти." - - "Ошибка связи с интерфейсом Google" - - "Невозможно выполнить это действие. Обратитесь на горячую линию." - - "Приложение Corona-Warn-App правильно установлено, но сервис уведомления о контактах с лицами, инфицированными COVID-19 недоступен в операционной системе Вашего смартфона. Это означает, что Вы не можете использовать Corona-Warn-App. Подробнее см. на странице часто задаваемых вопросов: https://www.coronawarn.app/en/faq/" - - "Приложение Corona-Warn-App выполняется корректно, но мы не можем обновить Ваш текущий статус риска. Определение риска остается активным и выполняется корректно. Подробнее см. на странице часто задаваемых вопросов: https://www.coronawarn.app/en/faq/" - - - - "Что-то пошло не так." - - "Причина" - - "ОК" - - "Сведения" - - "Неизвестная ошибка." - - - - "Lorem Ipsum" - - "Test API" - - "Test Risk Level" - - "Test Notification" - - "Android API Test(Manual Test)" - - "Start (Broadcast/Receive Bluetooth)" - - "Get Exposure keys (my keys history from api)" - - "Share my keys via Email" - - "Submit Exposure Key" - - "Show QR Code" - - "Submit keys to Server" - - "Scan Exposure Key" - - "Last 3 Hours Mode" - - "Check Exposure Summary" - - "Exposure summary" - - "Days since last exposure: %1$s" - - "Attenuation Durations in Minutes: %1$s" - - "Summation Risk Score: %1$s" - - "Matched key count: %1$s" - - "Maximum risk score %1$s" - - "My keys (count: %1$d)" - - "Other key" - - "Calculate Risk Level" - - \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index 60485feb00b..fcfa923f3cd 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -731,7 +731,7 @@ "Test has errors" - "There was a problem evaluating your test. Your QR Code has already expired." + "There was a problem evaluating your test. Your QR code has already expired." "OK" diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/ExposureSummaryRepositoryTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/ExposureSummaryRepositoryTest.kt index ed25927dd36..b4a6ffd64b8 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/ExposureSummaryRepositoryTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/ExposureSummaryRepositoryTest.kt @@ -32,6 +32,7 @@ class ExposureSummaryRepositoryTest { mockkObject(InternalExposureNotificationClient) coEvery { InternalExposureNotificationClient.asyncGetExposureSummary(any()) } returns buildSummary() + coEvery { InternalExposureNotificationClient.asyncIsEnabled() } returns true coEvery { dao.getExposureSummaryEntities() } returns listOf() coEvery { dao.getLatestExposureSummary() } returns null From faaeee6dc61c75ddc5fba7c1a48c46842435e9ff Mon Sep 17 00:00:00 2001 From: Philipp Woessner <64482866+pwoessner@users.noreply.github.com> Date: Tue, 11 Aug 2020 15:35:14 +0200 Subject: [PATCH 08/27] append google apiexception statuscode to detailsTitle (#996) --- .../coronawarnapp/exception/reporting/ErrorReportReceiver.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorReportReceiver.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorReportReceiver.kt index 22654e28d19..e500ab9b458 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorReportReceiver.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorReportReceiver.kt @@ -49,7 +49,7 @@ class ErrorReportReceiver(private val activity: Activity) : BroadcastReceiver() ErrorCodes.REPORTED_EXCEPTION_UNKNOWN_PROBLEM.code ) - message += "($apiStatusCode)" + detailsTitle += " ($apiStatusCode)" } val errorTitle = context.resources.getString(R.string.errors_generic_details_headline) From 3cead7f7722b195ee47c69453c0df6fbc9281c66 Mon Sep 17 00:00:00 2001 From: Philipp Woessner <64482866+pwoessner@users.noreply.github.com> Date: Wed, 12 Aug 2020 18:37:49 +0200 Subject: [PATCH 09/27] moved status code to initial error message dialog (#1007) --- .../coronawarnapp/exception/reporting/ErrorReportReceiver.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorReportReceiver.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorReportReceiver.kt index e500ab9b458..0a3b9d44532 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorReportReceiver.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorReportReceiver.kt @@ -49,7 +49,7 @@ class ErrorReportReceiver(private val activity: Activity) : BroadcastReceiver() ErrorCodes.REPORTED_EXCEPTION_UNKNOWN_PROBLEM.code ) - detailsTitle += " ($apiStatusCode)" + message += " ($apiStatusCode)" } val errorTitle = context.resources.getString(R.string.errors_generic_details_headline) From 23790d2e852f3563f97fcee0557670e6a096e3ad Mon Sep 17 00:00:00 2001 From: Philipp Woessner <64482866+pwoessner@users.noreply.github.com> Date: Wed, 12 Aug 2020 11:23:32 +0200 Subject: [PATCH 10/27] Show correct text for non increased risk levels on risk details screen (EXPOSUREAPP-2171) (#1004) * Made explanation text dynamic depending on risk * added detailed explanation for low risk --- .../util/formatter/FormatterRiskHelper.kt | 18 ++++++++++++++++++ .../main/res/layout/fragment_risk_details.xml | 2 +- .../src/main/res/values-de/strings.xml | 6 +++++- .../src/main/res/values/strings.xml | 4 ++++ 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterRiskHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterRiskHelper.kt index 6e87dce0b91..177bcdf51a2 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterRiskHelper.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterRiskHelper.kt @@ -386,6 +386,24 @@ fun formatRiskDetailsRiskLevelBody(riskLevelScore: Int?, daysSinceLastExposure: } } +/** + * Formats the risk details text display for each risk level for the body notice + * + * @param riskLevelScore + * @return + */ +fun formatRiskDetailsRiskLevelBodyNotice(riskLevelScore: Int?): String { + val appContext = CoronaWarnApplication.getAppContext() + val resources = appContext.resources + return when (riskLevelScore) { + RiskLevelConstants.INCREASED_RISK -> + resources.getString(R.string.risk_details_information_body_notice_increased) + RiskLevelConstants.LOW_LEVEL_RISK -> + resources.getString(R.string.risk_details_information_body_notice_low) + else -> appContext.getString(R.string.risk_details_information_body_notice) + } +} + /*Styler*/ /** diff --git a/Corona-Warn-App/src/main/res/layout/fragment_risk_details.xml b/Corona-Warn-App/src/main/res/layout/fragment_risk_details.xml index c7704aa987c..3496a3d7312 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_risk_details.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_risk_details.xml @@ -245,7 +245,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" - android:text="@string/risk_details_information_body_notice" + android:text="@{FormatterRiskHelper.formatRiskDetailsRiskLevelBodyNotice(tracingViewModel.riskLevel)}" android:focusable="true" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/Corona-Warn-App/src/main/res/values-de/strings.xml b/Corona-Warn-App/src/main/res/values-de/strings.xml index 227eb515bec..c269d60435a 100644 --- a/Corona-Warn-App/src/main/res/values-de/strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/strings.xml @@ -346,7 +346,11 @@ "Sie haben ein erhöhtes Infektionsrisiko, da Sie zuletzt vor %1$s Tagen mindestens einer nachweislich Corona-positiv getesteten Person über einen längeren Zeitpunkt und mit einem geringen Abstand begegnet sind." - "Die Infektionswahrscheinlichkeit wird daher als erhöht für Sie eingestuft. Das Infektionsrisiko wird anhand der Daten der Risiko-Ermittlung unter Berücksichtigung von Abstand und Dauer lokal auf Ihrem Smartphone berechnet. Ihr Infektionsrisiko ist für niemanden einsehbar und wird nicht weitergegeben. Wenn Sie nach Hause kommen, vermeiden Sie auch Begegnungen mit Familienmitgliedern und Mitbewohnern." + "Das Infektionsrisiko wird anhand der Daten der Risiko-Ermittlung unter Berücksichtigung von Abstand und Dauer lokal auf Ihrem Smartphone berechnet. Ihr Infektionsrisiko ist für niemanden einsehbar und wird nicht weitergegeben." + + "Die Infektionswahrscheinlichkeit wird daher als niedrig für Sie eingestuft. Das Infektionsrisiko wird anhand der Daten der Risiko-Ermittlung unter Berücksichtigung von Abstand und Dauer lokal auf Ihrem Smartphone berechnet. Ihr Infektionsrisiko ist für niemanden einsehbar und wird nicht weitergegeben." + + "Die Infektionswahrscheinlichkeit wird daher als erhöht für Sie eingestuft. Das Infektionsrisiko wird anhand der Daten der Risiko-Ermittlung unter Berücksichtigung von Abstand und Dauer lokal auf Ihrem Smartphone berechnet. Ihr Infektionsrisiko ist für niemanden einsehbar und wird nicht weitergegeben. Wenn Sie nach Hause kommen, vermeiden Sie auch Begegnungen mit Familienmitgliedern und Mitbewohnern." @string/risk_card_button_update diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index fcfa923f3cd..5da802e9b9c 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -349,6 +349,10 @@ "Therefore, your risk of infection has been ranked as increased. Your risk of infection is calculated from the exposure logging data (duration and proximity) locally on your device. Your risk of infection cannot be seen by, or passed on to, anyone else. When you get home, please also avoid close contact with members of your family or household." + + "" + + "" @string/risk_card_button_update From 77e3814d343ee11b0b27fb2e8c3716f2e9f94de9 Mon Sep 17 00:00:00 2001 From: Philipp Woessner <64482866+pwoessner@users.noreply.github.com> Date: Wed, 12 Aug 2020 17:52:36 +0200 Subject: [PATCH 11/27] Hotfixes translation updates (#1009) * [INTERNAL] Translation delivery: commit by LX Lab (#1005) Change-Id: Ie32113c5c582dedaf9c9e46220bf636a2885adb9 * deleted ar and ru translation files * updated base strings.xml Co-authored-by: SAP LX Lab Service Account --- .../src/main/res/values-bg/strings.xml | 18 +++-- .../src/main/res/values-en/strings.xml | 8 ++- .../src/main/res/values-pl/strings.xml | 68 ++++++++++--------- .../src/main/res/values-ro/strings.xml | 24 ++++--- .../src/main/res/values-tr/strings.xml | 6 +- .../src/main/res/values/strings.xml | 8 +-- 6 files changed, 76 insertions(+), 56 deletions(-) diff --git a/Corona-Warn-App/src/main/res/values-bg/strings.xml b/Corona-Warn-App/src/main/res/values-bg/strings.xml index d8fb6f62d79..3dc01d7eea8 100644 --- a/Corona-Warn-App/src/main/res/values-bg/strings.xml +++ b/Corona-Warn-App/src/main/res/values-bg/strings.xml @@ -274,7 +274,7 @@ "Излагания на риск" - "Продължителни и близки контакти с лица, диагностицирани с COVID-19." + "Контакти с по-голяма продължителност и близост до лица, диагностицирани с COVID-19." "Известия за излагане на риск" @@ -346,7 +346,11 @@ "Изложени сте на повишен риск от заразяване, защото преди %1$s дни сте имали продължителен и близък контакт с поне едно лице, диагностицирано с COVID-19." - "Това е причината да определим Вашия риск от заразяване като повишен. Рискът от заразяване се изчислява въз основа на данните за излагане (продължителност и близост на контакта), регистрирани на вашето локално устройство. Никой освен Вас не може да види или да получи данни за Вашето ниво на риск. Когато се приберете у дома, избягвайте близките контакти с членовете на домакинството си." + "Рискът от заразяване се изчислява въз основа на данните за излагане (продължителност и близост на контакта), регистрирани на вашето локално устройство. Никой освен Вас не може да види или да получи данни за Вашето ниво на риск." + + "Това е причината да определим Вашия риск от заразяване като нисък. Рискът от заразяване се изчислява въз основа на данните за излагане (продължителност и близост на контакта), регистрирани на вашето локално устройство. Никой освен Вас не може да види или да получи данни за Вашето ниво на риск." + + "Това е причината да определим Вашия риск от заразяване като повишен. Рискът от заразяване се изчислява въз основа на данните за излагане (продължителност и близост на контакта), регистрирани на вашето локално устройство. Никой освен Вас не може да види или да получи данни за Вашето ниво на риск. Когато се приберете у дома, избягвайте близките контакти с членовете на домакинството си." @string/risk_card_button_update @@ -399,7 +403,7 @@ "Как да активирате регистрирането на излагания на риск" - "За да установите дали сте застрашени от заразяване, трябва да активирате функцията за регистриране на излагания на риск." + "За да установите дали за Вас съществува риск от заразяване, трябва да активирате функцията за регистриране на излагания на риск." "Регистрирането на излагания на риск се извършва с помощта на Bluetooth връзка, при която Вашето устройство получава криптираните случайни ИД кодове на други потребители и изпраща до техните устройства Вашите случайни ИД кодове. Функцията може да бъде дезактивирана по всяко време." @@ -480,7 +484,7 @@ "Изключено" - "Регистриране на излаганията на риск" + "Регистър на рисковете" "Ето как работи регистрирането на излагания на риск" @@ -560,7 +564,7 @@ "Промяна на Вашия риск от заразяване" - "Наличие на резултат от Ваш тест за COVID-19" + "Статус на Вашия тест за COVID-19" "Към настройките за устройството" @@ -768,7 +772,7 @@ - "Резултат от тест" + "Резултат от теста" "Как работи:" @@ -938,7 +942,7 @@ "Обаждане" - "Въвеждане на ТАН" + "Въведете ТАН код" "Обадете се на горещата линия и поискайте ТАН код:" diff --git a/Corona-Warn-App/src/main/res/values-en/strings.xml b/Corona-Warn-App/src/main/res/values-en/strings.xml index facc4ff658c..f3e1893f53c 100644 --- a/Corona-Warn-App/src/main/res/values-en/strings.xml +++ b/Corona-Warn-App/src/main/res/values-en/strings.xml @@ -274,7 +274,7 @@ "Exposures" - "Encounters over an extended period and in close proximity to a person diagnosed with COVID-19." + "Encounters over a longer duration and close proximity to people diagnosed with COVID-19." "Exposure Notification" @@ -346,7 +346,11 @@ "You have an increased risk of infection because you were last exposed %1$s days ago over a longer period of time and at close proximity to at least one person diagnosed with COVID-19." - "Therefore, your risk of infection has been ranked as increased. Your risk of infection is calculated from the exposure logging data (duration and proximity) locally on your device. Your risk of infection cannot be seen by, or passed on to, anyone else. When you get home, please also avoid close contact with members of your family or household." + "Your risk of infection is calculated from the exposure logging data (duration and proximity) locally on your device. Your risk of infection cannot be seen by, or passed on to, anyone else." + + "Therefore, your risk of infection has been ranked as low. Your risk of infection is calculated from the exposure logging data (duration and proximity) locally on your device. Your risk of infection cannot be seen by, or passed on to, anyone else." + + "Therefore, your risk of infection has been ranked as increased. Your risk of infection is calculated from the exposure logging data (duration and proximity) locally on your device. Your risk of infection cannot be seen by, or passed on to, anyone else. When you get home, please also avoid close contact with members of your family or household." @string/risk_card_button_update diff --git a/Corona-Warn-App/src/main/res/values-pl/strings.xml b/Corona-Warn-App/src/main/res/values-pl/strings.xml index 85793c37e5c..6d81f73a792 100644 --- a/Corona-Warn-App/src/main/res/values-pl/strings.xml +++ b/Corona-Warn-App/src/main/res/values-pl/strings.xml @@ -149,9 +149,9 @@ "%1$s narażenie" "%1$s narażenia" "Brak narażenia do tej pory" - "%1$s narażenia" - "%1$s narażenia" - "%1$s narażeń" + "%1$s narażenia/narażeń" + "%1$s narażenia/narażeń" + "%1$s narażenia/narażeń" "Rejestrowanie narażenia było aktywne przez %1$s z ostatnich 14 dni." @@ -178,16 +178,16 @@ "%1$s dzień od ostatniego kontaktu" - "%1$s dnia od ostatniego kontaktu" + "%1$s dni od ostatniego kontaktu" "%1$s dni od ostatniego kontaktu" "%1$s dni od ostatniego kontaktu" "%1$s dni od ostatniego kontaktu" "%1$s dni od ostatniego kontaktu" - "Ryzyko nieznane" + "Nieznane ryzyko" - "Nie możemy jeszcze podać ryzyka zakażenia, ponieważ nie mamy jeszcze wystarczającej ilości danych." + "Ponieważ nie aktywowałeś(-aś) rejestrowania narażenia na wystarczająco długi czas, nie mogliśmy obliczyć Twojego ryzyka zakażenia." "Rejestrowanie narażenia zatrzymane" @@ -256,21 +256,21 @@ "Niskie ryzyko" - "Ryzyko nieznane" + "Nieznane ryzyko" "Powiadamianie innych użytkowników" - "Kolejną kluczową funkcją jest rejestracja testu i pobranie wyniku. W przypadku zdiagnozowania u Ciebie COVID-19 będziesz mieć możliwość powiadomienia innych i przerwania łańcucha zakażeń." + "Inną kluczową funkcją jest rejestracja testu i pobranie wyniku. W przypadku zdiagnozowania u Ciebie COVID-19 będziesz mieć możliwość powiadomienia innych i przerwania łańcucha zakażeń." "Definicja terminów:" "Dziennik narażeń" - "Lista otrzymanych i tymczasowych losowych identyfikatorów zapisanych tymczasowo w pamięci masowej systemu operacyjnego. Aplikacja korzysta z listy podczas sprawdzania narażeń. Wszystkie losowe identyfikatory są automatycznie usuwane po 14 dniach." + "Lista otrzymanych i tymczasowych losowych identyfikatorów zapisanych tymczasowo w pamięci masowej systemu operacyjnego. Lista ta jest odczytywana podczas sprawdzania narażeń. Wszystkie losowe identyfikatory są automatycznie usuwane po 14 dniach." "Sprawdzanie narażenia" - "Odczytanie danych dziennika narażeń i porównanie ze zgłoszonymi zakażeniami innych użytkowników. Sprawdzanie narażeń jest wykonywane automatycznie mniej więcej co dwie godziny." + "Dane dziennika narażeń są pobierane i synchronizowane ze zgłoszonymi zakażeniami innych użytkowników. Sprawdzanie narażeń jest wykonywane automatycznie mniej więcej co dwie godziny." "Narażenia" @@ -278,11 +278,11 @@ "Powiadomienie o narażeniu" - "Wyświetlenie narażeń w Corona-Warn-App." + "Wyświetlanie narażeń w Corona-Warn-App." "Losowe identyfikatory" - "Losowe identyfikatory są kombinacją cyfr i liter generowanych losowo. Są one wymieniane pomiędzy urządzeniami znajdującymi się w bliskiej odległości od siebie. Losowych identyfikatorów nie można przypisać do konkretnej osoby. Są one automatycznie usuwane po 14 dniach. Osoby, u których zdiagnozowano COVID-19, mogą zdecydować się na udostępnienie swoich losowych identyfikatorów z ostatnich 14 dni innym użytkownikom aplikacji." + "Identyfikatory losowe są kombinacją cyfr i liter generowanych losowo. Są one wymieniane pomiędzy urządzeniami znajdującymi się w bliskiej odległości od siebie. Identyfikatorów losowych nie można przypisać do konkretnej osoby. Są one automatycznie usuwane po 14 dniach. Osoby, u których zdiagnozowano COVID-19, mogą zdecydować się na udostępnienie swoich losowych identyfikatorów z ostatnich 14 dni innym użytkownikom aplikacji." "Smartfon wyświetla różne treści oznaczone numerami od 1 do 3." @@ -305,7 +305,7 @@ "Regularnie myj ręce." - "Załóż maseczkę, jeśli zamierzasz kontaktować się fizycznie z innymi osobami." + "Załóż maseczkę na twarz, mając kontakt z innymi osobami." "Zachowuj odległość co najmniej 1,5 metra od innych osób." @@ -313,7 +313,7 @@ "Twój lekarz rodzinny" - "Lekarz dyżurny pod numerem telefonu 116117" + "Pogotowie ratunkowe pod numerem telefonu 116117" "Organ ds. zdrowia publicznego" @@ -331,7 +331,7 @@ "Sposób, w jaki obliczane jest Twoje ryzyko" - "Nie możemy jeszcze podać ryzyka zakażenia, ponieważ nie mamy jeszcze wystarczającej ilości danych." + "Ponieważ nie aktywowałeś(-aś) rejestrowania narażenia na wystarczająco długi czas, nie mogliśmy obliczyć Twojego ryzyka zakażenia." "Rejestrowanie narażenia nie mogło zostać zaktualizowane przez okres dłuższy niż 24 godziny." @@ -346,7 +346,11 @@ "Masz podwyższone ryzyko zakażenia, ponieważ %1$s dni temu byłeś(-aś) narażony(-a) na dłuższy, bliski kontakt z co najmniej jedną osobą, u której zdiagnozowano COVID-19." - "Dlatego Twoje ryzyko zakażenia zostało ocenione jako podwyższone.\nRyzyko zakażenia jest obliczane na podstawie danych rejestrowania narażenia (czas trwania i bliskość kontaktu) lokalnie w urządzeniu. Twoje ryzyko zakażenia nie jest widoczne dla nikogo ani nikomu przekazywane. Po powrocie do domu unikaj również bliskiego kontaktu z członkami rodziny lub gospodarstwa domowego." + "Ryzyko zakażenia jest obliczane na podstawie danych rejestrowania narażenia (czas trwania i bliskość kontaktu) lokalnie w urządzeniu. Twoje ryzyko zakażenia nie jest widoczne dla nikogo ani nikomu przekazywane." + + "Dlatego Twoje ryzyko zakażenia zostało ocenione jako niskie. Ryzyko zakażenia jest obliczane na podstawie danych rejestrowania narażenia (czas trwania i bliskość kontaktu) lokalnie w urządzeniu. Twoje ryzyko zakażenia nie jest widoczne dla nikogo ani nikomu przekazywane." + + "Dlatego Twoje ryzyko zakażenia zostało ocenione jako podwyższone. Ryzyko zakażenia jest obliczane na podstawie danych rejestrowania narażenia (czas trwania i bliskość kontaktu) lokalnie w urządzeniu. Twoje ryzyko zakażenia nie jest widoczne dla nikogo ani nikomu przekazywane. Po powrocie do domu unikaj również bliskiego kontaktu z członkami rodziny lub gospodarstwa domowego." @string/risk_card_button_update @@ -357,7 +361,7 @@ "Informacje o funkcjonalności rejestrowania narażenia" - "Więcej informacji znajduje się na naszej stronie „Często zadawane pytania”." + "Więcej informacji znajduje się na naszej stronie Często zadawane pytania." "Działanie funkcji rejestrowania narażenia polega na odbieraniu przez Twoje urządzenie za pomocą Bluetooth zaszyfrowanych, losowych identyfikatorów innych użytkowników i przekazywaniu Twoich własnych, losowych identyfikatorów do ich urządzeń. Funkcję tę można wyłączyć w dowolnym momencie." - "Identyfikatory przekazują w sposób zaszyfrowany wyłącznie informacje o dacie, czasie trwania i odległości (przy wykorzystaniu mocy sygnału) od innych użytkowników aplikacji. Dane osobowe, takie jak nazwisko, adres, lokalizacja, nie są nigdy rejestrowane. Ustalenie tożsamości osób nie jest możliwe." + "Zaszyfrowane losowe identyfikatory przekazują innym osobom jedynie informacje o dacie, czasie trwania i bliskości (przy wykorzystaniu mocy sygnału). Dane osobowe, takie jak nazwisko, adres, lokalizacja, nie są nigdy rejestrowane. Ustalenie tożsamości osób nie jest możliwe." - "Oświadczenie o wyrażeniu zgody" + "Oświadczenia o wyrażeniu zgody" "To find out whether you have been in contact with an infected person and whether there is a risk that you yourself have been infected, you need to enable the App’s exposure logging feature. By tapping on the “Enable” button, you agree to the enabling of the App’s exposure logging feature and the associated data processing.""\n""\n""In order to use the App’s exposure logging feature, you will have to enable the COVID-19 Exposure Logging functionality provided by Google on your smartphone and grant the Corona-Warn-App permission to use this.""\n""\n""When exposure logging is enabled, your smartphone continuously generates and transmits random IDs via Bluetooth, which other Android or Apple smartphones in your vicinity can receive if exposure logging is also enabled on them. Your smartphone, in turn, receives the random IDs of the other smartphones. Your own random IDs and those received from other smartphones are recorded in the exposure log and stored there for 14 days.""\n""\n""To identify your risk of infection, the App loads a list – several times a day or on request – of the random IDs of all users who have told the App that they have been infected with the coronavirus. This list is then compared with the random IDs stored in the exposure log. If the App detects that you may have been in contact with an infected user, it will inform you of this and tell you that there is a risk that you are also infected. In this case, the App is also given access to other data stored in your smartphone’s exposure log (date, duration and Bluetooth signal strength of the contact).""\n""\n""The Bluetooth signal strength is used to derive the physical distance (the stronger the signal, the smaller the distance). The App then analyses this information in order to assess your likelihood of having been infected with the coronavirus and to give you recommendations for what to do next. This analysis is only performed locally on your smartphone. Apart from you, nobody (not even the RKI) will know whether you have been in contact with an infected person and what risk has been identified for you.""\n""\n""To withdraw your consent to the exposure logging feature, you can disable the feature using the toggle switch in the App or delete the App. If you decide to use the exposure logging feature again, you can toggle the feature back on or reinstall the App. If you disable the exposure logging feature, the App will no longer check whether you have been in contact with an infected user. If you also wish to stop your device sending and receiving random IDs, you will need to disable COVID-19 Exposure Logging in your smartphone settings. Please note that your own random IDs and those received from other smartphones which are stored in the exposure log will not be deleted in the App. You can only permanently delete the data stored in the exposure log in your smartphone settings.""\n""\n""The App’s privacy notice (including an explanation of the data processing carried out for the exposure logging feature) can be found in the menu under “Data Privacy Information”." @@ -455,7 +459,7 @@ "… zgłoś ten fakt w Corona-Warn-App. Udostępnianie wyników testu jest dobrowolne i bezpieczne. Zrób to ze względu na zdrowie innych osób." - "Twoje powiadomienie jest szyfrowane w bezpieczny sposób i przetwarzane na bezpiecznym serwerze. Osoby, których zaszyfrowane losowe identyfikatory zostały zgromadzone przez Twoje urządzenie, otrzymają wtedy ostrzeżenie wraz z informacją na temat dalszych kroków postępowania." + "Twoje powiadomienie jest szyfrowane w bezpieczny sposób i przetwarzane na bezpiecznym serwerze. Osoby, których zaszyfrowane losowe identyfikatory zostały zgromadzone przez Twoje urządzenie, otrzymają teraz ostrzeżenie wraz z informacją na temat dalszych kroków postępowania." "Zaszyfrowana diagnoza zakażenia jest przesyłana do systemu, który będzie teraz ostrzegał innych użytkowników." @@ -516,7 +520,7 @@ "Otwórz ustawienia urządzenia" - "Połącz z Internetem" + "Otwórz połączenie z Internetem" "Rejestrowanie narażenia wymaga połączenia z Internetem w celu obliczenia narażeń. Włącz WIFI lub dane mobilne w ustawieniach swojego urządzenia." @@ -524,7 +528,7 @@ "Rejestrowanie narażenia jest aktywne od jednego dnia.\nSprawdzanie narażeń jest wiarygodne tylko wtedy, gdy rejestrowanie narażenia jest aktywowane na stałe." - "Rejestrowanie narażenia jest aktywne od %1$s dnia.\nSprawdzanie narażeń jest wiarygodne tylko wtedy, gdy rejestracja narażenia jest aktywowana na stałe." + "Rejestrowanie narażenia jest aktywne od %1$s dni.\nSprawdzanie narażeń jest wiarygodne tylko wtedy, gdy rejestracja narażenia jest aktywowana na stałe." "Rejestrowanie narażenia jest aktywne od %1$s dni.\nSprawdzanie narażeń jest wiarygodne tylko wtedy, gdy rejestrowanie narażenia jest aktywowane na stałe." "Rejestrowanie narażenia jest aktywne od %1$s dni.\nSprawdzanie narażeń jest wiarygodne tylko wtedy, gdy rejestracja narażenia jest aktywowana na stałe." "Rejestrowanie narażenia jest aktywne od %1$s dni.\nSprawdzanie narażeń jest wiarygodne tylko wtedy, gdy rejestracja narażenia jest aktywowana na stałe." @@ -659,7 +663,7 @@ "Języki: niemiecki, angielski, turecki\nGodziny pracy:""\n""od poniedziałku do soboty: 7:00 - 22:00""\n(za wyjątkiem świąt państwowych)""\nPołączenie jest bezpłatne." - "W razie jakichkolwiek pytań związanych ze zdrowiem skontaktuj się z lekarzem rodzinnym lub lekarzem dyżurnym pod numerem: 116 117." + "W razie jakichkolwiek pytań związanych ze zdrowiem skontaktuj się z lekarzem rodzinnym lub pogotowiem ratunkowym pod numerem: 116 117." "Mężczyzna korzystający z zestawu słuchawkowego prowadzi rozmowę telefoniczną." @@ -772,7 +776,7 @@ "Jak to działa:" - "Test został dodany." + "Test został dodany" "Twój test został zapisany w Corona-Warn-App." @@ -868,7 +872,7 @@ "Zarejestruj test poprzez zeskanowanie kodu QR dokumentu testu." - "Oświadczenie o wyrażeniu zgody" + "Oświadczenia o wyrażeniu zgody" "By tapping on “Accept”, you consent to the App querying the status of your coronavirus test and displaying it in the App. This feature is available to you if you have received a QR code and have consented to your test result being transmitted to the App’s server system. As soon as the testing lab has stored your test result on the server, you will be able to see the result in the App. If you have enabled notifications, you will also receive a notification outside the App telling you that your test result has been received. However, for privacy reasons, the test result itself will only be displayed in the App. You can withdraw this consent at any time by deleting your test registration in the App. Withdrawing your consent will not affect the lawfulness of processing before its withdrawal. Further information can be found in the menu under “Data Privacy Information”." @@ -913,13 +917,13 @@ "Możesz zarażać." - "Zastosuj izolację / unikaj kontaktu fizycznego z innymi osobami." + "Izoluj się od innych osób." "Inne informacje:" "Okres kwarantanny wynosi zazwyczaj 14 dni. Obserwuj swoje objawy i monitoruj ich rozwój." - "Zostaniesz poproszony(-a) przez organ ds. zdrowia publicznego o stworzenie listy osób, z którymi miałeś(-aś) kontakt. Powinna ona obejmować wszystkie osoby, z którymi miałeś(-aś) bliski kontakt (rozmowa twarzą w twarz w odległości mniejszej niż 2 metry) przez ponad 15 minut w ciągu dwóch dni przed wystąpieniem objawów." + "Zostaniesz poproszony(-a) przez organ ds. zdrowia publicznego o stworzenie listy osób, z którymi miałeś(-aś) kontakt. Powinna ona obejmować wszystkie osoby, z którymi miałeś(-aś) bliski kontakt (w odległości mniejszej niż 2 metry, rozmowa twarzą w twarz) przez ponad 15 minut w ciągu dwóch dni przed wystąpieniem objawów." "Zwróć szczególną uwagę na osoby, które nie zostaną powiadomione bezpośrednio przez aplikację, ponieważ nie posiadają smartfonów lub nie zainstalowały aplikacji." "Nawet jeśli nie masz już żadnych objawów i znów czujesz się dobrze, możesz nadal zarażać." @@ -934,7 +938,7 @@ "Jak to działa:" - "Przygotuj wynik testu (jeśli jest dostępny) oraz numer telefonu, aby poprosić o numer TAN." + "Przygotuj wynik testu (jeśli jest dostępny) oraz numer telefonu, pod którym można poprosić o numer TAN." "Zadzwoń" @@ -971,7 +975,7 @@ "Nieprawidłowy test" - "Diagnoza: brak zakażenia" + "Diagnoza braku zakażenia" "Twój wynik jest aktualizowany" @@ -991,7 +995,7 @@ "Uwaga:" - "Możesz zarażać. Zastosuj izolację / unikaj kontaktu fizycznego z innymi osobami." + "Możesz zarażać. Izoluj się od innych osób." "Organ ds. zdrowia publicznego skontaktuje się z Tobą w ciągu kilku najbliższych dni telefonicznie lub listownie." @@ -1048,9 +1052,9 @@ "Nie możesz wykonać tej czynności. Skontaktuj się z infolinią." - "Twoja aplikacja Corona-Warn-App jest poprawnie zainstalowana, ale usługa „Powiadomienia o narażeniu na COVID-19” nie jest dostępna w systemie operacyjnym Twojego smartfona. Oznacza to, że nie możesz korzystać z aplikacji Corona-Warn-App. Więcej informacji znajduje się na naszej stronie „Często zadawane pytania”: https://www.coronawarn.app/en/faq/." + "Twoja aplikacja Corona-Warn-App jest poprawnie zainstalowana, ale usługa „Powiadomienia o narażeniu na COVID-19” nie jest dostępna w systemie operacyjnym Twojego smartfona. Oznacza to, że nie możesz korzystać z aplikacji Corona-Warn-App. Więcej informacji znajduje się na naszej stronie Często zadawane pytania: https://www.coronawarn.app/en/faq/." - "Aplikacja Corona-Warn-App działa prawidłowo, ale nie możemy zaaktualizować Twojego aktualnego statusu ryzyka. Rejestrowanie narażenia pozostaje aktywne i działa prawidłowo. Więcej informacji można znaleźć na naszej stronie „Często zadawane pytania”: https://www.coronawarn.app/en/faq/" + "Aplikacja Corona-Warn-App działa prawidłowo, ale nie możemy zaaktualizować Twojego aktualnego statusu ryzyka. Rejestrowanie narażenia pozostaje aktywne i działa prawidłowo. Więcej informacji można znaleźć na naszej stronie Często zadawane pytania: https://www.coronawarn.app/en/faq/" "Expuneri" - "Întâlniri de o durată lungă și în strânsă proximitate cu o persoană diagnosticată cu COVID-19." + "Întâlniri de o durată mai lungă și în strânsă proximitate cu persoane diagnosticate cu COVID-19." "Notificarea de expunere" @@ -346,7 +346,11 @@ "Aveți un risc crescut de infectare deoarece ați fost expus ultima dată acum %1$s zile pe o perioadă mai lungă de timp și în strânsă proximitate cu cel puțin o persoană diagnosticată cu COVID-19." - "Prin urmare, riscul dvs. de infectare a fost clasificat ca fiind crescut. Riscul dvs. de infectare este calculat pe baza datelor de înregistrare în jurnal a expunerilor (durata și proximitatea) la nivel local pe dispozitivul dvs. Riscul dvs. de infectare nu poate fi văzut de o altă persoană sau transmis unei alte persoane. Când ajungeți acasă, evitați contactul strâns cu membrii familiei sau cu cei din gospodăria dvs." + "Riscul dvs. de infectare este calculat pe baza datelor de înregistrare în jurnal a expunerilor (durata și proximitatea) la nivel local pe dispozitivul dvs. Riscul dvs. de infectare nu poate fi văzut de o altă persoană sau transmis unei alte persoane." + + "Prin urmare, riscul dvs. de infectare a fost clasificat ca redus. Riscul dvs. de infectare este calculat pe baza datelor de înregistrare în jurnal a expunerilor (durata și proximitatea) la nivel local pe dispozitivul dvs. Riscul dvs. de infectare nu poate fi văzut de o altă persoană sau transmis unei alte persoane." + + "Prin urmare, riscul dvs. de infectare a fost clasificat ca fiind crescut. Riscul dvs. de infectare este calculat pe baza datelor de înregistrare în jurnal a expunerilor (durata și proximitatea) la nivel local pe dispozitivul dvs. Riscul dvs. de infectare nu poate fi văzut de o altă persoană sau transmis unei alte persoane. Când ajungeți acasă, evitați contactul strâns cu membrii familiei sau cu cei din gospodăria dvs." @string/risk_card_button_update @@ -423,7 +427,7 @@ "Ați dezactivat actualizările în fundal pentru aplicația Corona-Warn. Activați actualizările în fundal pentru a utiliza înregistrarea automată în jurnal a expunerilor. Dacă nu activați actualizările în fundal, puteți porni doar manual din aplicație înregistrarea în jurnal a expunerilor. Puteți activa actualizările în fundal pentru aplicație din setările dispozitivului dvs." - "Deschideți setările dispozitivului" + "Deschideți Setările dispozitivului" "Porniți manual înregistrarea în jurnal a expunerilor" @@ -447,7 +451,7 @@ "Locația dvs. nu poate fi accesată. Google și/sau Android necesită acces la locația dispozitivului dvs. pentru a utiliza Bluetooth-ul." - "Deschideți setările dispozitivului" + "Deschideți Setările dispozitivului" "Pagina de înregistrare 4 din 5: Dacă sunteți diagnosticat cu COVID-19…" @@ -506,21 +510,21 @@ "Activați Bluetooth-ul" - "Bluetooth-ul trebuie să fie activat pentru ca înregistrarea în jurnal a expunerilor să funcționeze. Activați Bluetooth-ul în setările dispozitivului." + "Bluetooth-ul trebuie să fie pornit pentru ca înregistrarea în jurnal a expunerilor să funcționeze. Porniți Bluetooth-ul în setările dispozitivului." - "Deschideți setările dispozitivului" + "Deschideți Setările dispozitivului" "Permiteți accesul la locație" "Locația dvs. nu poate fi accesată. Google și/sau Android necesită acces la locația dispozitivului dvs. pentru a utiliza Bluetooth-ul." - "Deschideți setările dispozitivului" + "Deschideți Setările dispozitivului" "Deschideți conexiunea la internet" "Înregistrarea în jurnal a expunerilor necesită conexiunea la internet pentru a calcula expunerile. Porniți rețeaua Wi-Fi sau datele mobile din setările dispozitivului dvs." - "Deschideți setările dispozitivului" + "Deschideți Setările dispozitivului" "Înregistrarea în jurnal a expunerilor a fost activă o zi.\nO verificare a expunerii poate fi de încredere doar dacă înregistrarea în jurnal a expunerilor este activată permanent." @@ -562,7 +566,7 @@ "Starea testului COVID-19" - "Deschideți setările dispozitivului" + "Deschideți Setările dispozitivului" "O femeie primește o notificare de la Corona-Warn-App." @@ -606,7 +610,7 @@ "Dacă doriți să dezactivați activitatea în fundal cu prioritate, vă rugăm să faceți acest lucru din setările dispozitivului." - "Deschideți setările dispozitivului" + "Deschideți Setările dispozitivului" "Dezactivați activitatea în fundal cu prioritate" diff --git a/Corona-Warn-App/src/main/res/values-tr/strings.xml b/Corona-Warn-App/src/main/res/values-tr/strings.xml index e4a7145f562..805a37efca2 100644 --- a/Corona-Warn-App/src/main/res/values-tr/strings.xml +++ b/Corona-Warn-App/src/main/res/values-tr/strings.xml @@ -346,7 +346,11 @@ "En son %1$s gün önce, COVID-19 tanısı konan en az bir kişiyle daha uzun süreyle ve yakın mesafeden maruz kalma yaşadığınız için enfeksiyon riskiniz daha yüksektir." - "Bu nedenle enfeksiyon riskiniz artmış olarak derecelendirilmiştir.\nEnfeksiyon riskiniz, cihazınızda yerel olarak bulunan maruz kalma günlüğü verileri (süre ve mesafe) kullanılarak hesaplanır. Enfeksiyon riskiniz başkaları tarafından görüntülenemez veya başkalarına aktarılmaz. Eve gittiğinizde lütfen aile fertleriniz veya ev arkadaşlarınızla yakın temastan kaçının." + "Enfeksiyon riskiniz, cihazınızda yerel olarak bulunan maruz kalma günlüğü verileri (süre ve mesafe) kullanılarak hesaplanır. Enfeksiyon riskiniz başkaları tarafından görüntülenemez veya başkalarına aktarılmaz." + + "Bu nedenle enfeksiyon riskiniz düşük olarak derecelendirilmiştir. Enfeksiyon riskiniz, cihazınızda yerel olarak bulunan maruz kalma günlüğü verileri (süre ve mesafe) kullanılarak hesaplanır. Enfeksiyon riskiniz başkaları tarafından görüntülenemez veya başkalarına aktarılmaz." + + "Bu nedenle enfeksiyon riskiniz artmış olarak derecelendirilmiştir. Enfeksiyon riskiniz, cihazınızda yerel olarak bulunan maruz kalma günlüğü verileri (süre ve mesafe) kullanılarak hesaplanır. Enfeksiyon riskiniz başkaları tarafından görüntülenemez veya başkalarına aktarılmaz. Eve gittiğinizde lütfen aile fertleriniz veya ev arkadaşlarınızla yakın temastan kaçının." @string/risk_card_button_update diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index 5da802e9b9c..44cbf873717 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -276,7 +276,7 @@ "Exposures" - "Encounters over an extended period and in close proximity to a person diagnosed with COVID-19." + "Encounters over a longer duration and close proximity to people diagnosed with COVID-19." "Exposure Notification" @@ -348,11 +348,11 @@ "You have an increased risk of infection because you were last exposed %1$s days ago over a longer period of time and at close proximity to at least one person diagnosed with COVID-19." - "Therefore, your risk of infection has been ranked as increased. Your risk of infection is calculated from the exposure logging data (duration and proximity) locally on your device. Your risk of infection cannot be seen by, or passed on to, anyone else. When you get home, please also avoid close contact with members of your family or household." + "Your risk of infection is calculated from the exposure logging data (duration and proximity) locally on your device. Your risk of infection cannot be seen by, or passed on to, anyone else." - "" + "Therefore, your risk of infection has been ranked as low. Your risk of infection is calculated from the exposure logging data (duration and proximity) locally on your device. Your risk of infection cannot be seen by, or passed on to, anyone else." - "" + "Therefore, your risk of infection has been ranked as increased. Your risk of infection is calculated from the exposure logging data (duration and proximity) locally on your device. Your risk of infection cannot be seen by, or passed on to, anyone else. When you get home, please also avoid close contact with members of your family or household." @string/risk_card_button_update From 417ef29e33689cc26fe2ec6fdee3b4ba47bd47a7 Mon Sep 17 00:00:00 2001 From: Philipp Woessner <64482866+pwoessner@users.noreply.github.com> Date: Wed, 12 Aug 2020 17:59:26 +0200 Subject: [PATCH 12/27] change Mundschutz to Mund-Nasen-Schutz (#1008) --- Corona-Warn-App/src/main/res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Corona-Warn-App/src/main/res/values-de/strings.xml b/Corona-Warn-App/src/main/res/values-de/strings.xml index c269d60435a..ccf6916c19b 100644 --- a/Corona-Warn-App/src/main/res/values-de/strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/strings.xml @@ -305,7 +305,7 @@ "Waschen Sie Ihre Hände regelmäßig." - "Tragen Sie einen Mundschutz bei Begegnungen mit anderen Personen." + "Tragen Sie einen Mund-Nasen-Schutz bei Begegnungen mit anderen Personen." "Halten Sie mindestens 1,5 Meter Abstand zu anderen Personen." From d493c5b8677c959d8dd74680c68617c77353b5c5 Mon Sep 17 00:00:00 2001 From: Philipp Woessner <64482866+pwoessner@users.noreply.github.com> Date: Wed, 12 Aug 2020 18:51:52 +0200 Subject: [PATCH 13/27] Version code bump for RC3 1.3.0 (#1010) --- Corona-Warn-App/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Corona-Warn-App/build.gradle b/Corona-Warn-App/build.gradle index 5e15edbecec..0fb0183cab8 100644 --- a/Corona-Warn-App/build.gradle +++ b/Corona-Warn-App/build.gradle @@ -33,7 +33,7 @@ android { applicationId 'de.rki.coronawarnapp' minSdkVersion 23 targetSdkVersion 29 - versionCode 36 + versionCode 37 versionName "1.3.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" From 413890b3f71cba40db3a307ddf659dc8c586f105 Mon Sep 17 00:00:00 2001 From: Fabian-K Date: Mon, 17 Aug 2020 10:59:35 +0200 Subject: [PATCH 14/27] Plausible Deniability Config Update (EXPOSUREAPP-2214) (#1022) - not trigger a Dummy Playbook for 1% of all clients - not repeating the playbook pattern for up to 16 days - not trigger 1-3 repetitions for each communication to CWA/VS --- .../coronawarnapp/http/playbook/BackgroundNoise.kt | 4 +++- .../de/rki/coronawarnapp/http/playbook/Playbook.kt | 5 +++++ .../rki/coronawarnapp/http/playbook/PlaybookImpl.kt | 13 ++++++------- .../service/submission/SubmissionConstants.kt | 8 ++++---- .../rki/coronawarnapp/worker/BackgroundConstants.kt | 6 +++--- 5 files changed, 21 insertions(+), 15 deletions(-) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/playbook/BackgroundNoise.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/playbook/BackgroundNoise.kt index 83032127d92..ea1005d3def 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/playbook/BackgroundNoise.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/playbook/BackgroundNoise.kt @@ -3,6 +3,7 @@ package de.rki.coronawarnapp.http.playbook import de.rki.coronawarnapp.http.WebRequestBuilder import de.rki.coronawarnapp.service.submission.SubmissionConstants import de.rki.coronawarnapp.storage.LocalData +import de.rki.coronawarnapp.worker.BackgroundConstants import de.rki.coronawarnapp.worker.BackgroundWorkScheduler import kotlin.random.Random @@ -21,7 +22,8 @@ class BackgroundNoise { } fun scheduleDummyPattern() { - BackgroundWorkScheduler.scheduleBackgroundNoisePeriodicWork() + if (BackgroundConstants.NUMBER_OF_DAYS_TO_RUN_PLAYBOOK > 0) + BackgroundWorkScheduler.scheduleBackgroundNoisePeriodicWork() } suspend fun foregroundScheduleCheck() { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/playbook/Playbook.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/playbook/Playbook.kt index 7ed7537bc8a..66ab1f957b9 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/playbook/Playbook.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/playbook/Playbook.kt @@ -4,6 +4,11 @@ import KeyExportFormat import de.rki.coronawarnapp.service.submission.KeyType import de.rki.coronawarnapp.util.formatter.TestResult +/** + * The concept of Plausible Deniability aims to hide the existence of a positive test result by always using a defined “playbook pattern” of requests to the Verification Server and CWA Backend so it is impossible for an attacker to identify which communication was done. + * The “playbook pattern” represents a well-defined communication pattern consisting of dummy requests and real requests. + * To hide that a real request was done, the device does multiple of these requests over a longer period of time according to the previously defined communication pattern statistically similar to all apps so it is not possible to infer by observing the traffic if the requests under concern are real or the fake ones. + */ interface Playbook { suspend fun initialRegistration( diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/playbook/PlaybookImpl.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/playbook/PlaybookImpl.kt index 7ba36966d0b..3012a113947 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/playbook/PlaybookImpl.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/playbook/PlaybookImpl.kt @@ -12,7 +12,6 @@ import kotlinx.coroutines.launch import timber.log.Timber import java.util.UUID import java.util.concurrent.TimeUnit -import kotlin.random.Random class PlaybookImpl( private val webRequestBuilder: WebRequestBuilder @@ -102,17 +101,17 @@ class PlaybookImpl( override suspend fun dummy() = dummy(true) private suspend fun followUpPlaybooks() { - val runsToExecute = Random.nextInt( - SubmissionConstants.minNumberOfSequentialPlaybooks, - SubmissionConstants.maxNumberOfSequentialPlaybooks - ) + val runsToExecute = IntRange( + SubmissionConstants.minNumberOfSequentialPlaybooks - 1 /* one was already executed */, + SubmissionConstants.maxNumberOfSequentialPlaybooks - 1 /* one was already executed */ + ).random() Timber.i("[$uid] Follow Up: launching $runsToExecute follow up playbooks") repeat(runsToExecute) { - val executionDelay = Random.nextInt( + val executionDelay = IntRange( SubmissionConstants.minDelayBetweenSequentialPlaybooks, SubmissionConstants.maxDelayBetweenSequentialPlaybooks - ) + ).random() Timber.i("[$uid] Follow Up: (${it + 1}/$runsToExecute) waiting $executionDelay[s]...") delay(TimeUnit.SECONDS.toMillis(executionDelay.toLong())) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/submission/SubmissionConstants.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/submission/SubmissionConstants.kt index eabb63b2fcf..4ab4045084e 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/submission/SubmissionConstants.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/submission/SubmissionConstants.kt @@ -41,11 +41,11 @@ object SubmissionConstants { const val PADDING_LENGTH_HEADER_SUBMISSION_FAKE = 36 - const val probabilityToExecutePlaybookWhenOpenApp = 1f + const val probabilityToExecutePlaybookWhenOpenApp = 0f const val minNumberOfSequentialPlaybooks = 1 - const val maxNumberOfSequentialPlaybooks = 3 - const val minDelayBetweenSequentialPlaybooks = 5 - const val maxDelayBetweenSequentialPlaybooks = 10 + const val maxNumberOfSequentialPlaybooks = 1 + const val minDelayBetweenSequentialPlaybooks = 0 + const val maxDelayBetweenSequentialPlaybooks = 0 const val minKeyCountForSubmission = 14 const val fakeKeySize = (1 * 16 /* key data*/) + (3 * 4 /* 3x int32*/) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundConstants.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundConstants.kt index 8f7c14ffae0..f15edf5567a 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundConstants.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundConstants.kt @@ -120,19 +120,19 @@ object BackgroundConstants { * * @see TimeUnit.HOURS */ - const val MIN_HOURS_TO_NEXT_BACKGROUND_NOISE_EXECUTION = 4L + const val MIN_HOURS_TO_NEXT_BACKGROUND_NOISE_EXECUTION = 0L /** * The maximum time in hours to wait between playbook executions * * @see TimeUnit.HOURS */ - const val MAX_HOURS_TO_NEXT_BACKGROUND_NOISE_EXECUTION = 12L + const val MAX_HOURS_TO_NEXT_BACKGROUND_NOISE_EXECUTION = 0L /** * The total time in days to run the playbook * * @see TimeUnit.DAYS */ - const val NUMBER_OF_DAYS_TO_RUN_PLAYBOOK = 16 + const val NUMBER_OF_DAYS_TO_RUN_PLAYBOOK = 0 } From ea2c15a940f30978a8ef194258fbb938cc58a1a6 Mon Sep 17 00:00:00 2001 From: janetback <68653277+janetback@users.noreply.github.com> Date: Mon, 17 Aug 2020 11:59:18 +0200 Subject: [PATCH 15/27] Update strings.xml (#1012) Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com> --- Corona-Warn-App/src/main/res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Corona-Warn-App/src/main/res/values-de/strings.xml b/Corona-Warn-App/src/main/res/values-de/strings.xml index ccf6916c19b..097c1313cc2 100644 --- a/Corona-Warn-App/src/main/res/values-de/strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/strings.xml @@ -806,7 +806,7 @@ "Ihr Testergebnis" - "Es gab ein Problem bei der Auswertung Ihres Tests. Bitte kontaktieren Sie das Gesundheitsamt um Information zum weiteren Vorgehen zu erhalten.\n\nBitte entfernen Sie den Test wieder aus der Corona-Warn-App, damit Sie bei Bedarf einen neuen Test hinterlegen können." + "Es gab ein Problem bei der Auswertung Ihres Tests. Bitte kontaktieren Sie das Testcenter oder das zuständige Labor, um Information zum weiteren Vorgehen zu erhalten.\n\nBitte entfernen Sie den Test wieder aus der Corona-Warn-App, damit Sie bei Bedarf einen neuen Test hinterlegen können." "Test entfernen" From c91fffbd6f12dd0983c1f69392c2d53cfc5ebe12 Mon Sep 17 00:00:00 2001 From: janetback <68653277+janetback@users.noreply.github.com> Date: Mon, 17 Aug 2020 11:59:54 +0200 Subject: [PATCH 16/27] Update strings.xml (#1019) --- Corona-Warn-App/src/main/res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Corona-Warn-App/src/main/res/values-de/strings.xml b/Corona-Warn-App/src/main/res/values-de/strings.xml index 097c1313cc2..4df2b6b5a9c 100644 --- a/Corona-Warn-App/src/main/res/values-de/strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/strings.xml @@ -303,7 +303,7 @@ "Für Fragen zu auftretenden Symptomen, Testmöglichkeiten und weiteren Isolationsmaßnahmen, wenden Sie sich bitte an eine der folgenden Stellen:" - "Waschen Sie Ihre Hände regelmäßig." + "Waschen Sie Ihre Hände regelmäßig mit Seife für 20 Sekunden." "Tragen Sie einen Mund-Nasen-Schutz bei Begegnungen mit anderen Personen." From 23b07892f0274d8ebcec05db6f85f5506373f649 Mon Sep 17 00:00:00 2001 From: Rituraj Sambherao <54317407+ritsam@users.noreply.github.com> Date: Mon, 17 Aug 2020 21:45:29 +0100 Subject: [PATCH 17/27] Initial commit - implmentation done (#1028) 1. Onboarding and About fragments are added with the easy language texts --- .../information/InformationAboutFragment.kt | 7 ++++++ .../ui/onboarding/OnboardingFragment.kt | 7 ++++++ .../res/layout/fragment_information_about.xml | 16 +++++++++++++ .../main/res/layout/fragment_onboarding.xml | 2 ++ .../main/res/layout/include_onboarding.xml | 23 ++++++++++++++++++- .../src/main/res/values-de/strings.xml | 2 ++ .../src/main/res/values/strings.xml | 2 ++ 7 files changed, 58 insertions(+), 1 deletion(-) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationAboutFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationAboutFragment.kt index 7f0860263e9..52153ca9f15 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationAboutFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationAboutFragment.kt @@ -1,6 +1,7 @@ package de.rki.coronawarnapp.ui.information import android.os.Bundle +import android.text.method.LinkMovementMethod import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -37,6 +38,12 @@ class InformationAboutFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setButtonOnClickListener() + setLinks() + } + + private fun setLinks() { + binding.informationAboutEasyLanguage + .movementMethod = LinkMovementMethod.getInstance() } override fun onResume() { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingFragment.kt index ace481434d7..e01dac101a8 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingFragment.kt @@ -1,6 +1,7 @@ package de.rki.coronawarnapp.ui.onboarding import android.os.Bundle +import android.text.method.LinkMovementMethod import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -42,6 +43,12 @@ class OnboardingFragment : Fragment() { OnboardingFragmentDirections.actionOnboardingFragmentToOnboardingPrivacyFragment() ) } + setLinks() + } + + private fun setLinks() { + binding.onboardingInclude.onboardingEasyLanguage + .movementMethod = LinkMovementMethod.getInstance() } override fun onResume() { diff --git a/Corona-Warn-App/src/main/res/layout/fragment_information_about.xml b/Corona-Warn-App/src/main/res/layout/fragment_information_about.xml index b2f48c1a246..5d5c89cfd12 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_information_about.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_information_about.xml @@ -69,6 +69,22 @@ app:layout_constraintStart_toEndOf="@+id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/information_about_body_emphasized" /> + + + + + + + app:layout_constraintTop_toBottomOf="@+id/onboarding_easy_language" /> "Die Risiko-Ermittlung funktioniert, indem Ihr Handy per Bluetooth verschlüsselte Zufallscodes anderer Nutzerinnen und Nutzer empfängt und Ihren eigenen Zufallscode an deren Smartphones weitergibt. Die Funktion lässt sich jederzeit wieder deaktivieren." "Die verschlüsselten Zufallscodes geben nur Auskunft über das Datum, die Dauer und die anhand der Signalstärke berechnete Entfernung zu Ihren Mitmenschen. Persönliche Daten wie Name, Adresse oder Aufenthaltsort werden zu keiner Zeit erfasst. Konkrete Rückschlüsse auf Personen sind nicht möglich." + + Informationen zur App in leichter Sprache und Gebärdensprache "Einwilligungserklärung" diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index 44cbf873717..0a2b46beeeb 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -410,6 +410,8 @@ "Exposure logging works by your device receiving, via Bluetooth, encrypted random IDs of other users and passing your own random ID to their devices. This feature can be deactivated at any time." "The encrypted random IDs only pass information about date, duration and proximity (using signal strength) to other people. Personal data such as name, address, location is never recorded. Individuals cannot be identified." + + Informationen zur App in leichter Sprache und Gebärdensprache "Declaration of Consent" From 2f4b0c82bda8eccfb51cb14b78dcca9601f71d12 Mon Sep 17 00:00:00 2001 From: Rituraj Sambherao <54317407+ritsam@users.noreply.github.com> Date: Mon, 17 Aug 2020 22:00:40 +0100 Subject: [PATCH 18/27] Alternative contact possiblity (EXPOSUREAPP-1654) (#1013) * initial commit : feature / fix complete 1. Formatter Added 2. include layout added 3. visilbity logic based on default device language has been added 4. links for english and german forms are added based on device language 5. phone number has been removed * simplified logic * logic improved - more robust null check * reverted unnecessary string changes & added "information_legal_subtitle_contact_form_non_en_de" to german as non translatable Co-authored-by: Luka Harambasic Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com> --- .../information/InformationLegalFragment.kt | 12 +++++ .../FormatterInformationLegalHelper.kt | 34 ++++++++++++ .../res/layout/fragment_information_legal.xml | 11 +++- .../main/res/layout/include_contact_form.xml | 53 +++++++++++++++++++ .../src/main/res/values-de/strings.xml | 6 ++- .../src/main/res/values/strings.xml | 6 ++- 6 files changed, 119 insertions(+), 3 deletions(-) create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterInformationLegalHelper.kt create mode 100644 Corona-Warn-App/src/main/res/layout/include_contact_form.xml diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationLegalFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationLegalFragment.kt index 053d1bb2fa0..4d5b127d036 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationLegalFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationLegalFragment.kt @@ -1,6 +1,7 @@ package de.rki.coronawarnapp.ui.information import android.os.Bundle +import android.text.method.LinkMovementMethod import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -37,6 +38,17 @@ class InformationLegalFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setButtonOnClickListener() + setUpContactFormLinks() + } + + /** + * Make the links clickable + */ + private fun setUpContactFormLinks() { + binding.informationLegalContactForm.informationLegalContactForm + .movementMethod = LinkMovementMethod.getInstance() + binding.informationLegalContactForm.informationLegalContactFormNonEnDe + .movementMethod = LinkMovementMethod.getInstance() } override fun onResume() { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterInformationLegalHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterInformationLegalHelper.kt new file mode 100644 index 00000000000..37d04447780 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterInformationLegalHelper.kt @@ -0,0 +1,34 @@ +@file:JvmName("FormatterInformationLegalHelper") + +package de.rki.coronawarnapp.util.formatter +import android.view.View +import java.util.Locale + +/** + * Language based format visibility + * + * @param defaultLanguageEnglishOrGerman + * @param isContactFormView + * @return + */ +fun formatVisibilityLanguageBased(defaultLanguageEnglishOrGerman: Boolean, isContactFormView: Boolean?): Int { + if (defaultLanguageEnglishOrGerman) { + return if (isContactFormView == true) { + View.VISIBLE + } else View.GONE + } + return if (isContactFormView == false) { + View.VISIBLE + } else View.GONE +} + +/** + * checks the default language of the device and formats the visibility + * Returns visibility value + * + * @param isContactFormView + * @return + */ +fun formatContactForm(isContactFormView: Boolean?): Int = + formatVisibilityLanguageBased(Locale.getDefault().language == Locale.ENGLISH.language || + Locale.getDefault().language == Locale.GERMAN.language, isContactFormView) diff --git a/Corona-Warn-App/src/main/res/layout/fragment_information_legal.xml b/Corona-Warn-App/src/main/res/layout/fragment_information_legal.xml index ceace17bfb5..0cbf75aee7f 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_information_legal.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_information_legal.xml @@ -105,6 +105,15 @@ app:layout_constraintStart_toEndOf="@+id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/information_legal_headline_contact" /> + + + app:layout_constraintTop_toBottomOf="@+id/information_legal_contact_form" /> + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/values-de/strings.xml b/Corona-Warn-App/src/main/res/values-de/strings.xml index aacf673101b..90431f6e453 100644 --- a/Corona-Warn-App/src/main/res/values-de/strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/strings.xml @@ -689,7 +689,11 @@ "Kontakt" - "E-Mail: CoronaWarnApp@rki.de""\n""Telefon: +49 30 18754 5100" + "E-Mail: CoronaWarnApp@rki.de" + + Kontaktformular + + Contact Form in English or German "Umsatzsteueridentifikationsnummer" diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index 0a2b46beeeb..2fd04e08af8 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -691,7 +691,11 @@ "Contact" - "E-Mail: CoronaWarnApp@rki.de""\n""Telephone: +49 30 18754 5100" + "E-Mail: CoronaWarnApp@rki.de" + + Contact Form + + Contact Form in English or German "VAT identification number" From 8ea76aa9197d20efe6891b5e445a4feb3825a6f1 Mon Sep 17 00:00:00 2001 From: Alex Paulescu Date: Tue, 18 Aug 2020 09:56:25 +0300 Subject: [PATCH 19/27] Active tracing days count can be negative (EXPOSUREAPP-1844) #828 (#1029) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Refactored method * Normalized interval pairs. * Perfoming additional check for from date * Removed changes from build.gradle * Fixed lint errors Co-authored-by: Jakob Möller --- .../de/rki/coronawarnapp/risk/TimeVariables.kt | 17 +++++++---------- .../tracing/TracingIntervalRepository.kt | 16 +++++++--------- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/TimeVariables.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/TimeVariables.kt index 55cc1860550..c518230d7a1 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/TimeVariables.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/TimeVariables.kt @@ -188,22 +188,19 @@ object TimeVariables { // by default the tracing is assumed to be activated // if the API is reachable we set the value accordingly - var enIsDisabled = false - - try { - enIsDisabled = !InternalExposureNotificationClient.asyncIsEnabled() + val enIsDisabled = try { + !InternalExposureNotificationClient.asyncIsEnabled() } catch (e: ApiException) { e.report(ExceptionCategory.EXPOSURENOTIFICATION) + false } if (enIsDisabled) { val current = System.currentTimeMillis() - var lastTimeTracingWasNotActivated = - LocalData.lastNonActiveTracingTimestamp() ?: current - - if (lastTimeTracingWasNotActivated < (current - getTimeRangeFromRetentionPeriod())) { - lastTimeTracingWasNotActivated = current - getTimeRangeFromRetentionPeriod() - } + val lastTimeTracingWasNotActivated = minOf( + LocalData.lastNonActiveTracingTimestamp() ?: current, + current - tracingActiveMS + ) inactiveTracingIntervals.add(Pair(lastTimeTracingWasNotActivated, current)) } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/tracing/TracingIntervalRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/tracing/TracingIntervalRepository.kt index 478e580bfec..0f34787c36a 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/tracing/TracingIntervalRepository.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/tracing/TracingIntervalRepository.kt @@ -61,14 +61,12 @@ class TracingIntervalRepository(private val tracingIntervalDao: TracingIntervalD } suspend fun getIntervals(): List> { - deleteOutdatedInterval() - return tracingIntervalDao.getAllIntervals().map { - Pair(it.from, it.to) - }.also { - Timber.d("Intervals: $it") - } - } + val retentionTimestamp = System.currentTimeMillis() - TimeVariables.getDefaultRetentionPeriodInMS() + tracingIntervalDao.deleteOutdatedIntervals(retentionTimestamp) - private suspend fun deleteOutdatedInterval() = tracingIntervalDao - .deleteOutdatedIntervals(System.currentTimeMillis() - TimeVariables.getDefaultRetentionPeriodInMS()) + return tracingIntervalDao + .getAllIntervals() + .map { Pair(maxOf(it.from, retentionTimestamp), it.to) } + .also { Timber.d("Intervals: $it") } + } } From ed2690dd8f5443b79ccc535f72a4c02cb585a56e Mon Sep 17 00:00:00 2001 From: harambasicluka <64483219+harambasicluka@users.noreply.github.com> Date: Tue, 18 Aug 2020 10:34:35 +0200 Subject: [PATCH 20/27] added tess relay string (#1034) --- Corona-Warn-App/src/main/res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Corona-Warn-App/src/main/res/values-de/strings.xml b/Corona-Warn-App/src/main/res/values-de/strings.xml index 90431f6e453..5f102011aed 100644 --- a/Corona-Warn-App/src/main/res/values-de/strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/strings.xml @@ -944,7 +944,7 @@ "Info zum Ablauf:" - "Bitte halten Sie zur TAN-Abfrage Ihren Befundbrief (sofern vorhanden) und Ihre Telefonnummer bereit." + "Bitte halten Sie zur TAN-Abfrage Ihren Befundbrief (sofern vorhanden) und Ihre Telefonnummer bereit.\n\nGehörlose, schwerhörige und spätertaubte Menschen können zur telefonischen Kontaktaufnahme die Tess-Relay-Dienste (Dolmetschen in Gebärdensprache und deutscher Schriftsprache) nutzen. Die Software können Sie in Ihrem Play Store herunterladen." "Anrufen" From cc8d2ec181c288fcc1a3c550d2a3bffb956c9bb0 Mon Sep 17 00:00:00 2001 From: harambasicluka <64483219+harambasicluka@users.noreply.github.com> Date: Tue, 18 Aug 2020 11:24:27 +0200 Subject: [PATCH 21/27] added string to open app daily (#1035) --- Corona-Warn-App/src/main/res/values-de/strings.xml | 2 ++ Corona-Warn-App/src/main/res/values/strings.xml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Corona-Warn-App/src/main/res/values-de/strings.xml b/Corona-Warn-App/src/main/res/values-de/strings.xml index 5f102011aed..f937056e9d9 100644 --- a/Corona-Warn-App/src/main/res/values-de/strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/strings.xml @@ -163,6 +163,8 @@ "Aktualisiert: %1$s" "Tägliche Aktualisierung" + + "Hinweis: Bitte öffnen Sie die App täglich, um den Risikostatus zu aktualisieren." "Aktualisieren" diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index 2fd04e08af8..1e7d94d268f 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -165,6 +165,8 @@ "Updated: %1$s" "Updated daily" + + "Update" From 516bb622a8885682c9a29d630a4bd244d6ad0330 Mon Sep 17 00:00:00 2001 From: chris-cwa <69595386+chris-cwa@users.noreply.github.com> Date: Tue, 18 Aug 2020 13:02:37 +0200 Subject: [PATCH 22/27] changed texts for qr code and test deletion (#1036) * changed text for invalid qr code * changed text for delete test --- Corona-Warn-App/src/main/res/values-de/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Corona-Warn-App/src/main/res/values-de/strings.xml b/Corona-Warn-App/src/main/res/values-de/strings.xml index f937056e9d9..4098c827e47 100644 --- a/Corona-Warn-App/src/main/res/values-de/strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/strings.xml @@ -765,9 +765,9 @@ - "QR-Code nicht korrekt" + "QR-Code ist ungültig" - "Der QR-Code ist nicht korrekt. Bitte versuchen Sie es erneut." + "Der QR-Code ist ungültig oder wurde bereits auf einem Smartphone registriert. Ihr Testergebnis bekommen Sie vom Testcenter oder Labor, unabhängig von der Gültigkeit des QR-Codes. Wenn Ihr Test positiv ausfällt, bekommen Sie vom Gesundheitsamt eine Mitteilung." "Erneut versuchen" @@ -824,9 +824,9 @@ "OK" - "Test entfernen?" + "Test kann nur einmal gescannt werden" - "Der Test wird endgültig aus der Corona-Warn-App entfernt und kann nicht wieder hinzugefügt werden. Dieser Vorgang kann nicht widerrufen werden." + "Wenn Sie den Test entfernen, können Sie Ihr Testergebnis nicht mehr abrufen. Ihr Testergebnis bekommen Sie vom Testcenter oder Labor, unabhängig von der App. Wenn Ihr Test positiv ausfällt, bekommen Sie vom Gesundheitsamt eine Mitteilung." "Entfernen" From d8db6ebc934f499936c5696f01e95eda10edc931 Mon Sep 17 00:00:00 2001 From: Rituraj Sambherao <54317407+ritsam@users.noreply.github.com> Date: Wed, 19 Aug 2020 07:43:24 +0100 Subject: [PATCH 23/27] Fix the submission with zero keys (EXPOSUREAPP-1742) (#990) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * No submission possible (EXPOSUREAPP-1742) 1. sets the LocalData values to emulate jey submission. * Logic improvement after code review * WorkSchedular stopped after submission * Improved logic * pipeline fix - removed unused import * logic simplified based on review Co-authored-by: Jakob Möller --- .../java/de/rki/coronawarnapp/storage/SubmissionRepository.kt | 1 - .../SubmissionResultPositiveOtherWarningFragment.kt | 2 +- .../de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModel.kt | 4 ++++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/SubmissionRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/SubmissionRepository.kt index 3190d0e48d5..eb969441593 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/SubmissionRepository.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/SubmissionRepository.kt @@ -35,7 +35,6 @@ object SubmissionRepository { private suspend fun fetchTestResult(): DeviceUIState { try { val testResult = SubmissionService.asyncRequestTestResult() - if (testResult == TestResult.POSITIVE) { LocalData.isAllowedToSubmitDiagnosisKeys(true) } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionResultPositiveOtherWarningFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionResultPositiveOtherWarningFragment.kt index 901a01df567..471d9f48c22 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionResultPositiveOtherWarningFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionResultPositiveOtherWarningFragment.kt @@ -170,7 +170,6 @@ class SubmissionResultPositiveOtherWarningFragment : Fragment(), DialogHelper.showDialog(tracingRequiredDialog) return } - internalExposureNotificationPermissionHelper.requestPermissionToShareKeys() } @@ -187,6 +186,7 @@ class SubmissionResultPositiveOtherWarningFragment : Fragment(), if (keys.isNotEmpty()) { submissionViewModel.submitDiagnosisKeys(keys) } else { + submissionViewModel.submitWithNoDiagnosisKeys() navigateToSubmissionDoneFragment() } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModel.kt index bbcba1dfe57..1964d9169bb 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModel.kt @@ -112,6 +112,10 @@ class SubmissionViewModel : ViewModel() { SubmissionService.deleteTestGUID() } + fun submitWithNoDiagnosisKeys() { + SubmissionService.submissionSuccessful() + } + fun deregisterTestFromDevice() { deleteTestGUID() SubmissionService.deleteRegistrationToken() From 6b9c14f1583d987ceccb900b984585852730de16 Mon Sep 17 00:00:00 2001 From: janetback <68653277+janetback@users.noreply.github.com> Date: Wed, 19 Aug 2020 08:46:45 +0200 Subject: [PATCH 24/27] Update strings.xml (#1038) Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com> --- Corona-Warn-App/src/main/res/values-de/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Corona-Warn-App/src/main/res/values-de/strings.xml b/Corona-Warn-App/src/main/res/values-de/strings.xml index 4098c827e47..1029935d403 100644 --- a/Corona-Warn-App/src/main/res/values-de/strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/strings.xml @@ -340,12 +340,12 @@ "Sie haben ein niedriges Infektionsrisiko, da keine Begegnung mit nachweislich Corona-positiv getesteten Personen aufgezeichnet wurde oder sich Ihre Begegnung auf kurze Zeit und einen größeren Abstand beschränkt hat." - "Sie haben ein erhöhtes Infektionsrisiko, da Sie zuletzt vor %1$s Tag mindestens einer nachweislich Corona-positiv getesteten Person über einen längeren Zeitpunkt und mit einem geringen Abstand begegnet sind." - "Sie haben ein erhöhtes Infektionsrisiko, da Sie zuletzt vor %1$s Tagen mindestens einer nachweislich Corona-positiv getesteten Person über einen längeren Zeitpunkt und mit einem geringen Abstand begegnet sind." - "Sie haben ein erhöhtes Infektionsrisiko, da Sie zuletzt vor %1$s Tagen mindestens einer nachweislich Corona-positiv getesteten Person über einen längeren Zeitpunkt und mit einem geringen Abstand begegnet sind." - "Sie haben ein erhöhtes Infektionsrisiko, da Sie zuletzt vor %1$s Tagen mindestens einer nachweislich Corona-positiv getesteten Person über einen längeren Zeitpunkt und mit einem geringen Abstand begegnet sind." - "Sie haben ein erhöhtes Infektionsrisiko, da Sie zuletzt vor %1$s Tagen mindestens einer nachweislich Corona-positiv getesteten Person über einen längeren Zeitpunkt und mit einem geringen Abstand begegnet sind." - "Sie haben ein erhöhtes Infektionsrisiko, da Sie zuletzt vor %1$s Tagen mindestens einer nachweislich Corona-positiv getesteten Person über einen längeren Zeitpunkt und mit einem geringen Abstand begegnet sind." + "Sie haben ein erhöhtes Infektionsrisiko, da Sie zuletzt vor %1$s Tag mindestens einer nachweislich Corona-positiv getesteten Person über einen längeren Zeitraum und mit einem geringen Abstand begegnet sind." + "Sie haben ein erhöhtes Infektionsrisiko, da Sie zuletzt vor %1$s Tagen mindestens einer nachweislich Corona-positiv getesteten Person über einen längeren Zeitraum und mit einem geringen Abstand begegnet sind." + "Sie haben ein erhöhtes Infektionsrisiko, da Sie zuletzt vor %1$s Tagen mindestens einer nachweislich Corona-positiv getesteten Person über einen längeren Zeitraum und mit einem geringen Abstand begegnet sind." + "Sie haben ein erhöhtes Infektionsrisiko, da Sie zuletzt vor %1$s Tagen mindestens einer nachweislich Corona-positiv getesteten Person über einen längeren Zeitraum und mit einem geringen Abstand begegnet sind." + "Sie haben ein erhöhtes Infektionsrisiko, da Sie zuletzt vor %1$s Tagen mindestens einer nachweislich Corona-positiv getesteten Person über einen längeren Zeitraum und mit einem geringen Abstand begegnet sind." + "Sie haben ein erhöhtes Infektionsrisiko, da Sie zuletzt vor %1$s Tagen mindestens einer nachweislich Corona-positiv getesteten Person über einen längeren Zeitraum und mit einem geringen Abstand begegnet sind." "Das Infektionsrisiko wird anhand der Daten der Risiko-Ermittlung unter Berücksichtigung von Abstand und Dauer lokal auf Ihrem Smartphone berechnet. Ihr Infektionsrisiko ist für niemanden einsehbar und wird nicht weitergegeben." From 8f9f27c08774f598b6d822752134a9579f9c8448 Mon Sep 17 00:00:00 2001 From: Matthias Urhahn Date: Wed, 19 Aug 2020 09:14:29 +0200 Subject: [PATCH 25/27] Fixes 9002 error caused by test fragment risk reset (related to EXPOSUREAPP-1851) (#1037) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Resetting the preferences deletes our database encryption credentials, but we don't delete the database itself. On app restart, there is a mismatch between the newly generated credentials and the old database. * Include dependency 'androidx.annotation'. The previous commit accidentally used the transitive dependency from google-utils. Co-authored-by: Matthias Urhahn Co-authored-by: Jakob Möller Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com> --- Corona-Warn-App/build.gradle | 1 + .../java/de.rki.coronawarnapp/TestRiskLevelCalculation.kt | 8 ++++---- .../main/java/de/rki/coronawarnapp/storage/AppDatabase.kt | 2 ++ 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Corona-Warn-App/build.gradle b/Corona-Warn-App/build.gradle index 0fb0183cab8..3890c320df8 100644 --- a/Corona-Warn-App/build.gradle +++ b/Corona-Warn-App/build.gradle @@ -235,6 +235,7 @@ dependencies { implementation 'androidx.preference:preference:1.1.1' implementation 'androidx.work:work-runtime-ktx:2.3.4' implementation 'android.arch.lifecycle:extensions:1.1.1' + implementation 'androidx.annotation:annotation:1.1.0' // QR implementation('com.journeyapps:zxing-android-embedded:4.1.0') { transitive = false } diff --git a/Corona-Warn-App/src/deviceForTesters/java/de.rki.coronawarnapp/TestRiskLevelCalculation.kt b/Corona-Warn-App/src/deviceForTesters/java/de.rki.coronawarnapp/TestRiskLevelCalculation.kt index 76e9833d49c..b19611425cf 100644 --- a/Corona-Warn-App/src/deviceForTesters/java/de.rki.coronawarnapp/TestRiskLevelCalculation.kt +++ b/Corona-Warn-App/src/deviceForTesters/java/de.rki.coronawarnapp/TestRiskLevelCalculation.kt @@ -107,10 +107,10 @@ class TestRiskLevelCalculation : Fragment() { tracingViewModel.viewModelScope.launch { withContext(Dispatchers.IO) { try { - // Database Reset - AppDatabase.getInstance(requireContext()).clearAllTables() - // Delete Database Instance + // Preference reset SecurityHelper.resetSharedPrefs() + // Database Reset + AppDatabase.reset(requireContext()) // Export File Reset FileStorageHelper.getAllFilesInKeyExportDirectory().forEach { it.delete() } @@ -124,7 +124,7 @@ class TestRiskLevelCalculation : Fragment() { } RiskLevelTransaction.start() Toast.makeText( - requireContext(), "Resetted, please fetch diagnosis keys from server again", + requireContext(), "Reset done, please fetch diagnosis keys from server again", Toast.LENGTH_SHORT ).show() } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/AppDatabase.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/AppDatabase.kt index df9ff72967b..ce4640c15db 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/AppDatabase.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/AppDatabase.kt @@ -2,6 +2,7 @@ package de.rki.coronawarnapp.storage import android.content.Context import android.database.sqlite.SQLiteDatabase +import androidx.annotation.VisibleForTesting import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase @@ -39,6 +40,7 @@ abstract class AppDatabase : RoomDatabase() { } } + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) fun resetInstance() = synchronized(this) { instance = null } From d803523eb826e14fccdb74bffc8edc3471525d8b Mon Sep 17 00:00:00 2001 From: SAP LX Lab Service Account Date: Wed, 19 Aug 2020 03:38:15 -0700 Subject: [PATCH 26/27] [INTERNAL] Translation delivery: commit by LX Lab (#1039) Change-Id: I8af48ed2340554e341fb3c86b03111171ed06212 --- .../src/main/res/values-ar/strings.xml | 1131 +++++++++++++++++ .../src/main/res/values-bg/strings.xml | 34 +- .../src/main/res/values-en/strings.xml | 26 +- .../src/main/res/values-pl/strings.xml | 82 +- .../src/main/res/values-ro/strings.xml | 42 +- .../src/main/res/values-ru/strings.xml | 1131 +++++++++++++++++ .../src/main/res/values-tr/strings.xml | 22 +- 7 files changed, 2385 insertions(+), 83 deletions(-) create mode 100644 Corona-Warn-App/src/main/res/values-ar/strings.xml create mode 100644 Corona-Warn-App/src/main/res/values-ru/strings.xml diff --git a/Corona-Warn-App/src/main/res/values-ar/strings.xml b/Corona-Warn-App/src/main/res/values-ar/strings.xml new file mode 100644 index 00000000000..235a49d84be --- /dev/null +++ b/Corona-Warn-App/src/main/res/values-ar/strings.xml @@ -0,0 +1,1131 @@ + + + + + + "shared_preferences_cwa" + + "preference_onboarding_completed" + + "preference_onboarding_completed_timestamp" + + "preference_background_check_done" + + "preference_reset_app" + + "preference_only_wifi" + + "preference_tracing" + + "preference_timestamp_diagnosis_keys_fetch" + + "preference_timestamp_manual_diagnosis_keys_retrieval" + + "preference_m_string_google_api_token" + + "preference_notifications_enabled" + + "preference_notifications_risk_enabled" + + "preference_notifications_test_enabled" + + "preference_background_job_enabled" + + "preference_mobile_data_enabled" + + "preference_registration_token" + + "preference_device_pairing_successful_time" + + "preference_initial_tracing_activation_time" + + "preference_initial_result_received_time" + + "preference_risk_level_score" + + "preference_risk_level_score_successful" + + "preference_timestamp_risk_level_calculation" + + "preference_test_guid" + + "preference_is_allowed_to_submit_diagnosis_keys" + + "preference_auth_code" + + "preference_database_password" + + "preference_total_non_active_tracing" + + "preference_last_non_active_tracing_timestamp" + + "preference_number_successful_submissions" + + "preference_teletan" + + "preference_last_three_hours_from_server" + + "preference_polling_test_result_started" + + "preference_test_result_notification" + + "preference_risk_days_explanation_shown" + + + + + "الخلف" + + "التالي" + + "القائمة" + + "إغلاق" + + "تطبيق Corona-Warn-App" + + "زر" + + + + + "نظرة عامة" + + "معلومات التطبيق" + + "الإعدادات" + + + + "de.rki.coronawarnapp.notification.exposureNotificationChannelId" + + "1" + + "تطبيق Corona-Warn-App" + + "إشعارات من تطبيق Corona-Warn-App" + + "تطبيق Corona-Warn-App" + + "لديك رسائل جديدة من تطبيق Corona-Warn-App." + + + + + "التحديث متوفر" + + "يرجى ملاحظة أنه بإمكانك فقط استخدام تطبيق Corona-Warn-App مجددًا بمجرد تثبيت آخر تحديث." + + "تحديث" + + + + + "لا توجد مخالطة حتى الآن" + + + "%1$s مخالطة بخطر منخفض" + "%1$s من المخالطات بخطر منخفض" + "لا توجد مخالطة حتى الآن" + "%1$s مخالطة بخطر منخفض" + "%1$s من المخالطات بخطر منخفض" + "%1$s من المخالطات بخطر منخفض" + + + + "%1$s مخالطة" + "%1$s من المخالطات" + "لا توجد مخالطة حتى الآن" + "%1$s من المخالطات" + "%1$s من المخالطات" + "%1$s من المخالطات" + + + "تسجيل المخالطة كان نشطًا لمدة %1$s من الأربعة عشر يومًا الماضية." + + "تسجيل المخالطة نشط دائمًا" + + "لم يتم فحص التجمُّعات حتى الآن." + + "تم التحديث: %1$s" + + "يتم التحديث يوميًا" + + "ملاحظة: يُرجى فتح التطبيق يوميًا لتحديث مستوى الخطر لديك." + + "تحديث" + + "تحديث في %1$s" + + "تنشيط تسجيل المخالطة" + + "قم بتنشيط تسجيل المخالطة لتقييم مستوى الخطر اليوم." + + "خطر منخفض" + + "خطر مرتفع" + + + "%1$s يوم منذ آخر تجمُّع" + "%1$s من الأيام منذ آخر تجمُّع" + "%1$s من الأيام منذ آخر تجمُّع" + "%1$s من الأيام منذ آخر تجمُّع" + "%1$s من الأيام منذ آخر تجمُّع" + "%1$s من الأيام منذ آخر تجمُّع" + + + "خطر غير معروف" + + "تعذر علينا تقدير خطر العدوى نظرًا لعدم قيامك بتنشيط تسجيل المخالطة لفترة طويلة بما فيه الكفاية." + + "تسجيل المخالطة توقف" + + "آخر تسجيل مخالطة:""\n""%1$s" + + "تسجيل المخالطة غير ممكن" + + "تعذر تحديث تسجيل المخالطة لأكثر من 24 ساعة." + + "لم يتم تحديث مستوى الخطر لمدة تزيد عن 48 ساعة. يرجى تحديث مستوى الخطر." + + "الفحص قيد التشغيل..." + + "يتم تنزيل البيانات الحالية وفحصها.\nقد يستغرق هذا عدة دقائق." + + + + + "الأسئلة المتكررة" + + "يمكنك أن تجد هنا إجابات الأسئلة المتكررة حول تطبيق Corona-Warn-App. سيتم توجيهك إلى موقع إلكتروني خارجي." + + "https://www.bundesregierung.de/corona-warn-app-faq-englisch" + + "يمكنك أن تجد هنا إجابات الأسئلة المتكررة حول تطبيق Corona-Warn-App. سيتم توجيهك إلى موقع إلكتروني خارجي." + + + + + "مشاركة تطبيق Corona-Warn-App" + + "لنكافح فيروس كورونا معًا" + + "كلما زاد عدد مستخدمي التطبيق، أصبح بإمكاننا كسر سلسلة العدوى بشكل أسرع. الرجاء دعوة أسرتك وأصدقائك إلى تنزيل هذا التطبيق." + + "إرسال رابط التنزيل" + + "مكافحة فيروس كورونا معًا ""\n""أنا مستعد لذلك، ماذا عنك؟""\n""https://www.corona-warn-app.de""\n""\n" + + "رجل يشارك تطبيق Corona-Warn-App مع أربعة أشخاص آخرين." + + + + + "نظرة عامة" + + "نظرة عامة" + + "تسجيل المخالطة" + + "تسجيل المخالطة أحد الميزات الجوهرية الثلاث في التطبيق. عند تنشيطه، يتم تسجيل التجمُّعات مع أجهزة الأشخاص الآخرين، ولا يتعين عليك اتخاذ أي إجراء آخر." + + "خطر العدوى" + + "إذا تعاملت خلال آخر 14 يومًا مع شخص مصاب بمرض كوفيد-19، فسيُقدِّر التطبيق خطر العدوى لك؛ وذلك من خلال قياس مدة المخالطة ومدى اقترابك من المصاب." + + "قد يظهر لك مستوى الخطر التالي:" + + "خطر مرتفع" + + "خطر منخفض" + + "خطر غير معروف" + + "إشعار مستخدمين أخرين" + + "من الميزات الجوهرية الأخرى تسجيل اختبارك واسترجاع النتيجة. إذا تم تشخيصك على أنك مصاب بمرض كوفيد-19، يمكنك إشعار الآخرين وكسر سلسلة العدوى." + + "تعريف المصطلحات:" + + "سجل المخالطة" + + "قائمة بمعرفات عشوائية مؤقتة مستلَمة تُحفَظ مؤقتًا في ذاكرة تخزين التشغيل. تُقرأ هذه القائمة عند التحقق من المخالطات، وتُحذَف جميع المعرفات العشوائية تلقائيًا بعد 14 يومًا." + + "التحقق من المخالطة" + + "يتم استرجاع بيانات سجل المخالطة ومزامنتها مع حالات عدوى المستخدمين الآخرين المبلغ عنها. يتم إجراء التحقق من المخالطة تلقائيًا كل ساعتين تقريبًا." + + "المخالطات" + + "التجمُّعات لمدة طويلة ومن مسافة قريبة جدًا مع أشخاص مصابين بمرض كوفيد-19." + + "إشعار المخالطة" + + "عرض المخالطات في تطبيق Corona-Warn-App." + + "المعرفات العشوائية" + + "المعرفات العشوائية هي مجموعات مكونة من أحرف وأرقام مُنشأة بشكل عشوائي. يتم تبادل هذه المعرفات بين الأجهزة الموجودة بالقرب. ولا يمكن تعيين المعرفات العشوائية إلى شخص معين كما يتم حذفها تلقائيًا بعد 14 يومًا. يمكن للأشخاص الذين تم تشخيصهم كمصابين بمرض كوفيد-19 أن يختاروا مشاركة معرفاتهم العشوائية في آخر 14 يومًا مع مستخدمي التطبيق الآخرين." + + "هاتف ذكي يعرض محتوى متنوعًا، مرقمًا من 1 إلى 3." + + "الصفحة الرئيسية لتطبيق Corona-Warn-App" + + + + + "مستوى الخطر" + + "التعليمات" + + "أمور يجب عليك الالتزام بها" + + "يُرجى التوجه إلى منزلك والمكوث به إن أمكن ذلك." + + "إذا كانت لديك استفسارات بشأن الأعراض أو توفر الاختبار أو العزل الذاتي، فالرجاء الاتصال بجهة واحدة مما يلي:" + + "اغسل يديك بانتظام بالصابون لمدة 20 ثانية." + + "ارتدِ قناع الوجه عند التجمُّع مع أشخاص آخرين." + + "حافظ على الابتعاد عن الآخرين بمسافة لا تقل عن 1.5 متر." + + "قم بالعطس أو السعال في مرفقك أو في منديل." + + "طبيبك الممارس العام" + + "خدمة الطوارئ الطبية العامة على الهاتف رقم 116117" + + "دائرة الصحة العامة" + + "خطر العدوى" + + "تم تسجيل الفترة" + + "هذه الفترة مضمَّنة في الاحتساب." + + "يمكن تقدير خطر العدوى بالنسبة إليك فقط للفترات التي كان خلالها تسجيل المخالطة نشطًا. وبالتالي يجب أن تظل ميزة التسجيل نشطة دائمًا." + + "يشمل تسجيل المخالطة الأربعة عشر يومًا الماضية. وأثناء هذه الفترة يمكن أن تكون ميزة التسجيل على جهازك نشطة لمدة %1$s من الأيام. يقوم التطبيق تلقائيًا بحذف السجلات الأقدم، مثل تلك التي لم تعد ذات صلة بمنع العدوى." + + "هذه هي الطريقة التي كان يتم بها تقدير الخطر الواقع عليك" + + "هذه هي الطريقة التي يتم بها تقدير الخطر الواقع عليك" + + "تعذر علينا تقدير خطر العدوى نظرًا لعدم قيامك بتنشيط تسجيل المخالطة لفترة طويلة بما فيه الكفاية." + + "تعذر تحديث تسجيل المخالطة لأكثر من 24 ساعة." + + "لديك خطر منخفض للعدوى لأنه لم يتم تسجيل مخالطتك بأشخاص تم تشخيصهم لاحقًا كمصابين بمرض كوفيد-19، أو لأن تجمعاتك كانت لفترة زمنية قصيرة وعن بُعد." + + + "خطر العدوى لديك مرتفع لأنك خالطت مؤخرًا شخصًا واحدًا على الأقل مُصاب بمرض كوفيد-19 منذ %1$s يوم لفترة زمنية أطول وعن قرب." + "خطر العدوى لديك مرتفع لأنك خالطت مؤخرًا شخصًا واحدًا على الأقل مُصاب بمرض كوفيد-19 منذ %1$s من الأيام لفترة زمنية أطول وعن قرب." + "خطر العدوى لديك مرتفع لأنك خالطت مؤخرًا شخصًا واحدًا على الأقل مُصاب بمرض كوفيد-19 منذ %1$s من الأيام لفترة زمنية أطول وعن قرب." + "خطر العدوى لديك مرتفع لأنك خالطت مؤخرًا شخصًا واحدًا على الأقل مُصاب بمرض كوفيد-19 منذ %1$s من الأيام لفترة زمنية أطول وعن قرب." + "خطر العدوى لديك مرتفع لأنك خالطت مؤخرًا شخصًا واحدًا على الأقل مُصاب بمرض كوفيد-19 منذ %1$s من الأيام لفترة زمنية أطول وعن قرب." + "خطر العدوى لديك مرتفع لأنك خالطت مؤخرًا شخصًا واحدًا على الأقل مُصاب بمرض كوفيد-19 منذ %1$s من الأيام لفترة زمنية أطول وعن قرب." + + + "يتم تقدير خطر العدوى من بيانات تسجيل المخالطة (المدة ومدى الاقتراب) محليًا على جهازك. ولا يمكن الاطلاع على خطر العدوى من جانب أي شخص آخر أو تمريره إليه." + + "لذلك، تم تصنيف خطر العدوى كمنخفض. يتم تقدير خطر العدوى من بيانات تسجيل المخالطة (المدة ومدى الاقتراب) محليًا على جهازك. ولا يمكن الاطلاع على خطر العدوى من جانب أي شخص آخر أو تمريره إليه." + + "وبالتالي، تم تصنيف خطر العدوى كمرتفع. يتم تقدير خطر العدوى من بيانات تسجيل المخالطة (المدة ومدى الاقتراب) محليًا على جهازك. ولا يمكن الاطلاع على خطر العدوى من جانب أي شخص آخر أو تمريره إليه. عند العودة إلى المنزل، يرجى تجنب التعامل عن قرب مع أفراد أسرتك أو عائلتك." + + @string/risk_card_button_update + + @string/risk_card_button_enable_tracing + + "مستوى الخطر" + + + "معلومات حول وظيفة تسجيل المخالطة" + + "لمزيد من المعلومات، راجع صفحة الأسئلة المتكررة." + + + + + "عدم التنشيط" + + "تنشيط" + + "إلغاء" + + "التالي" + + "لنبدأ" + + "الخلف" + + "صفحة البدء 1 من 5: مكافحة فيروس كورونا معًا" + + "لنكافح فيروس كورونا معًا" + + "مزيد من الحماية لك ولنا جميعًا. يمكننا كسر سلاسل العدوى أسرع بكثير من خلال استخدام تطبيق Corona-Warn-App." + + "قم بتحويل جهازك إلى نظام للتحذير من فيروس كورونا. ألقِ نظرة عامة على مستوى الخطر الواقع عليك وتعرف على ما إذا كنت قد تواصلت عن قرب مع أي شخص مصاب بمرض كوفيد-19 خلال آخر 14 يومًا." + + "يسجل التطبيق تجمعات الأفراد بتبادل معرفات عشوائية مشفرة بين أجهزتهم، ولا يتم الوصول إلى أي معلومات شخصية أيًا كانت." + + "مجموعة أشخاص يستخدمون هواتفهم الذكية حول المدينة." + + "صفحة البدء 2 من 5: خصوصية البيانات. يوجد نص طويل. للمتابعة في أي وقت لاحق، استخدم الزر الموجود أعلى الشاشة." + + "خصوصية البيانات" + + + "سيدة تستخدم تطبيق Corona-Warn-App على هاتفها الذكي. ترمز أيقونة القفل الموجودة بخلفية الشاشة إلى بيانات مشفرة." + + "صفحة البدء 3 من 5: كيفية تمكين تسجيل المخالطة" + + "كيفية تمكين تسجيل المخالطة" + + "لتحديد ما إذا كنت معرضًا لخطر العدوى، يجب عليك تنشيط ميزة تسجيل المخالطة." + + "يعمل تسجيل المخالطة من خلال تلقي جهازك، عبر Bluetooth، المعرفات العشوائية المشفرة لمستخدمين آخرين وتمرير معرفك العشوائي إلى أجهزتهم. ويمكن إلغاء تنشيط هذه الميزة في أي وقت." + + "لا تقوم المعرفات العشوائية بإرسال أي معلومات إلى الأشخاص الآخرين إلا معلومات التاريخ والمدة ومدى الاقتراب (باستخدام قوة الإشارة). ولا يتم أبدًا تسجيل البيانات الشخصية مثل الاسم والعنوان والموقع. كما لا يمكن تحديد هوية الأفراد." + + "معلومات التطبيق بلغة مبسطة ولغة الإشارة" + + "إقرار الموافقة" + + "لمعرفة ما إذا كنت قد خالطت شخصًا مصابًا بالعدوى، وما إذا كان هناك خطر عدوى بالنسبة لك، يتعين عليك تنشيط خاصية تسجيل المخالطة الموجودة في التطبيق. الموافقة على تنشيط خاصية تسجيل المخالطة، ومعالجة البيانات في هذا السياق، بالنقر على زر: \"تمكين\".""\n""\n""لكي يمكنك استخدام خاصية تسجيل المخالطة، يتعين عليك أيضًا تنشيط خاصية تسجيل المخالطات المتاحة من جوجل على هاتفك الذكي \"إشعارات التعرض لفيروس كورونا المستجد (كوفيد-19) \"، ومنح اذن لتطبيق Corona-Warn-App لاستخامها.""\n""\n""عند تنشيط خاصية تسجيل المخالطات يتولى هاتفك الذكي إنشاء وإرسال أرقام تعريف عشوائية عبر Bluetooth بصفة مستمرة، والتي يمكن استقبالها في محيطك من هواتف أبل وأندرويد الذكية الأخرى، التي تكون فيها خاصية تسجيل المخالطات منشطة بالمثل. والعكس صحيح، حيث يستقبل هاتفك الذكي المعرفات العشوائية للهواتف الذكية الأخرى. يتم تسجيل أرقام تعريفك العشوائية والمعرفات العشوائية المستقبلة من الهواتف الذكية الأخرى في سجل المخالطة بخاصية تسجيل المخالطات، وتخزن هناك لمدة 14 يومًا.""\n""\n""للتعرف على خطر العدوى بالنسبة لك، يستدعي التطبيق عدة مرات يوميًا -أو عند الرغبة- قائمةً بالمعرفات العشوائية لكافة المستخدمين الذين سجلوا إصابتهم بفيروس كورونا في التطبيق. يتم مقارنة هذه القائمة بعد ذلك مع المعرفات العشوائية المخزنة في سجل المخالطة بخاصية تسجيل المخالطات. وعندما يتأكد التطبيق من أنك ربما خالطت مستخدمًا مصابًا بالعدوى، يخطرك التطبيق بأنك خالطت شخصًا مصابًا، وأنه من المحتمل تعرضك لخطر العدوى. في هذه الحالة يحصل التطبيق أيضًا على إذن بالوصول إلى بيانات إضافية مخزنة في سجل المخالطة بخاصية تسجيل المخالطات لهاتفك الذكي (التاريخ، والمدة، وقوة إشارة Bluetooth عند المخالطة).""\n""\n""يُستدل على البُعد المكاني من قوة إشارة Bluetooth (كلما كانت الإشارة أقوى، كانت المسافة أقل). ثم يقيّم التطبيق هذه البيانات، من أجل تقييم احتمالية اصابتك بفيروس كورونا ، وتقديم التوصيات لك بشأن ما يجب القيام به بعد ذلك. يتم إجراء هذا التقييم حصريًا على هاتفك الذكي. لا يعرف أحدٌ سواك (بما في ذلك معهد روبرت كوخ أيضًا) ما إذا كنت قد خالطت شخصًا مصابًا، وما إذا كان الأمر ينطوي على خطر إصابتك.""\n""\n""لإلغاء موافقتك على خاصية تسجيل المخالطة، يمكنك إلغاء تنشيط الخاصية عبر الشريط الانزلاقي داخل التطبيق أو حذف التطبيق. وإذا كنت ترغب في استخدام خاصية تسجيل المخالطة مجددًا، فيمكنك إعادة تنشيط الشريط الانزلاقي أو تثبيت التطبيق من جديد. عند إلغاء خاصية تسجيل المخالطة، لن يفحص التطبيق ما إذا كنت قد خالطت مستخدمًا مصابًا أم لا. أيضًا لكي توقف إرسال المعرفات العشوائية واستقبالها، يتعين عليك الغاء تنشيط تسجل مخالطة المصابين بمرض كوفيد -19 في إعدادات هاتفك الذكي. يرجى الانتباه إلى أن رموز التعريف العشوائية للهاتف الذكي والهواتف الذكية الأخرى، والمخزنة في سجل المخالطة لن يتم حذفها من التطبيق. لا يمكنك حذف البيانات المخزنة في سجل المخالطة حذفًا نهائيًا إلا من خلال إعدادات هاتفك الذكي.""\n""\n""تجد تعليمات التطبيق الخاصة بحماية البيانات (بما في ذلك المعلومات حول معالجة البيانات لتسجيل المخالطة) تحت بند القائمة \"معلومات خصوصية البيانات\"." + + "تنشيط تسجيل المخالطة" + + "تفويض" + + "هذا يعني أن تطبيق Corona-Warn-App لا يمكنه إرسال أو تلقي إشعارات حول مستوى خطر مرض كوفيد-19. يمكنك إلغاء تنشيط هذه الميزة في أي وقت." + + "عدم التنشيط" + + "الخلف" + + "تحديثات في الخلفية مُلغى تنشيطها" + + "قمت بإلغاء تنشيط تحديثات في الخلفية لتطبيق Corona-Warn-App. الرجاء تنشيط تحديثات في الخلفية لاستخدام تسجيل المخالطة التلقائي. إذا لم تقم بتنشيط تحديثات في الخلفية، فيمكنك فقط بدء تسجيل المخالطة يدويًا في التطبيق. يمكنك تنشيط تحديثات في الخلفية للتطبيق في إعدادات الجهاز لديك." + + "فتح إعدادات الجهاز" + + "بدء تسجيل المخالطة يدويًا" + + "السماح بنشاط له أفضلية في الخلفية" + + "قم بتمكين النشاط الذي له أفضلية في الخلفية للسماح للتطبيق بتحديد مستوى الخطر الواقع عليك في الخلفية في أي وقت (مستحسَن). يؤدي ذلك إلى تعطيل زيادة عمر البطارية لتطبيق Corona-Warn-App فقط، ولا نتوقع أن يؤدي إلى انخفاض ملحوظ في عمر بطارية جهازك.\nإذا لم تسمح بهذا الإعداد، فمن المستحسن لك فتح التطبيق يدويًا مرة واحدة يوميًا على الأقل." + + "السماح" + + "عدم السماح" + + "النشاط الذي له أفضلية في الخلفية معطَّل" + + "يرجى العلم أنه مع تعطيل النشاط الذي له أفضلية في الخلفية، سيتعين عليك فتح التطبيق مرة واحدة يوميًا لتحديث مستوى الخطر. \n\nيمكنك تعطيل النشاط الذي له أفضلية في الخلفية من إعداداتك في أي وقت." + + "موافق" + + "قام ثلاثة أشخاص بتنشيط تسجيل المخالطة على أجهزتهم؛ مما سيعمل على تسجيل تجمُّعاتهم مع بعضهم بعضًا." + + "السماح بالوصول إلى الموقع" + + "لا يمكن الوصول إلى موقعك. يتطلب جوجل و/أو أندرويد الوصول إلى موقع جهازك لاستخدام Bluetooth." + + "فتح إعدادات الجهاز" + + "صفحة البدء 4 من 5: إذا كنت مصابًا بمرض كوفيد-19..." + + "إذا كنت مصابًا بمرض كوفيد-19..." + + "...يُرجى الإبلاغ عن هذا في تطبيق Corona-Warn-App. مشاركة نتائج اختبارك أمر اختياري وآمن. يُرجى القيام بهذا من أجل صحة الجميع." + + "يتم تشفير إشعارك ومعالجته بصورة آمنة على خادم آمن. الآن، سيتلقى الأشخاص الذين قام جهازك بتجميع معرفاتهم العشوائية المشفرة تحذيرًا مصحوبًا بمعلومات حول ما يجب عليهم فعله على الفور." + + "يتم إرسال تشخيص اختبار إيجابي مشفرًا إلى النظام؛ مما سينتج عنه تحذير المستخدمين الآخرين." + + "صفحة البدء 5 من 5: تلقي التحذيرات وتحديد الأخطار" + + "تلقي التحذيرات وتحديد الأخطار" + + "يمكن للتطبيق إشعارك تلقائيًا بمستوى الخطر الواقع عليك وتحذيرك من حالات العدوى الجديدة من الأشخاص الذين خالطتهم. اسمح للتطبيق الآن بإشعارك." + + "ويمكنك بعد ذلك عزل نفسك ذاتيًا لحماية الآخرين ومعرفة مكان إجراء الاختبار." + + "سيدة تتلقى إشعارًا من تطبيق Corona-Warn-App." + + + + + "الإعدادات" + + "تشغيل" + + "إيقاف تشغيل" + + "تسجيل المخالطة" + + "هذه هي طريقة عمل تسجيل المخالطة" + + "السماح بإنشاء معرفات عشوائية لمرض كوفيد-19 ومشاركتها." + + "تسجيل المخالطة نشط" + + "تسجيل المخالطة توقف" + + "خدمات الموقع تم إلغاء تنشيطها" + + "يتعين عليك تنشيط ميزة تسجيل المخالطة لتحديد ما إذا كنت معرضًا لخطر العدوى أم لا، ويعمل تحديد خطر العدوى من خلال تلقي جهازك، عبر Bluetooth، المعرفات العشوائية المشفرة لمستخدمين آخرين وتمرير معرفك العشوائي إلى أجهزتهم. ويمكنك تعطيل هذه الميزة في أي وقت.""\n""\n""لا تمرر المعرفات العشوائية المشفرة إلا معلومات حول التاريخ والمدة ومدى الاقتراب من الأشخاص الآخرين (يتم التقدير باستخدام قوة الإشارة). ولا يتم أبدًا تسجيل البيانات الشخصية، مثل الاسم والعنوان والموقع، كما لا يمكن تحديد هوية الأفراد." + + "نشط" + + "موقوف" + + "مقيَّد" + + "لا يوجد اتصال بالإنترنت" + + "تم إيقاف تشغيل Bluetooth" + + "تشغيل Bluetooth" + + "يجب تشغيل Bluetooth لتسجيل المخالطة من أجل تسجيل التجمُّعات. يرجى تشغيل Bluetooth من إعدادات جهازك." + + "فتح إعدادات الجهاز" + + "السماح بالوصول إلى الموقع" + + "لا يمكن الوصول إلى موقعك. يتطلب جوجل و/أو أندرويد الوصول إلى موقع جهازك لاستخدام Bluetooth." + + "فتح إعدادات الجهاز" + + "فتح الاتصال بالإنترنت" + + "يتطلب تسجيل المخالطة اتصالًا بالإنترنت لتقدير المخالطات. يُرجى تشغيل WIFI أو بيانات الهاتف من إعدادات جهازك." + + "فتح إعدادات الجهاز" + + + "تسجيل المخالطة نشط لمدة يوم واحد.\nلا يمكن أن يكون التحقق من المخالطة موثوقًا به إلا إذا كان تسجيل المخالطة نشطًا دائمًا." + "تسجيل المخالطة نشط لمدة %1$s من الأيام.\nلا يمكن أن يكون التحقق من المخالطة موثوقًا به إلا إذا كان تسجيل المخالطة نشطًا دائمًا." + "تسجيل المخالطة نشط لمدة %1$s من الأيام.\nلا يمكن أن يكون التحقق من المخالطة موثوقًا به إلا إذا كان تسجيل المخالطة نشطًا دائمًا." + "تسجيل المخالطة نشط لمدة %1$s من الأيام.\nلا يمكن أن يكون التحقق من المخالطة موثوقًا به إلا إذا كان تسجيل المخالطة نشطًا دائمًا." + "تسجيل المخالطة نشط لمدة %1$s من الأيام.\nلا يمكن أن يكون التحقق من المخالطة موثوقًا به إلا إذا كان تسجيل المخالطة نشطًا دائمًا." + "تسجيل المخالطة نشط لمدة %1$s من الأيام.\nلا يمكن أن يكون التحقق من المخالطة موثوقًا به إلا إذا كان تسجيل المخالطة نشطًا دائمًا." + + + "قام ثلاثة أشخاص بتنشيط تسجيل المخالطة على أجهزتهم؛ مما سيعمل على تسجيل تجمُّعاتهم مع بعضهم بعضًا." + + "ألغى شخص تنشيط تسجيل المخالطة على هاتفه الذكي؛ وبالتالي، لم يتم تسجيل تجمُّع مع شخصين آخرين." + + "أوقف شخص تشغيل Bluetooth على هاتفه الذكي؛ وبالتالي، لم يتم تسجيل تجمُّع مع شخصين آخرين." + + + + "قطع شخص الاتصال بالإنترنت على هاتفه الذكي؛ وبالتالي، لم يتم تسجيل تجمُّع مع شخصين آخرين." + + + "الإشعارات" + + "هل تريد تنشيط إشعارات مستوى خطر مرض كوفيد-19؟" + + "تم إلغاء تنشيط الإشعارات" + + "السماح بالإشعارات التلقائية لمستوى خطر مرض كوفيد-19" + + "حدد المناطق التي تريد استمرار تلقي الإشعارات عنها." + + "لتنشيط الإشعارات، يجب السماح بإشعارات تطبيق Corona-Warn-App من إعدادات جهازك." + + "تنشيط الإشعارات" + + "الإشعارات" + + "تم تغيير خطر العدوى" + + "حالة اختبار مرض كوفيد-19" + + "فتح إعدادات الجهاز" + + "سيدة تتلقى إشعارًا من تطبيق Corona-Warn-App." + + "سيدة ألغت تنشيط إشعارات تطبيق Corona-Warn-App." + + "إعادة تعيين التطبيق" + + "حذف كل البيانات في التطبيق." + + "هل تريد بالتأكيد إعادة تعيين التطبيق؟" + + "لن يتم إشعارك بعد الآن بالمخالطات ولن يكون بمقدورك تحذير المستخدمين الآخرين." + + "حذف سجل ""\n""المخالطة" + + "يجب حذف سجل المخالطة بشكل منفصل من إعدادات جهازك." + + "إعادة تعيين التطبيق" + + "إلغاء" + + "هاتف ذكي يعرض رمزًا يشير إلى إعادة تعيين التطبيق." + + "إعادة تعيين التطبيق" + + "لن يتم إشعارك بعد الآن بالمخالطات ولن يكون بمقدورك تحذير المستخدمين الآخرين. لا يمكن التراجع عن هذا الإجراء." + + "إلغاء" + + "إعادة تعيين" + + "نشاط له أفضلية في الخلفية" + + "السماح بتحديثات مستوى الخطر تلقائيًا" + + "تشغيل تطبيق Corona-Warn-App في الخلفية" + + "يتم تشغيل تطبيق Corona-Warn-App في الخلفية بشكل دائم عند تنشيط نشاط له أفضلية في الخلفية، وهذا يتيح للتطبيق تحديد مستوى الخطر في أي وقت." + + + + "لتعطيل نشاط له أفضلية في الخلفية، الرجاء إلغاء تنشيطه في إعدادات الجهاز." + + "فتح إعدادات الجهاز" + + "تعطيل نشاط له أفضلية في الخلفية" + + + + + "معلومات التطبيق" + + "الإصدار:%1s" + + "نبذة عن التطبيق" + + "لنكافح فيروس كورونا معًا" + + "معهد روبرت كوخ (RKI) هو الهيئة الصحية الاتحادية العامة في ألمانيا. ينشر المعهد تطبيق Corona-Warn-App بالنيابة عن الحكومة الاتحادية، والتطبيق مصمم كامتداد رقمي لإجراءات الصحة العامة المنفَّذة بالفعل: التباعد الاجتماعي والنظافة الشخصية واستخدام أقنعة الوجه." + + "يمكن لأي شخص يستخدم التطبيق تتبع سلسلة العدوى وكسرها. يحفظ التطبيق التجمُّعات مع الأشخاص الآخرين محليًا على جهازك. ويتم إشعارك عند تجمُّعك مع أشخاص تم تشخيصهم مؤخرًا على أنهم مصابون بمرض كوفيد-19، علمًا أن هويتك وخصوصيتك محميتان دائمًا." + + "مجموعة أشخاص يستخدمون هواتفهم الذكية حول المدينة." + + "خصوصية البيانات" + + "سيدة تستخدم تطبيق Corona-Warn-App على هاتفها الذكي. ترمز أيقونة القفل الموجودة بخلفية الشاشة إلى بيانات مشفرة." + + "privacy_en.html" + + "شروط الاستخدام" + + "المحتوى" + + "هاتف ذكي تظهر على شاشته نصوص بخط كبير وبجوارها علامة صح ترمز إلى قبول شروط الاستخدام." + + "terms_en.html" + + "الخط الساخن الفني" + + "كيف يمكننا مساعدتك؟" + + "للاستفسارات الفنية حول تطبيق Corona-Warn-App، الرجاء الاتصال بالخط الساخن." + + "الخط الساخن الفني:" + + "‎+49 800 7540001" + + "‎+49 800 7540001" + + "خدمة العملاء هنا لمساعدتك." + + "اللغات: الألمانية والإنجليزية والتركية\nساعات العمل:""\n""الاثنين إلى السبت: من الساعة 7 صباحًا حتى 10 مساءً""\n(فيما عد العطلات الرسمية)""\nالاتصال مجاني." + + "إذا كان لديك أي استفسارات متعلقة بصحتك، فيُرجى التواصل مع طبيبك الممارس العام أو الخط الساخن لخدمة الطوارئ الطبية، هاتف ‎116 117." + + "رجل يرتدي سماعة رأس أثناء إجراء اتصال." + + "الأسئلة المتكررة" + + "الأسئلة المتكررة. سيتم إعادة توجيهك إلى موقع ويب خارجي." + + "الإخطارات القانونية" + + "هاتف ذكي تظهر على شاشته نصوص بخط كبير وبجوارها ميزان يرمز إلى الإشعارات القانونية." + + "technical_en.html" + + "بيان النشر" + + "تم النشر بواسطة" + + "(مسؤول بموجب المادة 5، الفقرة 1 من قانون الإعلام عن بُعد \"TMG\"، المادة 55، الفقرة 1 من عقد البث الإذاعي \"RStV\"، قانون حماية البيانات \"DS-GVO\"، القانون الاتحادي لحماية البيانات \"BDSG\")" + + "معهد روبرت كوخ""\n""نوردوفر 20""\n""13353 برلين""\n""\n""ممثلًا بواسطة رئيسه" + + "الاتصال" + + "البريد الإلكتروني: CoronaWarnApp@rki.de" + + "نموذج الاتصال" + + "Contact Form in ""English"" or ""German" + + "رقم تعريف ضريبة القيمة المضافة" + + "DE 165 893 430" + + "هاتف ذكي تظهر على شاشته نصوص بخط كبير وبجوارها رمز لقسم يمثل بيان النشر." + + + + + + "خطأ" + + "تعذر إنشاء اتصال (%1$d). يرجى المحاولة لاحقًا." + + "تعذر إنشاء اتصال. يرجى المحاولة لاحقًا." + + "الخلف" + + + "خطأ" + + "رمز الاستجابة السريعة (QR)/رقم المعاملة (TAN) غير صالح أو مستخدم بالفعل. يُرجى المحاولة مرة أخرى أو الاتصال بالخط الساخن الفني عبر معلومات التطبيق -> الخط الساخن الفني." + + "الخلف" + + + "خطأ" + + "تعذر إنشاء رقم المعاملة (TAN) للتقديم. يُرجى الاتصال بالخط الساخن الفني عبر معلومات التطبيق -> الخط الساخن الفني." + + "الخلف" + + + "خطأ" + + "رقم المعاملة (TAN) المُنشأ غير صالح للتقديم. الرجاء الاتصال بالخط الساخن الفني عبر معلومات التطبيق ← الخط الساخن الفني." + + "الخلف" + + + "الاختبار به أخطاء" + + "هناك مشكلة في تقييم اختبارك، حيث انتهت صلاحية رمز الاستجابة السريعة (QR)." + + "موافق" + + + + "تفويض الكاميرا مطلوب" + + "السماح للتطبيق باستخدام الكاميرا لمسح رمز الاستجابة السريعة (QR)." + + "سماح" + + "عدم السماح" + + + + "الوصول إلى الكاميرا لازم" + + "يُرجى فتح إعدادات النظام والسماح للتطبيق باستخدام الكاميرا لمسح رمز الاستجابة السريعة (QR)." + + "موافق" + + + + "رمز الاستجابة السريعة (QR) غير صالح" + + "رمز الاستجابة السريعة (QR) غير صالح أو تم تسجيله بالفعل على هاتف ذكي آخر. ستتلقى نتيجة الاختبار من مركز الاختبار أو المختبر بغض النظر عن صلاحية رمز الاستجابة السريعة (QR). إذا تمت إصابتك بمرض كوفيد-19، فسيتم إعلامك من قبل دائرة الصحة العامة." + + "يُرجى المحاولة مرة أخرى." + + "إلغاء" + + + "ضع رمز الاستجابة السريعة (QR) داخل الإطار." + + "ضع رمز الاستجابة السريعة (QR) داخل الإطار." + + + + "نتيجة الاختبار" + + "كيف يعمل ذلك:" + + "تمت إضافة الاختبار بنجاح" + + "تم تخزين اختبارك في تطبيق Corona-Warn-App." + + "نتيجة الاختبار غير متوفرة حتى الآن" + + "نتيجة اختبارك غير متوفرة حتى الآن." + + "تحديث" + + "حذف الاختبار" + + "نتيجة اختبارك" + + "لا تشير نتيجة المعمل لإصابتك بفيروس كورونا المستجد\n\nيُرجى حذف الاختبار من تطبيق Corona-Warn-App حتى تتمكن من حفظ رمز نتيجة اختبار جديد هنا عند الحاجة." + + "حذف الاختبار" + + "نتيجة اختبارك" + + "تم التحقق من إيجابية نتيجة اختبارك." + + "تحذير الآخرين" + + "شارِك معرفاتك العشوائية لآخر 14 يومًا لحماية الآخرين وكسر سلسلة العدوى." + + "التالي" + + "نتيجة اختبارك" + + "حدثت مشكلة أثناء تقييم اختبارك. يُرجى التواصل مع مركز الاختبار أو المعمل لمعرفة كيفية المتابعة.\n\nيُرجى حذف الاختبار من تطبيق Corona-Warn-App؛ حتى تتمكن من حفظ رمز اختبار جديد فيه، عند الحاجة." + + "حذف الاختبار" + + "تسجيل المخالطة مطلوب" + + "يُرجى تنشيط تسجيل المخالطة لتحذير أشخاص آخرين." + + "موافق" + + "يمكن مسح الاختبار ضوئيًا مرة واحدة فقط." + + "إذا قمت بحذف الاختبار، فلن تتمكن من استرجاع نتيجة الاختبار الخاصة بك. تتلقى نتيجة الاختبار الخاصة بك من مركز الاختبار أو المختبر، بغض النظر عن التطبيق. إذا تمت إصابتك بمرض كوفيد-19، فسيتم إعلامك من قبل دائرة الصحة العامة." + + "إزالة" + + "إلغاء" + + "فيروس كورونا المستجد إيجابي" + + "تم تشخيصك على أنك مصاب بفيروس كورونا المستجد." + + + + "إدخال رقم المعاملة (TAN)" + + "الرجاء إدخال رقم المعاملة (TAN) المكون من 10 أرقام والمقدم إليك." + + "التالي" + + "إدخال رقم المعاملة (TAN)" + + "رقم المعاملة (TAN) غير صالح. يرجى التحقق من إدخالك." + + "الإدخال غير صالح. يُرجى التحقق من إدخالك." + + + + "هل خضعت للاختبار؟" + + "هذه هي طريقة عمل تطبيق Corona-Warn-App" + + "حتى يعمل التطبيق جيدًا، نعتمد على دعم الأشخاص المصابين بمرض كوفيد-19 لنا.\n\nبما أنه لا يتم تبادل إلا المعرفات العشوائية المشفرة، ستظل هويتك غير معروفة. يمكنك الآن المتابعة كما يلي:" + + "التالي" + + "يتم إرسال تشخيص اختبار إيجابي مشفرًا إلى النظام؛ مما سينتج عنه تحذير المستخدمين الآخرين." + + + "إذا كنت مصابًا بمرض كوفيد-19، يمكنك إشعار الآخرين." + "إذا تم منحك رقم المعاملة (TAN) لتشخيص إيجابي، يمكنك استخدامه لتسجيل الاختبار." + "إذا لم يكن لديك رقم المعاملة (TAN)، يمكنك طلبه بالهاتف." + + + "هل خضعت للاختبار؟ هذه هي طريقة عمل تطبيق Corona-Warn-App" + + + + "تحديد" + + "ما المعلومات التي لديك؟" + + "مستند برمز الاستجابة السريعة (QR)" + + "سجِّل اختبارك من خلال مسح رمز الاستجابة السريعة (QR) لمستند اختبارك." + + "إقرار الموافقة" + + "بالنقر على \"قبول\"، فإنك توافق على السماح للتطبيق بالاستعلام عن حالة فحص فيروس كورونا خاصتك، وعرض الحالة في التطبيق. تتاح لك هذه الخاصية عندما تتلقى رمز استجابة سريعة (QR) وتوافق على السماح بإرسال نتيجة الاختبار إلى نظام السيرفر الخاص بالتطبيق. بمجرد أن يودع معمل الفحوصات نتيجة اختبارك على السيرفر، يمكنك الاطلاع على النتيجة في التطبيق. وإذا كنت قد نشطت خاصية الإشعارات، فستتلقى إشعارًا أيضًا خارج التطبيق بظهور نتيجة الاختبار. نتيجة الاختبار نفسها لا تظهر إلا في التطبيق لأسباب متعلقة بحماية البيانات. يمكنك إلغاء هذه الموافقة في أي وقت عن طريق حذف تسجيل الاختبار في التطبيق. عند إلغاء الموافقة، تظل مشروعية المعالجة حتى تاريخ الإلغاء قائمةً. تجد المزيد من المعلومات تحت بند القائمة \"معلومات خصوصية البيانات\"." + + "قبول" + + "عدم القبول" + + "رقم المعاملة (TAN)" + + "سجِّل اختبارك بإدخال رقم المعاملة (TAN) يدويًا." + + "طلب رقم المعاملة (TAN)" + + "يُرجى الاتصال بنا إذا كنت مصابًا بمرض كوفيد-19." + + "ما المعلومات التي لديك؟" + + + + "تحذير الآخرين" + + "يُرجى مساعدتنا جميعًا!" + + "يمكنك لاحقًا التأكد من مشاركة تطبيق Corona-Warn-App لمعرفاتك العشوائية في آخر 14 يومًا مع الآخرين. ومن خلال القيام بذلك، يمكنك تحذير الأشخاص الآخرين والمساعدة على كسر سلسلة العدوى.\n\nستظل هويتك مجهولة حيث يتم إرسال المعرفات العشوائية غير الشخصية فقط." + + "خصوصية البيانات" + + "بالنقر على \"قبول\"، فإنك توافق على أن يرسل التطبيق نتيجة اختبارك الإيجابية مع أرقام تعريفك العشوائية لآخر 14 يومًا إلى نظام سيرفر التطبيق، حتى يتسنى إخطار غيرك من مستخدمي التطبيق المنشطين لخاصية تسجيل المخالطة أوتوماتيكيًا باحتمالية تعرضهم لخطر العدوى. لا تتضمن المعرفات العشوائية المتداولة أية بيانات تسمح بثغرات يمكن التعرف من خلالها على هويتك أو شخصك.\n\nنشر نتيجة اختبارك عبر التطبيق خطوة اختيارية. إذا لم تنشر نتيجة اختبارك، لن تترتب عليك أية أضرار؛ لأنه لا يمكن لأحد سواك معرفة أو مراقبة ما إذا كنت تستخدم التطبيق، وكيف تستخدمه، وما إذا كنت نشرت إصابتك بالعدوى أم لا.\n\nيمكنك إلغاء موافقتك في أي وقت عن طريق حذف التطبيق. عند إلغاء الموافقة، تظل مشروعية المعالجة بدايةً من الموافقة حتى تاريخ الإلغاء قائمةً. تجد المزيد من المعلومات تحت بند القائمة \"معلومات خصوصية البيانات\"." + + "التالي" + + "جهاز يرسل تشخيص اختبار إيجابي مشفرًا إلى النظام." + + + + + "شكرًا لك" + + "لقد قدمت مساهمة قيمة. بفضل دعمك، ستيم تحذير أشخاص آخرين ويمكنهم التصرف بالشكل الصحيح." + + "يُرجى ملاحظة ما يلي:" + + "أنت معدٍ." + + "يُرجى عزل نفسك عن الآخرين." + + "معلومات أخرى:" + + + "فترة الحجر الصحي عادة ما تكون 14 يومًا. الرجاء ملاحظة أعراضك ومراقبة مدى تطورها." + "ستطالبك دائرة الصحة العامة بإنشاء قائمة بالأشخاص الذين تواصلت معهم. يجب أن يتضمن ذلك كل الأشخاص الذين تواصلت معهم عن قرب (أقل من مترين، محادثة وجهًا لوجه) لمدة تزيد عن 15 دقيقة في اليومين السابقين لتطور الأعراض." + "الرجاء التفكير بصفة خاصة في الأشخاص الذين لن يتم إشعارهم مباشرة من خلال التطبيق نظرًا لعدم امتلاكهم هاتف ذكي أو عدم قيامهم بتثبيت التطبيق." + "قد تظل معديًا حتى إن لم تعد تشعر بأي أعراض وكنت تشعر بأنك بحالة جيدة." + + + "تم" + + "جميع الأشخاص في المجموعة سعداء لمشاركة شخص ما نتيجة اختباره." + + + + "طلب رقم المعاملة (TAN)" + + "كيف يعمل ذلك:" + + "يُرجى الاحتفاظ بنتيجة اختبارك (إن وُجدت) وجهز رقم هاتفك لطلب رقم المعاملة (TAN).\n\nيُدعم الخط الساخن خدمات Tess Relay للأشخاص الذين يُعانون من ضعف السمع.(الترجمة بين اللغة الألمانية المكتوبة ولغة الإشارة) للاتصال بالخط الساخن للهاتف. يمكنك تنزيل البرنامج من Google Play." + + "اتصال" + + "إدخال رقم المعاملة (TAN)" + + "اتصل بالخط الساخن واطلب رقم المعاملة (TAN):" + + "‎+49 800 7540002" + + "‎+49 800 7540002" + + "سجِّل الاختبار بإدخال رقم المعاملة (TAN) في التطبيق." + + "اللغات\nالألمانية والإنجليزية والتركية\n\nساعات العمل:\nالاثنين إلى الأحد: 24 ساعة\n\nالاتصال مجاني." + + + "اتصل بالخط الساخن واطلب رقم المعاملة (TAN)" + + "في الخطوة الأولى، اتصل بالخط الساخن واطلب رقم المعاملة (TAN). يمكنك الاتصال بالخط الساخن على ‎+49 800 7540002. مواعيد العمل من الاثنين إلى الجمعة من الثامنة صباحًا إلى 10 مساءً ويومي السبت والأحد من العاشرة صباحًا إلى العاشرة مساءً. الاتصال مجاني." + + "في الخطوة التالية، قم بتسجيل اختبارك باستخدام رقم المعاملة (TAN) في التطبيق." + + + + "جار استرجاع البيانات..." + + "هل خضعت للاختبار؟" + + "النتيجة غير متوفرة حتى الآن" + + "نتيجتك متوفرة" + + "تشخيص إيجابي" + + "الاختبار غير صالح" + + "تشخيص سلبي" + + "جار تحديث نتيجتك" + + "ساعِد على كسر سلسلة العدوى من خلال إشعار الآخرين." + + "لم يتم إجراء تقييم اختبارك حتى الآن." + + "تعذر تقييم اختبارك." + + "تم تشخيصك على أنك إيجابي بخصوص بفيروس كورونا المستجد." + + "تم تشخيصك على أنك سلبي بخصوص بفيروس كورونا المستجد." + + "معرفة المزيد والمساعدة" + + "عرض الاختبار" + + "يُرجى ملاحظة ما يلي:" + + "أنت معدٍ. اعزل نفسك عن الأشخاص الآخرين." + + "ستتواصل معك دائرة الصحة العامة خلال الأيام القليلة القادمة بالهاتف أو بخطاب." + + "شارِك معرفاتك العشوائية حتى يمكن تحذير الآخرين." + + + "تشخيصك:" + + "فيروس كورونا المستجد" + + "تاريخ التسجيل %s" + + "سلبي" + + "إيجابي" + + "التقييم غير ممكن" + + "النتيجة غير متوفرة حتى الآن" + + "معلومات أخرى:" + + + "هل لا تزال تشعر بتوعك؟ إذا كنت تشعر بتوعك شديد و/أو تفاقمت أعراضك، فالرجاء الاتصال بطبيبك الممارس العام." + "ابقَ في المنزل حتى تشعر بأنك بصحة جيدة مرة أخرى. إذا أُصبت بفيروس كورونا (فيروس كورونا المستجد) مع ضعفك نتيجة عدوى أخرى، فقد يؤدي ذلك إلى مرض خطير." + "لا تذهب إلى عملك إذا كنت مريضًا لتضمن عدم تعريض الآخرين للخطر. إذا ازدادت الأعراض سوءًا، قد تحتاج للخضوع لاختبار فيروس كورونا المستجد مرة أخرى." + + + + + "عودة إلى الصفحة السابقة" + + "زر المتابعة" + + "مشاركة" + + "القائمة" + + "زر" + + "الصورة" + + + + "أنت غير متصل بالإنترنت." + + "ليس لديك ذاكرة فارغة كافية." + + "حدث خطأ خلال الاتصال بواجهة Google" + + "لا يمكنك القيام بهذا الإجراء. يُرجى الاتصال بالخط الساخن." + + "تم تثبيت تطبيق Corona-Warn-App بشكل صحيح؛ لكن خدمة \"إشعارات المخالطة لمرض كوفيد-19\" غير متوفرة على نظام تشغيل هاتفك الذكي؛ وهذا يعني أنه لا يمكنك استخدام التطبيق. لمزيد من المعلومات، يرجى الاطلاع على صفحة الأسئلة المتكررة لدينا على: https://www.coronawarn.app/en/faq/" + + "يعمل تطبيق Corona-Warn-App بشكل صحيح؛ لكن لا يمكن تحديث مستوى الخطر الحالي. يظل تسجيل المخالطة نشطًا، ويعمل بشكل صحيح. لمزيد من المعلومات، يرجى الاطلاع على صفحة الأسئلة المتكررة لدينا على: https://www.coronawarn.app/en/faq/" + + + + "حدث خطأ ما." + + "السبب" + + "موافق" + + "التفاصيل" + + "حدث خطأ غير معروف." + + + + "Lorem Ipsum" + + "Test API" + + "Test Risk Level" + + "Test Notification" + + "Android API Test(Manual Test)" + + "Start (Broadcast/Receive Bluetooth)" + + "Get Exposure keys (my keys history from api)" + + "Share my keys via Email" + + "Submit Exposure Key" + + "Show QR Code" + + "Submit keys to Server" + + "Scan Exposure Key" + + "Last 3 Hours Mode" + + "Check Exposure Summary" + + "Exposure summary" + + "Days since last exposure: %1$s" + + "Attenuation Durations in Minutes: %1$s" + + "Summation Risk Score: %1$s" + + "Matched key count: %1$s" + + "Maximum risk score %1$s" + + "My keys (count: %1$d)" + + "Other key" + + "Calculate Risk Level" + + \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/values-bg/strings.xml b/Corona-Warn-App/src/main/res/values-bg/strings.xml index 3dc01d7eea8..eb6b2895c47 100644 --- a/Corona-Warn-App/src/main/res/values-bg/strings.xml +++ b/Corona-Warn-App/src/main/res/values-bg/strings.xml @@ -163,6 +163,8 @@ "Актуализирано: %1$s" "Ежедневно актуализиране" + + "Бележка: Моля, отваряйте приложението всеки ден, за да актуализирате своя статус на риск." "Актуализиране" @@ -274,7 +276,7 @@ "Излагания на риск" - "Контакти с по-голяма продължителност и близост до лица, диагностицирани с COVID-19." + "Продължителни и близки контакти с лица, диагностицирани с COVID-19." "Известия за излагане на риск" @@ -303,7 +305,7 @@ "Ако имате въпроси относно симптомите, възможностите за тестване или самоизолацията, се обърнете към:" - "Мийте ръцете си редовно." + "Мийте редовно ръцете си със сапун в продължение на 20 сек." "Носете маска при контакт с други хора." @@ -403,11 +405,13 @@ "Как да активирате регистрирането на излагания на риск" - "За да установите дали за Вас съществува риск от заразяване, трябва да активирате функцията за регистриране на излагания на риск." + "За да установите дали сте застрашени от заразяване, трябва да активирате функцията за регистриране на излагания на риск." "Регистрирането на излагания на риск се извършва с помощта на Bluetooth връзка, при която Вашето устройство получава криптираните случайни ИД кодове на други потребители и изпраща до техните устройства Вашите случайни ИД кодове. Функцията може да бъде дезактивирана по всяко време." "Криптираните случайни ИД кодове предават само информация за дата, продължителност и близост на контакта с други лица (посредством силата на сигнала). Лични данни от типа на име, адрес и местоположение не се записват и идентифицирането на лицата е невъзможно." + + "Информация за приложението на опростен и жестомимичен език." "Поверителност" @@ -564,7 +568,7 @@ "Промяна на Вашия риск от заразяване" - "Статус на Вашия тест за COVID-19" + "Наличие на резултат от Ваш тест за COVID-19" "Към настройките за устройството" @@ -687,7 +691,11 @@ "Контакт" - "Имейл: CoronaWarnApp@rki.de""\n""Телефон: +49 30 18754 5100" + "Имейл: CoronaWarnApp@rki.de" + + "Формуляр за контакт" + + "Contact Form in ""English"" or ""German" "Идентификационен номер за ДДС" @@ -757,9 +765,9 @@ - "Неправилен QR код" + "Невалиден QR код" - "QR кодът е неправилен. Моля, опитайте отново по-късно." + "QR кодът е невалиден или вече е регистриран на друг смартфон. Ще получите резултата си от център за тестване или лаборатория, независимо от валидността на QR кода. Ако Ви бъде поставена диагноза COVID-19, службата за обществено осигуряване ще Ви уведоми за това." "Моля, опитайте отново." @@ -772,7 +780,7 @@ - "Резултат от теста" + "Резултат от тест" "Как работи:" @@ -806,7 +814,7 @@ "Резултатът от Вашия тест" - "Възникна проблем при определянето на резултата от Вашия тест. Моля, свържете се с местната служба за обществено здравеопазване (Gesundheitsamt), за да получите информация какво трябва да направите.\n\nМоля, изтрийте теста от Вашето Corona-Warn-App приложение, за да можете да запазите нов код на тест, ако е необходимо." + "Възникна проблем при определянето на резултата от Вашия тест. Моля, свържете се със съответния център за тестване или лаборатория, за да получите информация какво трябва да направите.\n\nМоля, изтрийте теста от Вашето Corona-Warn-App приложение, за да можете да запазите нов код на тест, ако е необходимо." "Изтриване на тест" @@ -816,9 +824,9 @@ "OK" - "Да се изтрие ли тестът?" + "Тестът може да се сканира само веднъж." - "Тестът ще бъде изтрит безвъзвратно от приложението Corona-Warn-App и няма да може да бъде добавен отново. Действието не може да бъде отменено." + "Ако изтриете теста, повече няма да можете да извлечете данните за резултата си. Ще получите резултата си от център за тестване или лаборатория, независимо от приложението. Ако Ви бъде поставена диагноза COVID-19, службата за обществено осигуряване ще Ви уведоми за това." "Изтриване" @@ -938,11 +946,11 @@ "Как работи:" - "За да заявите ТАН код, подгответе резултата от своя тест (ако е наличен) и телефонния си номер." + "За да заявите ТАН код, подгответе резултата от своя тест (ако е наличен) и телефонния си номер.\n\nЛицата със слухови нарушения могат да използват релейните услуги Tess (за превод между писмен немски и жестомимичен език), за да се обаждат на горещата телефонна линия. Може да изтеглите приложението от Google Play." "Обаждане" - "Въведете ТАН код" + "Въвеждане на ТАН" "Обадете се на горещата линия и поискайте ТАН код:" diff --git a/Corona-Warn-App/src/main/res/values-en/strings.xml b/Corona-Warn-App/src/main/res/values-en/strings.xml index f3e1893f53c..0a8eca2492b 100644 --- a/Corona-Warn-App/src/main/res/values-en/strings.xml +++ b/Corona-Warn-App/src/main/res/values-en/strings.xml @@ -163,6 +163,8 @@ "Updated: %1$s" "Updated daily" + + "Note: Please open the app daily to update your risk status." "Update" @@ -274,7 +276,7 @@ "Exposures" - "Encounters over a longer duration and close proximity to people diagnosed with COVID-19." + "Encounters over an extended period and in close proximity to a person diagnosed with COVID-19." "Exposure Notification" @@ -303,7 +305,7 @@ "If you have questions about symptoms, testing availability, or self-isolation, please contact one of the following:" - "Wash your hands regularly." + "Wash your hands regularly, with soap, for 20 seconds." "Wear a face mask when you encounter other people." @@ -408,6 +410,8 @@ "Exposure logging works by your device receiving, via Bluetooth, encrypted random IDs of other users and passing your own random ID to their devices. This feature can be deactivated at any time." "The encrypted random IDs only pass information about date, duration and proximity (using signal strength) to other people. Personal data such as name, address, location is never recorded. Individuals cannot be identified." + + "App Information in Simplified Language and Sign Language" "Declaration of Consent" @@ -687,7 +691,11 @@ "Contact" - "E-Mail: CoronaWarnApp@rki.de""\n""Telephone: +49 30 18754 5100" + "E-mail: CoronaWarnApp@rki.de" + + "Contact Form" + + "Contact Form in ""English"" or ""German" "VAT identification number" @@ -757,9 +765,9 @@ - "Incorrect QR code" + "QR code is invalid" - "The QR code is not correct. Please try again." + "The QR code is invalid or has been registered on another smartphone already. You will receive your test result from the test center or laboratory regardless of the validity of the QR code. If you are diagnosed with COVID-19, you will be notified by the public health authority." "Please try again." @@ -806,7 +814,7 @@ "Your Test Result" - "There was a problem evaluating your test. Please contact the public health authority to find out how to proceed.\n\nPlease delete the test from your Corona-Warn-App so that you will be able to save a new test code there, if necessary." + "There was a problem evaluating your test. Please contact the test center or laboratory involved to find out how to proceed.\n\nPlease delete the test from your Corona-Warn-App so that you will be able to save a new test code there, if necessary." "Delete Test" @@ -816,9 +824,9 @@ "OK" - "Delete the test?" + "The test can only be scanned once." - "The test will be permanently deleted from the Corona-Warn-App and cannot be added again. This procedure cannot be undone." + "If you delete the test, you can no longer retrieve your test result. You receive your test result from the test center or laboratory, independently of the app. If you are diagnosed with COVID-19, you will be notified by the public health authority." "Remove" @@ -938,7 +946,7 @@ "How this works:" - "Please keep your test result (if available) and your phone number ready to request a TAN." + "Please keep your test result (if available) and your phone number ready to request a TAN.\n\nPeople with hearing impairments can use Tess Relay services (interpreting between German written language and sign language) to contact the phone hotline. You can download the software from Google Play." "Call" diff --git a/Corona-Warn-App/src/main/res/values-pl/strings.xml b/Corona-Warn-App/src/main/res/values-pl/strings.xml index 6d81f73a792..98d60042f62 100644 --- a/Corona-Warn-App/src/main/res/values-pl/strings.xml +++ b/Corona-Warn-App/src/main/res/values-pl/strings.xml @@ -149,9 +149,9 @@ "%1$s narażenie" "%1$s narażenia" "Brak narażenia do tej pory" - "%1$s narażenia/narażeń" - "%1$s narażenia/narażeń" - "%1$s narażenia/narażeń" + "%1$s narażenia" + "%1$s narażenia" + "%1$s narażeń" "Rejestrowanie narażenia było aktywne przez %1$s z ostatnich 14 dni." @@ -163,6 +163,8 @@ "Zaktualizowano: %1$s" "Aktualizowane codziennie" + + "Uwaga: Proszę codziennie otwierać aplikację, aby zaktualizować swój status ryzyka." "Aktualizuj" @@ -178,16 +180,16 @@ "%1$s dzień od ostatniego kontaktu" - "%1$s dni od ostatniego kontaktu" + "%1$s dnia od ostatniego kontaktu" "%1$s dni od ostatniego kontaktu" "%1$s dni od ostatniego kontaktu" "%1$s dni od ostatniego kontaktu" "%1$s dni od ostatniego kontaktu" - "Nieznane ryzyko" + "Ryzyko nieznane" - "Ponieważ nie aktywowałeś(-aś) rejestrowania narażenia na wystarczająco długi czas, nie mogliśmy obliczyć Twojego ryzyka zakażenia." + "Nie możemy jeszcze podać ryzyka zakażenia, ponieważ nie mamy jeszcze wystarczającej ilości danych." "Rejestrowanie narażenia zatrzymane" @@ -256,21 +258,21 @@ "Niskie ryzyko" - "Nieznane ryzyko" + "Ryzyko nieznane" "Powiadamianie innych użytkowników" - "Inną kluczową funkcją jest rejestracja testu i pobranie wyniku. W przypadku zdiagnozowania u Ciebie COVID-19 będziesz mieć możliwość powiadomienia innych i przerwania łańcucha zakażeń." + "Kolejną kluczową funkcją jest rejestracja testu i pobranie wyniku. W przypadku zdiagnozowania u Ciebie COVID-19 będziesz mieć możliwość powiadomienia innych i przerwania łańcucha zakażeń." "Definicja terminów:" "Dziennik narażeń" - "Lista otrzymanych i tymczasowych losowych identyfikatorów zapisanych tymczasowo w pamięci masowej systemu operacyjnego. Lista ta jest odczytywana podczas sprawdzania narażeń. Wszystkie losowe identyfikatory są automatycznie usuwane po 14 dniach." + "Lista otrzymanych i tymczasowych losowych identyfikatorów zapisanych tymczasowo w pamięci masowej systemu operacyjnego. Aplikacja korzysta z listy podczas sprawdzania narażeń. Wszystkie losowe identyfikatory są automatycznie usuwane po 14 dniach." "Sprawdzanie narażenia" - "Dane dziennika narażeń są pobierane i synchronizowane ze zgłoszonymi zakażeniami innych użytkowników. Sprawdzanie narażeń jest wykonywane automatycznie mniej więcej co dwie godziny." + "Odczytanie danych dziennika narażeń i porównanie ze zgłoszonymi zakażeniami innych użytkowników. Sprawdzanie narażeń jest wykonywane automatycznie mniej więcej co dwie godziny." "Narażenia" @@ -278,11 +280,11 @@ "Powiadomienie o narażeniu" - "Wyświetlanie narażeń w Corona-Warn-App." + "Wyświetlenie narażeń w Corona-Warn-App." "Losowe identyfikatory" - "Identyfikatory losowe są kombinacją cyfr i liter generowanych losowo. Są one wymieniane pomiędzy urządzeniami znajdującymi się w bliskiej odległości od siebie. Identyfikatorów losowych nie można przypisać do konkretnej osoby. Są one automatycznie usuwane po 14 dniach. Osoby, u których zdiagnozowano COVID-19, mogą zdecydować się na udostępnienie swoich losowych identyfikatorów z ostatnich 14 dni innym użytkownikom aplikacji." + "Losowe identyfikatory są kombinacją cyfr i liter generowanych losowo. Są one wymieniane pomiędzy urządzeniami znajdującymi się w bliskiej odległości od siebie. Losowych identyfikatorów nie można przypisać do konkretnej osoby. Są one automatycznie usuwane po 14 dniach. Osoby, u których zdiagnozowano COVID-19, mogą zdecydować się na udostępnienie swoich losowych identyfikatorów z ostatnich 14 dni innym użytkownikom aplikacji." "Smartfon wyświetla różne treści oznaczone numerami od 1 do 3." @@ -303,9 +305,9 @@ "W przypadku pytań dotyczących objawów, możliwości wykonania testu lub samoizolacji skontaktuj się z jednym z poniższych miejsc:" - "Regularnie myj ręce." + "Regularnie myj ręce mydłem przez 20 sekund." - "Załóż maseczkę na twarz, mając kontakt z innymi osobami." + "Załóż maseczkę, jeśli zamierzasz kontaktować się fizycznie z innymi osobami." "Zachowuj odległość co najmniej 1,5 metra od innych osób." @@ -313,7 +315,7 @@ "Twój lekarz rodzinny" - "Pogotowie ratunkowe pod numerem telefonu 116117" + "Lekarz dyżurny pod numerem telefonu 116117" "Organ ds. zdrowia publicznego" @@ -331,7 +333,7 @@ "Sposób, w jaki obliczane jest Twoje ryzyko" - "Ponieważ nie aktywowałeś(-aś) rejestrowania narażenia na wystarczająco długi czas, nie mogliśmy obliczyć Twojego ryzyka zakażenia." + "Nie możemy jeszcze podać ryzyka zakażenia, ponieważ nie mamy jeszcze wystarczającej ilości danych." "Rejestrowanie narażenia nie mogło zostać zaktualizowane przez okres dłuższy niż 24 godziny." @@ -361,7 +363,7 @@ "Informacje o funkcjonalności rejestrowania narażenia" - "Więcej informacji znajduje się na naszej stronie Często zadawane pytania." + "Więcej informacji znajduje się na naszej stronie „Często zadawane pytania”." "Działanie funkcji rejestrowania narażenia polega na odbieraniu przez Twoje urządzenie za pomocą Bluetooth zaszyfrowanych, losowych identyfikatorów innych użytkowników i przekazywaniu Twoich własnych, losowych identyfikatorów do ich urządzeń. Funkcję tę można wyłączyć w dowolnym momencie." - "Zaszyfrowane losowe identyfikatory przekazują innym osobom jedynie informacje o dacie, czasie trwania i bliskości (przy wykorzystaniu mocy sygnału). Dane osobowe, takie jak nazwisko, adres, lokalizacja, nie są nigdy rejestrowane. Ustalenie tożsamości osób nie jest możliwe." + "Identyfikatory przekazują w sposób zaszyfrowany wyłącznie informacje o dacie, czasie trwania i odległości (przy wykorzystaniu mocy sygnału) od innych użytkowników aplikacji. Dane osobowe, takie jak nazwisko, adres, lokalizacja, nie są nigdy rejestrowane. Ustalenie tożsamości osób nie jest możliwe." + + "Informacja o aplikacji w języku uproszczonym i języku migowym" - "Oświadczenia o wyrażeniu zgody" + "Oświadczenie o wyrażeniu zgody" "To find out whether you have been in contact with an infected person and whether there is a risk that you yourself have been infected, you need to enable the App’s exposure logging feature. By tapping on the “Enable” button, you agree to the enabling of the App’s exposure logging feature and the associated data processing.""\n""\n""In order to use the App’s exposure logging feature, you will have to enable the COVID-19 Exposure Logging functionality provided by Google on your smartphone and grant the Corona-Warn-App permission to use this.""\n""\n""When exposure logging is enabled, your smartphone continuously generates and transmits random IDs via Bluetooth, which other Android or Apple smartphones in your vicinity can receive if exposure logging is also enabled on them. Your smartphone, in turn, receives the random IDs of the other smartphones. Your own random IDs and those received from other smartphones are recorded in the exposure log and stored there for 14 days.""\n""\n""To identify your risk of infection, the App loads a list – several times a day or on request – of the random IDs of all users who have told the App that they have been infected with the coronavirus. This list is then compared with the random IDs stored in the exposure log. If the App detects that you may have been in contact with an infected user, it will inform you of this and tell you that there is a risk that you are also infected. In this case, the App is also given access to other data stored in your smartphone’s exposure log (date, duration and Bluetooth signal strength of the contact).""\n""\n""The Bluetooth signal strength is used to derive the physical distance (the stronger the signal, the smaller the distance). The App then analyses this information in order to assess your likelihood of having been infected with the coronavirus and to give you recommendations for what to do next. This analysis is only performed locally on your smartphone. Apart from you, nobody (not even the RKI) will know whether you have been in contact with an infected person and what risk has been identified for you.""\n""\n""To withdraw your consent to the exposure logging feature, you can disable the feature using the toggle switch in the App or delete the App. If you decide to use the exposure logging feature again, you can toggle the feature back on or reinstall the App. If you disable the exposure logging feature, the App will no longer check whether you have been in contact with an infected user. If you also wish to stop your device sending and receiving random IDs, you will need to disable COVID-19 Exposure Logging in your smartphone settings. Please note that your own random IDs and those received from other smartphones which are stored in the exposure log will not be deleted in the App. You can only permanently delete the data stored in the exposure log in your smartphone settings.""\n""\n""The App’s privacy notice (including an explanation of the data processing carried out for the exposure logging feature) can be found in the menu under “Data Privacy Information”." @@ -459,7 +463,7 @@ "… zgłoś ten fakt w Corona-Warn-App. Udostępnianie wyników testu jest dobrowolne i bezpieczne. Zrób to ze względu na zdrowie innych osób." - "Twoje powiadomienie jest szyfrowane w bezpieczny sposób i przetwarzane na bezpiecznym serwerze. Osoby, których zaszyfrowane losowe identyfikatory zostały zgromadzone przez Twoje urządzenie, otrzymają teraz ostrzeżenie wraz z informacją na temat dalszych kroków postępowania." + "Twoje powiadomienie jest szyfrowane w bezpieczny sposób i przetwarzane na bezpiecznym serwerze. Osoby, których zaszyfrowane losowe identyfikatory zostały zgromadzone przez Twoje urządzenie, otrzymają wtedy ostrzeżenie wraz z informacją na temat dalszych kroków postępowania." "Zaszyfrowana diagnoza zakażenia jest przesyłana do systemu, który będzie teraz ostrzegał innych użytkowników." @@ -520,7 +524,7 @@ "Otwórz ustawienia urządzenia" - "Otwórz połączenie z Internetem" + "Połącz z Internetem" "Rejestrowanie narażenia wymaga połączenia z Internetem w celu obliczenia narażeń. Włącz WIFI lub dane mobilne w ustawieniach swojego urządzenia." @@ -528,7 +532,7 @@ "Rejestrowanie narażenia jest aktywne od jednego dnia.\nSprawdzanie narażeń jest wiarygodne tylko wtedy, gdy rejestrowanie narażenia jest aktywowane na stałe." - "Rejestrowanie narażenia jest aktywne od %1$s dni.\nSprawdzanie narażeń jest wiarygodne tylko wtedy, gdy rejestracja narażenia jest aktywowana na stałe." + "Rejestrowanie narażenia jest aktywne od %1$s dnia.\nSprawdzanie narażeń jest wiarygodne tylko wtedy, gdy rejestracja narażenia jest aktywowana na stałe." "Rejestrowanie narażenia jest aktywne od %1$s dni.\nSprawdzanie narażeń jest wiarygodne tylko wtedy, gdy rejestrowanie narażenia jest aktywowane na stałe." "Rejestrowanie narażenia jest aktywne od %1$s dni.\nSprawdzanie narażeń jest wiarygodne tylko wtedy, gdy rejestracja narażenia jest aktywowana na stałe." "Rejestrowanie narażenia jest aktywne od %1$s dni.\nSprawdzanie narażeń jest wiarygodne tylko wtedy, gdy rejestracja narażenia jest aktywowana na stałe." @@ -663,7 +667,7 @@ "Języki: niemiecki, angielski, turecki\nGodziny pracy:""\n""od poniedziałku do soboty: 7:00 - 22:00""\n(za wyjątkiem świąt państwowych)""\nPołączenie jest bezpłatne." - "W razie jakichkolwiek pytań związanych ze zdrowiem skontaktuj się z lekarzem rodzinnym lub pogotowiem ratunkowym pod numerem: 116 117." + "W razie jakichkolwiek pytań związanych ze zdrowiem skontaktuj się z lekarzem rodzinnym lub lekarzem dyżurnym pod numerem: 116 117." "Mężczyzna korzystający z zestawu słuchawkowego prowadzi rozmowę telefoniczną." @@ -687,7 +691,11 @@ "Kontakt" - "E-mail: CoronaWarnApp@rki.de""\n""Telefon: +49 30 18754 5100" + "E-mail: CoronaWarnApp@rki.de" + + "Formularz kontaktowy" + + "Contact Form in ""English"" or ""German" "Numer identyfikacyjny VAT" @@ -759,7 +767,7 @@ "Niepoprawny kod QR" - "Kod QR jest nie poprawny. Spróbuj ponownie." + "Kod QR jest niepoprawny lub został już zarejestrowany na innym smartfonie. Otrzymasz swój wynik testu z ośrodka wykonującego testy lub laboratorium niezależnie od ważności kodu QR. W przypadku zdiagnozowania u Ciebie COVID-19 otrzymasz powiadomienie z organu ds. zdrowia publicznego." "Spróbuj ponownie." @@ -776,7 +784,7 @@ "Jak to działa:" - "Test został dodany" + "Test został dodany." "Twój test został zapisany w Corona-Warn-App." @@ -806,7 +814,7 @@ "Twój wynik testu" - "Wystąpił problem z ustaleniem wyniku Twojego testu. Skontaktuj się z organem ds. zdrowia publicznego, aby dowiedzieć się, jak dalej postępować.\n\nUsuń test z aplikacji Corona-Warn-App, aby w razie potrzeby móc zapisać w niej kod nowego testu." + "Wystąpił problem z ustaleniem wyniku Twojego testu. Skontaktuj się z ośrodkiem wykonującym testy lub odpowiednim laboratorium, aby dowiedzieć się, jak dalej postępować.\n\nUsuń test z aplikacji Corona-Warn-App, aby w razie potrzeby móc zapisać w niej kod nowego testu." "Usuń test" @@ -816,9 +824,9 @@ "OK" - "Usunąć test?" + "Test może być zeskanowany tylko raz." - "Test zostanie trwale usunięty z Corona-Warn-App i jego ponownie dodanie nie będzie możliwe. Tej procedury nie można cofnąć." + "Jeśli usuniesz test, nie będziesz mieć możliwości pobrania wyniku swojego testu. Otrzymasz wynik swojego testu z ośrodka wykonującego testy lub laboratorium, niezależnie od aplikacji. W przypadku zdiagnozowania u Ciebie COVID-19 otrzymasz powiadomienie z organu ds. zdrowia publicznego." "Usuń" @@ -872,7 +880,7 @@ "Zarejestruj test poprzez zeskanowanie kodu QR dokumentu testu." - "Oświadczenia o wyrażeniu zgody" + "Oświadczenie o wyrażeniu zgody" "By tapping on “Accept”, you consent to the App querying the status of your coronavirus test and displaying it in the App. This feature is available to you if you have received a QR code and have consented to your test result being transmitted to the App’s server system. As soon as the testing lab has stored your test result on the server, you will be able to see the result in the App. If you have enabled notifications, you will also receive a notification outside the App telling you that your test result has been received. However, for privacy reasons, the test result itself will only be displayed in the App. You can withdraw this consent at any time by deleting your test registration in the App. Withdrawing your consent will not affect the lawfulness of processing before its withdrawal. Further information can be found in the menu under “Data Privacy Information”." @@ -917,13 +925,13 @@ "Możesz zarażać." - "Izoluj się od innych osób." + "Zastosuj izolację / unikaj kontaktu fizycznego z innymi osobami." "Inne informacje:" "Okres kwarantanny wynosi zazwyczaj 14 dni. Obserwuj swoje objawy i monitoruj ich rozwój." - "Zostaniesz poproszony(-a) przez organ ds. zdrowia publicznego o stworzenie listy osób, z którymi miałeś(-aś) kontakt. Powinna ona obejmować wszystkie osoby, z którymi miałeś(-aś) bliski kontakt (w odległości mniejszej niż 2 metry, rozmowa twarzą w twarz) przez ponad 15 minut w ciągu dwóch dni przed wystąpieniem objawów." + "Zostaniesz poproszony(-a) przez organ ds. zdrowia publicznego o stworzenie listy osób, z którymi miałeś(-aś) kontakt. Powinna ona obejmować wszystkie osoby, z którymi miałeś(-aś) bliski kontakt (rozmowa twarzą w twarz w odległości mniejszej niż 2 metry) przez ponad 15 minut w ciągu dwóch dni przed wystąpieniem objawów." "Zwróć szczególną uwagę na osoby, które nie zostaną powiadomione bezpośrednio przez aplikację, ponieważ nie posiadają smartfonów lub nie zainstalowały aplikacji." "Nawet jeśli nie masz już żadnych objawów i znów czujesz się dobrze, możesz nadal zarażać." @@ -938,7 +946,7 @@ "Jak to działa:" - "Przygotuj wynik testu (jeśli jest dostępny) oraz numer telefonu, pod którym można poprosić o numer TAN." + "Przygotuj wynik testu (jeśli jest dostępny) oraz numer telefonu, aby poprosić o numer TAN.\n\nOsoby niedosłyszące mogą skorzystać z usług Tess Relay (tłumaczenie z pisanego języka niemieckiego na język migowy i odwrotnie) w celu skontaktowania się z infolinią. To oprogramowanie można pobrać z Google Play." "Zadzwoń" @@ -975,7 +983,7 @@ "Nieprawidłowy test" - "Diagnoza braku zakażenia" + "Diagnoza: brak zakażenia" "Twój wynik jest aktualizowany" @@ -995,7 +1003,7 @@ "Uwaga:" - "Możesz zarażać. Izoluj się od innych osób." + "Możesz zarażać. Zastosuj izolację / unikaj kontaktu fizycznego z innymi osobami." "Organ ds. zdrowia publicznego skontaktuje się z Tobą w ciągu kilku najbliższych dni telefonicznie lub listownie." @@ -1052,9 +1060,9 @@ "Nie możesz wykonać tej czynności. Skontaktuj się z infolinią." - "Twoja aplikacja Corona-Warn-App jest poprawnie zainstalowana, ale usługa „Powiadomienia o narażeniu na COVID-19” nie jest dostępna w systemie operacyjnym Twojego smartfona. Oznacza to, że nie możesz korzystać z aplikacji Corona-Warn-App. Więcej informacji znajduje się na naszej stronie Często zadawane pytania: https://www.coronawarn.app/en/faq/." + "Twoja aplikacja Corona-Warn-App jest poprawnie zainstalowana, ale usługa „Powiadomienia o narażeniu na COVID-19” nie jest dostępna w systemie operacyjnym Twojego smartfona. Oznacza to, że nie możesz korzystać z aplikacji Corona-Warn-App. Więcej informacji znajduje się na naszej stronie „Często zadawane pytania”: https://www.coronawarn.app/en/faq/." - "Aplikacja Corona-Warn-App działa prawidłowo, ale nie możemy zaaktualizować Twojego aktualnego statusu ryzyka. Rejestrowanie narażenia pozostaje aktywne i działa prawidłowo. Więcej informacji można znaleźć na naszej stronie Często zadawane pytania: https://www.coronawarn.app/en/faq/" + "Aplikacja Corona-Warn-App działa prawidłowo, ale nie możemy zaaktualizować Twojego aktualnego statusu ryzyka. Rejestrowanie narażenia pozostaje aktywne i działa prawidłowo. Więcej informacji można znaleźć na naszej stronie „Często zadawane pytania”: https://www.coronawarn.app/en/faq/" "Actualizată zilnic" + + "Rețineți: Deschideți aplicația zilnic pentru a actualiza starea riscului dvs." "Actualizare" @@ -274,7 +276,7 @@ "Expuneri" - "Întâlniri de o durată mai lungă și în strânsă proximitate cu persoane diagnosticate cu COVID-19." + "Întâlniri de o durată lungă și în strânsă proximitate cu o persoană diagnosticată cu COVID-19." "Notificarea de expunere" @@ -303,7 +305,7 @@ "Dacă aveți întrebări despre simptome, disponibilitatea testării sau autoizolare, contactați:" - "Spălați-vă frecvent pe mâini." + "Spălați-vă frecvent pe mâini cu săpun timp de 20 de secunde." "Purtați o mască facială când întâlniți alte persoane." @@ -408,6 +410,8 @@ "Înregistrarea în jurnal a expunerilor funcționează astfel: dispozitivul dvs. primește prin Bluetooth ID-uri aleatorii criptate ale altor utilizatori și transmite propriul dvs. ID aleatoriu către dispozitivele acestora. Această caracteristică poate fi oricând dezactivată." "ID-urile aleatorii criptate transmit informații doar despre dată, durată și proximitatea față de alte persoane (utilizând intensitatea semnalului). Datele personale, precum numele, adresa, locația nu sunt înregistrate niciodată. Nu se pot identifica persoanele individuale." + + "Informații despre aplicație în limbaj simplificat și în limbajul semnelor" "Declarație de consimțământ" @@ -427,7 +431,7 @@ "Ați dezactivat actualizările în fundal pentru aplicația Corona-Warn. Activați actualizările în fundal pentru a utiliza înregistrarea automată în jurnal a expunerilor. Dacă nu activați actualizările în fundal, puteți porni doar manual din aplicație înregistrarea în jurnal a expunerilor. Puteți activa actualizările în fundal pentru aplicație din setările dispozitivului dvs." - "Deschideți Setările dispozitivului" + "Deschideți setările dispozitivului" "Porniți manual înregistrarea în jurnal a expunerilor" @@ -451,7 +455,7 @@ "Locația dvs. nu poate fi accesată. Google și/sau Android necesită acces la locația dispozitivului dvs. pentru a utiliza Bluetooth-ul." - "Deschideți Setările dispozitivului" + "Deschideți setările dispozitivului" "Pagina de înregistrare 4 din 5: Dacă sunteți diagnosticat cu COVID-19…" @@ -510,21 +514,21 @@ "Activați Bluetooth-ul" - "Bluetooth-ul trebuie să fie pornit pentru ca înregistrarea în jurnal a expunerilor să funcționeze. Porniți Bluetooth-ul în setările dispozitivului." + "Bluetooth-ul trebuie să fie activat pentru ca înregistrarea în jurnal a expunerilor să funcționeze. Activați Bluetooth-ul în setările dispozitivului." - "Deschideți Setările dispozitivului" + "Deschideți setările dispozitivului" "Permiteți accesul la locație" "Locația dvs. nu poate fi accesată. Google și/sau Android necesită acces la locația dispozitivului dvs. pentru a utiliza Bluetooth-ul." - "Deschideți Setările dispozitivului" + "Deschideți setările dispozitivului" "Deschideți conexiunea la internet" "Înregistrarea în jurnal a expunerilor necesită conexiunea la internet pentru a calcula expunerile. Porniți rețeaua Wi-Fi sau datele mobile din setările dispozitivului dvs." - "Deschideți Setările dispozitivului" + "Deschideți setările dispozitivului" "Înregistrarea în jurnal a expunerilor a fost activă o zi.\nO verificare a expunerii poate fi de încredere doar dacă înregistrarea în jurnal a expunerilor este activată permanent." @@ -566,7 +570,7 @@ "Starea testului COVID-19" - "Deschideți Setările dispozitivului" + "Deschideți setările dispozitivului" "O femeie primește o notificare de la Corona-Warn-App." @@ -610,7 +614,7 @@ "Dacă doriți să dezactivați activitatea în fundal cu prioritate, vă rugăm să faceți acest lucru din setările dispozitivului." - "Deschideți Setările dispozitivului" + "Deschideți setările dispozitivului" "Dezactivați activitatea în fundal cu prioritate" @@ -687,7 +691,11 @@ "Contact" - "E-mail: CoronaWarnApp@rki.de""\n""Telefon: +49 30 18754 5100" + "E-mail: CoronaWarnApp@rki.de" + + "Formular de contact" + + "Contact Form in ""English"" or ""German" "Număr de înregistrare în scop de TVA" @@ -757,9 +765,9 @@ - "Cod QR incorect" + "Cod QR nevalabil" - "Codul QR nu este corect. Reîncercați." + "Codul QR este nevalabil sau a fost deja înregistrat pe un alt smartphone. Veți primi rezultatul testului dvs. de la centrul sau laboratorul de testare, indiferent de valabilitatea codului QR. Dacă sunteți diagnosticat cu COVID-19, veți fi notificat de autoritatea de sănătate publică." "Reîncercați." @@ -806,7 +814,7 @@ "Rezultatul testului dvs." - "A apărut o problemă la evaluarea testului dvs. Contactați direcția de sănătate publică pentru a afla pașii următori.\n\nȘtergeți testul din Corona-Warn-App pentru a salva un nou cod de test aici dacă este necesar." + "A apărut o problemă la evaluarea testului dvs. Contactați centrul sau laboratorul de testare implicat pentru a afla pașii următori.\n\nȘtergeți testul din Corona-Warn-App pentru a salva un nou cod de test aici, dacă este necesar." "Ștergere test" @@ -816,9 +824,9 @@ "OK" - "Ștergeți testul?" + "Testul poate fi scanat o singură dată." - "Testul va fi șters definitiv din Corona-Warn-App și nu mai poate fi adăugat din nou. Această procedură nu poate fi anulată." + "Dacă ștergeți testul, nu veți mai putea afla rezultatul testului dvs. Primiți rezultatul testului dvs. de la centrul sau laboratorul de testare, independent de aplicație. Dacă sunteți diagnosticat cu COVID-19, veți fi notificat de autoritatea de sănătate publică." "Eliminare" @@ -938,7 +946,7 @@ "Cum funcționează:" - "Vă rugăm să aveți la îndemână rezultatul testului (dacă este disponibil) și numărul de telefon pentru a solicita un cod TAN." + "Vă rugăm să aveți la îndemână rezultatul testului (dacă este disponibil) și numărul dvs. de telefon pentru a solicita un cod TAN.\n\nPersoanele cu deficiențe de auz pot utiliza serviciile Tess Relay (interpretare între limba germană scrisă și limbajul semnelor) pentru a contacta hotline-ul telefonic. Puteți descărca software-ul din Google Play." "Apelare" diff --git a/Corona-Warn-App/src/main/res/values-ru/strings.xml b/Corona-Warn-App/src/main/res/values-ru/strings.xml new file mode 100644 index 00000000000..97d4ef1ae66 --- /dev/null +++ b/Corona-Warn-App/src/main/res/values-ru/strings.xml @@ -0,0 +1,1131 @@ + + + + + + "shared_preferences_cwa" + + "preference_onboarding_completed" + + "preference_onboarding_completed_timestamp" + + "preference_background_check_done" + + "preference_reset_app" + + "preference_only_wifi" + + "preference_tracing" + + "preference_timestamp_diagnosis_keys_fetch" + + "preference_timestamp_manual_diagnosis_keys_retrieval" + + "preference_m_string_google_api_token" + + "preference_notifications_enabled" + + "preference_notifications_risk_enabled" + + "preference_notifications_test_enabled" + + "preference_background_job_enabled" + + "preference_mobile_data_enabled" + + "preference_registration_token" + + "preference_device_pairing_successful_time" + + "preference_initial_tracing_activation_time" + + "preference_initial_result_received_time" + + "preference_risk_level_score" + + "preference_risk_level_score_successful" + + "preference_timestamp_risk_level_calculation" + + "preference_test_guid" + + "preference_is_allowed_to_submit_diagnosis_keys" + + "preference_auth_code" + + "preference_database_password" + + "preference_total_non_active_tracing" + + "preference_last_non_active_tracing_timestamp" + + "preference_number_successful_submissions" + + "preference_teletan" + + "preference_last_three_hours_from_server" + + "preference_polling_test_result_started" + + "preference_test_result_notification" + + "preference_risk_days_explanation_shown" + + + + + "Назад" + + "Дальше" + + "Меню" + + "Закрыть" + + "Приложение Corona-Warn-App" + + "Кнопка" + + + + + "Обзор" + + "Информация о приложении" + + "Настройки" + + + + "de.rki.coronawarnapp.notification.exposureNotificationChannelId" + + "1" + + "Приложение Corona-Warn-App" + + "Уведомления от Corona-Warn-App" + + "Приложение Corona-Warn-App" + + "Есть новые сообщения от приложения Corona-Warn-App." + + + + + "Доступно обновление" + + "Для дальнейшего использования приложения Corona-Warn-App установите последнее обновление." + + "Обновить" + + + + + "Пока нет контактов" + + + "%1$s контакт" + "%1$s контакта" + "Пока нет контактов" + "%1$s контакта" + "%1$s контакта" + "%1$s контактов" + + + + "%1$s контакт" + "%1$s контакта" + "Пока нет контактов" + "%1$s контакта" + "%1$s контакта" + "%1$s контактов" + + + "Определение риска активно %1$s из 14 прошедших дней." + + "Определение риска постоянно активно." + + "Контакты еще не проверены." + + "Обновлено: %1$s" + + "Обновляется ежедневно" + + "Примечание: ежедневно открывайте приложение для обновления своего статуса риска." + + "Обновить" + + "Обновление через %1$s" + + "Активировать определение риска" + + "Активируйте определение риска, чтобы оценить свой статус риска сегодня." + + "Низкий риск" + + "Повышенный риск" + + + "%1$s день с последнего контакта" + "%1$s дня с последнего контакта" + "%1$s дней с последнего контакта" + "%1$s дня с последнего контакта" + "%1$s дня с последнего контакта" + "%1$s дней с последнего контакта" + + + "Неизвестный риск" + + "С момента активации определения риска не прошло достаточно времени, чтобы рассчитать Ваш риск заражения." + + "Определение риска остановлено" + + "Последнее определение риска:""\n""%1$s" + + "Определение риска невозможно" + + "Не удается обновить определение риска более 24 часов." + + "Ваш статус риска не обновлялся более 48 часов: обновите свой статус риска." + + "Проверка выполняется..." + + "Текущие данные выгружаются и проверяются. Это может занять несколько минут." + + + + + "Часто задаваемые вопросы" + + "Здесь Вы найдете ответы на часто задаваемые вопросы о приложении Corona-Warn-App. Вы будете переадресованы на внешний веб-сайт." + + "https://www.bundesregierung.de/corona-warn-app-faq-englisch" + + "Здесь Вы найдете ответы на часто задаваемые вопросы о приложении Corona-Warn-App. Вы будете переадресованы на внешний веб-сайт." + + + + + "Поделиться Corona-Warn-App" + + "Давайте победим коронавирус вместе" + + "Чем больше пользователей приложения, тем быстрее мы сможем остановить передачу инфекции. Предложите своим родным и друзьям выгрузить приложение." + + "Отправить ссылку для выгрузки" + + "Победим коронавирус вместе""\n""Я участвую, а ты?""\n""https://www.corona-warn-app.de""\n""\n" + + "Человек делится приложением Corona-Warn-App с четырьмя другими людьми." + + + + + "Обзор" + + "Обзор" + + "Определение риска" + + "Определение риска - одна из трех основных функций приложения. Когда она активирована, регистрируются контакты с устройствами других людей. Вам не нужно ничего делать." + + "Риск заражения" + + "Если Вы в течение последних 14 дней контактировали с лицом с положительным тестом на COVID-19, приложение рассчитает Ваш риск заражения. Для этого оцениваются продолжительность и близость контакта." + + "Статус риска может иметь следующие значения:" + + "Повышенный риск" + + "Низкий риск" + + "Неизвестный риск" + + "Уведомление других пользователей" + + "Еще одна из основных функций - регистрация Вашего теста и получение результата. Если у Вас положительный текст на COVID-19, Вы можете уведомить других людей и остановить передачу инфекции." + + "Терминология:" + + "Журнал контактов" + + "Список полученных и случайных идентификаторов, временно сохраненных в хранилище операционной системы. Этот список считывается при проверке контактов. Все случайные идентификаторы автоматически удаляются через 14 дней." + + "Проверка контактов" + + "Данные журнала контактов вызываются и синхронизируются с зарегистрированными заражениями других пользователей. Проверка контактов выполняется автоматически с интервалом около двух часов." + + "Контакты" + + "Продолжительные и близкие контакты с лицом, у которого диагностирован COVID-19." + + "Уведомление о контакте" + + "Отображение уведомлений в приложении Corona-Warn-App." + + "Случайные идентификаторы" + + "Случайные идентификаторы представляют собой комбинации цифр и букв, генерируемые произвольно. Они передаются между устройствами в непосредственной близости. По случайным идентификаторам нельзя отследить конкретных лиц. Они автоматически удаляются через 14 дней. Лица с положительным тестом на COVID-19 могут по желанию поделиться своими случайными идентификаторами за срок до 14 дней с другими пользователями приложения." + + "На смартфоне отображается разное содержимое, пронумерованное от 1 до 3." + + "Главная страница приложения Corona-Warn-App" + + + + + "Ваш статус риска" + + "Инструкции" + + "Вот что Вам нужно сделать" + + "По возможности возвращайтесь домой и оставайтесь дома." + + "Контакты для вопросов о симптомах, доступности тестирования и самоизоляции:" + + "Регулярно мойте руки с мылом не менее 20 секунд." + + "Носите защитную маску при контактах с другими людьми." + + "Соблюдайте расстояние не менее 1,5 м от других людей." + + "Во время чихания и кашля прикрывайте рот сгибом локтя или салфеткой." + + "Ваш врач общей практики" + + "Скорая помощь (тел. 116117)" + + "Местный орган здравоохранения" + + "Риск заражения" + + "Период нахождения в системе" + + "Этот период включен в расчет." + + "Ваш риск заражения можно рассчитать только для периодов активного определения риска, поэтому функция определения должна быть постоянно активной." + + "Определение риска охватывает последние 14 дней. В течение этого времени функция определения на Вашем устройстве была активна %1$s дн. Приложение автоматически удаляет старые журналы, как только они теряют значение для предотвращения заражения." + + "Вот как был рассчитан Ваш риск" + + "Вот как рассчитывается Ваш риск" + + "С момента активации определения риска не прошло достаточно времени, чтобы рассчитать Ваш риск заражения." + + "Не удается обновить определение риска более 24 часов." + + "У Вас низкий риск заражения, поскольку не зарегистрировано контактов с лицами с положительным тестом на COVID-19 или контакты были кратковременными и на большом расстоянии." + + + "У Вас повышенный риск заражения, поскольку %1$s день назад у Вас был продолжительный близкий контакт минимум с одним лицом с положительным тестом на COVID-19." + "У Вас повышенный риск заражения, поскольку %1$s дня назад у Вас был продолжительный близкий контакт минимум с одним лицом с положительным тестом на COVID-19." + "У Вас повышенный риск заражения, поскольку %1$s дней назад у Вас был продолжительный близкий контакт минимум с одним лицом с положительным тестом на COVID-19." + "У Вас повышенный риск заражения, поскольку %1$s дня назад у Вас был продолжительный близкий контакт минимум с одним лицом с положительным тестом на COVID-19." + "У Вас повышенный риск заражения, поскольку %1$s дня назад у Вас был продолжительный близкий контакт минимум с одним лицом с положительным тестом на COVID-19." + "У Вас повышенный риск заражения, поскольку %1$s дней назад у Вас был продолжительный близкий контакт минимум с одним лицом с положительным тестом на COVID-19." + + + "Риск заражения рассчитывается на Вашем устройстве по локальным данным определения риска (продолжительности и близости). Данные риска заражения не показываются и не передаются другим лицам." + + "Поэтому Ваш риск заражения был оценен как низкий. Риск заражения рассчитывается на Вашем устройстве по локальным данным определения риска (продолжительности и близости). Данные риска заражения не показываются и не передаются другим лицам." + + "Поэтому Ваш риск заражения был оценен как повышенный. Риск заражения рассчитывается по локальным данным определения риска (продолжительности и близости) на Вашем устройстве. Данные риска заражения не показываются и не передаются другим лицам. По возвращении домой избегайте близкого контакта с членами вашей семьи." + + @string/risk_card_button_update + + @string/risk_card_button_enable_tracing + + "Ваш статус риска" + + + "Информация о функции определения риска" + + "Подробнее см. на странице часто задаваемых вопросов." + + + + + "Не активировать" + + "Активировать" + + "Отменить" + + "Дальше" + + "Давайте начнем" + + "Назад" + + "Страница адаптации 1 из 5. Победим коронавирус вместе" + + "Давайте победим коронавирус вместе" + + "Более надежная защита для Вас и для всех нас. Приложение Corona-Warn-App поможет быстрее остановить передачу инфекции." + + "Сделайте из Вашего устройства систему предупреждения о коронавирусе. Просматривайте Ваш статус риска и определяйте, были ли у Вас близкие контакты с лицами с положительным тестом на COVID-19 за последние 14 дней." + + "Контакты людей регистрируются в приложении путем обмена зашифрованными случайными идентификаторами между устройствами без доступа к каким-либо персональным данным." + + "Группа людей использует свои смартфоны в городе." + + "Страница адаптации 2 из 5. Конфиденциальность данных. Далее идет подробный текст. Для продолжения нажмите кнопку внизу экрана." + + "Конфиденциальность данных" + + + "На смартфоне одной женщины установлено приложение Corona-Warn-App. Значок замка на фоне щита указывает на шифрование данных." + + "Страница адаптации 3 из 5. Активация определения риска" + + "Как активировать определение риска" + + "Чтобы узнать, есть ли у Вас риск заражения, нужно активировать функцию определения риска." + + "Для определения риска Ваше устройство получает по Bluetooth зашифрованные случайные идентификаторы других пользователей и передает Ваш случайный идентификатор на их устройства. Эту функцию можно деактивировать в любое время." + + "Зашифрованные случайные идентификаторы передают другим людям только информацию о дате, продолжительности и близости (по силе сигнала) контакта. Персональные данные, такие как имя, адрес или местоположение, никогда не регистрируются. Идентификация лица невозможна." + + "Информация о приложении простым языком и на языке жестов" + + "Заявление о согласии" + + "Чтобы узнать, был ли у Вас контакт с инфицированным лицом и есть ли риск заражения, Вам необходимо активировать в Приложении функцию \"Определение риска\". Вы даете свое согласие на активацию определения риска и соответствующую обработку данных, нажав \"Активировать определение риска\".""\n""\n""Для использования функции определения риска Вам также необходимо активировать на своем смартфоне разработанную компанией Google функцию записи контактов „COVID-19: отслеживание контактов“ и разрешить допуск к мобильному приложению Corona-Warn-App.""\n""\n""При активации функции записи контактов Ваш смартфон автоматически генерирует и посылает через Bluetooth случайные коды, которые могут быть получены другими смартфонами Apple и Android вблизи от Вас, в которых также активирована функция записи контактов. В свою очередь, Ваш смартфон получает случайные коды других смартфонов. Ваши собственные и полученные с других смартфонов случайные коды хранятся в течение 14 дней в журнале контактов функции «COVID-19: отслеживание контактов».""\n""\n""Для определения Вашего риска заражения Приложение загружает в течение дня, неоднократно или по запросу, список случайных кодов всех пользователей, которые сообщили через Приложение о своем подтвержденном диагнозе. Затем данный список сравнивается со списком случайных кодов, сохраненных в журнале контактов функции записи контактов. Если при этом Приложение зафиксирует возможный контакт с инфицированным пользователем, Приложение уведомит Вас о контакте с инфицированным лицом и о риске заражения. В этом случае Приложение получит доступ к остальным данным, сохраненным в журнале контактов функции «COVID-19: отслеживание контактов» Вашего смартфона (дата, длительность контакта и сила сигнала Bluetooth).""\n""\n""Сила сигнала Bluetooth помогает определить расстояние (чем сильнее сигнал, тем меньше расстояние). Приложение обрабатывает эти данные для того, чтобы оценить для Вас риск заражения коронавирусом и предоставить Вам рекомендации для дальнейших действий. Данная обработка данных осуществляется исключительно локально на Вашем смартфоне. Никто (в том числе ИРК), кроме Вас, не узнает о том, находились ли Вы в контакте с инфицированным лицом и каким был результат оценки риска заражения.""\n""\n""Чтобы отозвать свое согласие на определение риска, Вы можете деактивировать эту функцию в Приложении, нажав на ползунок, или удалить Приложение. Если Вы хотите снова использовать определение степени риска, активируйте заново ползунок или снова установите Приложение. При отключении функции определения риска Приложение больше не проверяет, был ли у Вас контакт с инфицированным пользователем. Чтобы остановить отправку и получение случайных кодов, Вам необходимо отключить в настройках Вашего смартфона функцию «COVID-19: отслеживание контактов». Обратите внимание, что Ваши и сторонние случайные коды, сохраненные в журнале контактов функции «COVID-19: отслеживание контактов» не удаляются в Приложении. Сохраненные данные в журнале контактов функции «COVID-19: отслеживание контактов» Вы можете удалить на долгосрочный период только в настройках смартфона.""\n""\n""Политика конфиденциальности Приложения (в том числе информация об обработке данных для определения степени риска) доступна в пункте меню «Информация о конфиденциальности данных»." + + "Активировать определение риска" + + "Авторизация" + + "Это означает, что приложение Corona-Warn-App не может отправлять и получать уведомления о Вашем статусе риска заражения COVID-19. Вы можете деактивировать эту функцию в любое время." + + "Не активировать" + + "Назад" + + "Обновление в фоновом режиме отключено" + + "Вы отключили обновление приложения Corona-Warn-App в фоновом режиме. Включите обновление в фоновом режиме для использования автоматического определения риска. При отключенном обновлении в фоновом режиме определение риска можно запустить только вручную. Активировать обновление в фоновом режиме можно в настройках своего устройства." + + "Открыть настройки устройства" + + "Запустить определение риска вручную" + + "Разрешить приоритетную фоновую активность" + + "Включите приоритетную фоновую активность, чтобы разрешить приложению влюбое время определять Ваш статус риска в фоновом режиме (рекомендуется). Такая настройка отключает оптимизацию расхода заряда аккумулятора только для приложения Corona-Warn-App. Мы не предполагаем, что это может существенно снизить расход Вашего аккумулятора.\n\nПри отказе от данной настройки рекомендуем Вам открывать приложении вручную хотя бы раз в 24 часа." + + "Разрешить" + + "Не разрешать" + + "Приоритетная фоновая активность отключена" + + "Обратите внимание, что при отключении приоритетной фоновой активности Вам нужно раз в 24 часа открывать приложение вручную, чтобы определить свой статус риска.\n\nВы в любое время можете включить приоритетную фоновую активность в настройках." + + "ОК" + + "Три человека активировали определение риска на своих устройствах, то есть их контакты друг с другом будут регистрироваться." + + "Разрешить доступ к местоположению" + + "Доступ к Вашему местоположению невозможен. Чтобы использовать Bluetooth, Google и/или Android требуется доступ к местоположению Вашего устройства." + + "Открыть настройки устройства" + + "Страница адаптации 4 из 5. Если у Вас положительный тест на COVID-19..." + + "Если у Вас положительный тест на COVID-19..." + + "…Укажите это в приложении Corona-Warn-App. Предоставление результата Вашего теста является добровольным и безопасным. Просим Вас об этом ради здоровья других людей." + + "Ваше уведомление шифруется для защиты и обрабатывается на безопасном сервере. Людям, от которых Ваше устройство получило зашифрованные случайные идентификаторы, отправляется предупреждение вместе с рекомендуемыми действиями." + + "Зашифрованная информация о положительном тесте передается в систему, и другим пользователям отправляются предупреждения." + + "Страница адаптации 5 из 5. Получение предупреждений и определение риска" + + "Получение предупреждений и определение риска" + + "Приложение может автоматически уведомлять о Вашем статусе риска и предупреждать о новых инфицированных людях среди Ваших контактов. Разрешите приложению уведомлять Вас." + + "Тогда Вы сможете самоизолироваться для защиты окружающих и узнать, где сдать тест." + + "Женщина получает уведомление от приложения Corona-Warn-App." + + + + + "Настройки" + + "Вкл." + + "Выкл." + + "Определение риска" + + "Вот как работает определение риска" + + "Разрешите генерацию и предоставление случайных идентификаторов COVID-19." + + "Определение риска активно" + + "Определение риска остановлено" + + "Сервисы определения местоположения отключены" + + "Чтобы определить наличие риска заражения включите функцию определения риска. Для идентификации риска Ваше устройство должно получать по Bluetooth зашифрованные случайные идентификаторы других пользователей и передавать Ваш случайный идентификатор на их устройства. Эту функцию можно в любое время отключить.""\n""\nЗашифрованные случайные идентификаторы передают другим людям только информацию о дате, продолжительности и близости (рассчитанной по силе сигнала) контакта. Персональные данные, например имя, адрес или местоположение, никогда не регистрируются. Персональная идентификация невозможна." + + "Активно" + + "Остановлено" + + "Ограничено" + + "Нет соединения с Интернетом" + + "Bluetooth выключен" + + "Включить Bluetooth" + + "Bluetooth нужно включить для регистрации контактов функцией определения риска. Включите Bluetooth в настройках вашего устройства." + + "Открыть настройки устройства" + + "Разрешить доступ к местоположению" + + "Доступ к Вашему местоположению невозможен. Чтобы использовать Bluetooth, Google и/или Android требуется доступ к местоположению Вашего устройства." + + "Открыть настройки устройства" + + "Установить соединение с Интернетом" + + "Для расчета контактов функцией определения риска требуется соединение с Интернетом. Включите Wi-Fi или мобильные данные в настройках устройства." + + "Открыть настройки устройства" + + + "Определение риска активно в течение %1$s дня.\nДля надежной проверки контактов функция определения риска должна быть активна всегда." + "Определение риска активно в течение %1$s дня.\nДля надежной проверки контактов функция определения риска должна быть активна всегда." + "Определение риска активно в течение %1$s дней.\nДля надежной проверки контактов функция определения риска должна быть активна всегда." + "Определение риска активно в течение %1$s дней.\nДля надежной проверки контактов функция определения риска должна быть активна всегда." + "Определение риска активно в течение %1$s дней.\nДля надежной проверки контактов функция определения риска должна быть активна всегда." + "Определение риска активно в течение %1$s дней.\nДля надежной проверки контактов функция определения риска должна быть активна всегда." + + + "Три человека активировали определение риска на своих устройствах, то есть их контакты друг с другом будут регистрироваться." + + "Человек деактивировал определение риска на своем смартфоне, то есть его контакты с двумя другими людьми не будут регистрироваться." + + "Человек выключил Bluetooth на своем смартфоне, то есть его контакты с двумя другими людьми не будут регистрироваться." + + + + "Человек отключил соединение с Интернетом на своем смартфоне, то есть его контакты с двумя другими людьми не будут регистрироваться." + + + "Уведомления" + + "Активировать уведомления о Вашем статусе риска заражения COVID-19?" + + "Уведомления деактивированы" + + "Разрешить автоматические уведомления о статусе риска заражения COVID-19" + + "Укажите уведомления, которые Вы хотите получать." + + "Чтобы активировать уведомления, нужно разрешить уведомления от приложения Corona-Warn-App в настройках Вашего устройства." + + "Активировать уведомления" + + "Уведомления" + + "Ваш риск заражения изменился" + + "Статус Вашего теста на COVID-19" + + "Открыть настройки устройства" + + "Женщина получает уведомление от приложения Corona-Warn-App." + + "Женщина деактивировала уведомления от приложения Corona-Warn-App." + + "Сбросить приложение" + + "Удалить все Ваши данные в приложении." + + "Действительно сбросить приложение?" + + "Вы больше не будете получать уведомления о контактах и не сможете предупреждать других пользователей." + + "Удалить журнал ""\n""контактов" + + "Журнал контактов удаляется отдельно в настройках Вашего устройства." + + "Сбросить приложение" + + "Отменить" + + "Рука держит смартфон, на котором отображается значок выполняемого сброса приложения." + + "Сбросить приложение" + + "Вы больше не будете получать уведомления о контактах и не сможете предупреждать других пользователей. Это действие нельзя отменить." + + "Отменить" + + "Сброс" + + "Приоритетная фоновая активность" + + "Разрешить автоматические обновления статуса риска" + + "Запускать Corona-Warn-App в фоновом режиме" + + "Приложение Corona-Warn-App всегда работает в фоновом режиме, если активировать приоритетную фоновую активность. Это позволяет приложению определять Ваш статус риска в любое время." + + + + "Чтобы отключить приоритетную фоновую активность, деактивируйте ее в нстройках устройства." + + "Открыть настройки устройства" + + "Отключить приоритетную фоновую активность" + + + + + "Информация о приложении" + + "Версия: %1s" + + "О приложении" + + "Давайте победим коронавирус вместе" + + "Институт Роберта Коха (РКИ) — это центральный федеральный институт Германии в области здравоохранения. По поручению федерального правительства РКИ выпустил приложение Corona-Warn-App. Приложение задумано как цифровое дополнение к уже принятым санитарным мерам: социальной дистанции, гигиене и ношению защитных масок." + + "Каждый пользователь приложения помогает отслеживать и останавливать передачу инфекции. Приложение регистрирует контакты с другими людьми локально на вашем устройстве. Вы получаете уведомления о контактах с людьми, которые впоследствии получили положительный результат теста на COVID-19. Ваши персональные данные и конфиденциальность надежно защищены." + + "Группа людей использует свои смартфоны в городе." + + "Конфиденциальность данных" + + "На смартфоне одной женщины установлено приложение Corona-Warn-App. Значок замка на фоне щита указывает на шифрование данных." + + "privacy_ru.html" + + "Условия использования" + + "Содержимое" + + "Рука держит смартфон с длинным текстом на экране. Рядом с текстом отображается галочка, символизирующая принятия условий использования." + + "terms_ru.html" + + "Горячая линия по техническим вопросам" + + "Чем мы можем Вам помочь?" + + "По техническим вопросам о приложении Corona-Warn-App обращайтесь на нашу горячую линию." + + "Горячая линия по техническим вопросам:" + + "+49 800 7540001" + + "+49 800 7540001" + + "Наша служба поддержки всегда готова помочь." + + "Языки: немецкий, английский, турецкий\nЧасы работы:""\n""пн-сб, 7:00-22:00""\n(кроме государственных праздников)""\nВсе звонки бесплатны." + + "По всем медицинским вопросам обращайтесь к вашему врачу общей практики или в скорую помощь по телефону: 116 117." + + "Человек совершает телефонный звонок с использованием гарнитуры." + + "Часто задаваемые вопросы" + + "Часто задаваемые вопросы. Вы будете переадресованы на внешний веб-сайт." + + "Правовые уведомления" + + "Рука держит смартфон с длинным текстом на экране. Рядом с текстом отображается значок весов, представляющий правовые уведомления." + + "technical_ru.html" + + "Правовая информация" + + "Опубликовано" + + "(ответственность согласно § 5 п. 1 TMG, § 55 п. 1 RStV, DS-GVO, BDSG)" + + "Институт Роберта Коха""\n""Nordufer 20""\n""13353 Berlin (Германия)""\n""\n""в лице его президента" + + "Контакты" + + "E-mail: CoronaWarnApp@rki.de" + + "Форма контакта" + + "Contact Form in ""English"" or ""German" + + "ИНН" + + "DE 165 893 430" + + "Рука держит смартфон с длинным текстом на экране. Рядом с текстом отображается значок параграфа, представляющий правовую информацию." + + + + + + "Ошибка" + + "Не удалось установить соединение (%1$d). Повторите попытку." + + "Не удалось установить соединение. Повторите попытку." + + "Назад" + + + "Ошибка" + + "QR-код/TAN недействителен или уже использовался. Повторите попытку или обратитесь на горячую линию по техническим вопросам по пути: Информация о приложении -> Горячая линия по техническим вопросам." + + "Назад" + + + "Ошибка" + + "Не удалось сгенерировать TAN для отправки. Обратитесь на горячую линию по техническим вопросам по пути: Информация о приложении -> Горячая линия по техническим вопросам." + + "Назад" + + + "Ошибка" + + "Сгенерированный TAN не действителен для отправки. Обратитесь на горячую линию по техническим вопросам, выбрав: Информация о приложении → Горячая линия по техническим вопросам." + + "Назад" + + + "В тесте есть ошибки" + + "Обнаружена проблема при анализе вашего теста. Ваш QR-код уже просрочен." + + "ОК" + + + + "Требуется разрешение на доступ к камере" + + "Разрешить приложению использовать камеру для сканирования QR-кода." + + "Разрешить" + + "Не разрешать" + + + + "Требуется доступ к камере" + + "Откройте системные настройки и разрешите приложению использовать камеру для сканирования QR-кода." + + "ОК" + + + + "Недействительный QR-код." + + "QR-код недействительный или уже зарегистрирован на другом смартфоне. Повторите попытку. Вы получите результат теста из центра тестирования или выполнившей тест лаборатории вне зависимости от действительности QR-кода. Если у вас диагностирован COVID-19, вы получите уведомление от соответствующего органа здравоохранения." + + "Повторите попытку." + + "Отменить" + + + "Наведите рамку на QR-код." + + "Наведите рамку на QR-код." + + + + "Результат теста" + + "Как это работает:" + + "Тест успешно добавлен." + + "Ваш тест сохранен в приложении Corona-Warn-App." + + "Результат теста еще не доступен" + + "Ваш результат теста еще не доступен." + + "Обновить" + + "Удалить тест" + + "Ваш результат теста" + + "Лабораторное исследование не показало инфицирования коронавирусом SARS-CoV-2.\n\nУдалите тест из приложения Corona-Warn-App, чтобы здесь можно было сохранить новый код теста." + + "Удалить тест" + + "Ваш результат теста" + + "Ваш результат теста положительный." + + "Предупреждение других людей" + + "Предоставьте ваши случайные идентификаторы за последние 14 дней, чтобы защитить других людей и остановить передачу инфекции." + + "Дальше" + + "Ваш результат теста" + + "При анализе вашего теста возникла проблема. Обратитесь в центр тестирования или выполнявшую тест лабораторию за дальнейшими рекомендациями.\n\nУдалите тест из приложения Corona-Warn-App, чтобы здесь можно было сохранить новый код теста." + + "Удалить тест" + + "Требуется определение риска" + + "Активируйте определение риска, чтобы предупредить других людей" + + "ОК" + + "Тест можно отсканировать только один раз." + + "После удаления теста вы не сможете запросить результат тестирования. Вы получите результат теста из центра тестирования или выполнившей тест лаборатории вне зависимости от приложения. Если у вас диагностирован COVID-19, вы получите уведомление от соответствующего органа здравоохранения. " + + "Удалить" + + "Отменить" + + "Положительный тест на SARS-CoV-2" + + "Ваш тест на вирус SARS-CoV-2 положительный." + + + + "Ввод TAN" + + "Введите полученный 10-значный TAN." + + "Дальше" + + "Ввод TAN" + + "Неверный TAN, проверьте введенные данные." + + "Неверно, проверьте введенные данные." + + + + "Вы сдали тест?" + + "Вот как работает приложение Corona-Warn-App" + + "Чтобы приложение работало, нам нужна поддержка людей с положительным тестом на COVID-19.\n\nПоскольку передаются только зашифрованные случайные идентификаторы, анонимность будет сохранена. Вы можете выполнить следующие действия:" + + "Дальше" + + "Зашифрованная информация о положительном тесте передается в систему, и другим пользователям отправляются предупреждения." + + + "Если у Вас положительный тест на COVID-19, Вы можете уведомить других людей." + "Если Вы получили TAN для положительного теста, можете зарегистрировать свой тест по нему." + "Если у Вас нет TAN, Вы можете запросить его по телефону." + + + "Вы сдали тест? Вот как работает приложение Corona-Warn-App" + + + + "Выбор" + + "Какая информация есть у Вас?" + + "Документ с QR-кодом" + + "Отсканируйте QR-код из документа, чтобы зарегистрировать Ваш тест." + + "Заявление о согласии" + + "Нажав на «Принимаю», Вы соглашаетесь с тем, что Приложение вправе узнавать о статусе Вашего теста на коронавирус и высвечивать его в Приложении. Эта функция доступна, если Вы получили QR-код и дали свое согласие на передачу результатов теста в серверную систему Приложения. После того как тестирующая лаборатория разместит результаты теста на сервере, Вы сможете увидеть их в Приложении. Если Вы активировали уведомления, Вас проинформируют о получении результатов теста и вне Приложения. Сам же результат теста, тем не менее, будет показан только в Приложении, в целях обеспечения конфиденциальности. Вы можете в любое время отозвать данное согласие, удалив в Приложении регистрирование теста. Отзыв согласия не затрагивает правомерность обработки, осуществлявшейся до него. Дальнейшую информацию см. в пункте меню «Информация о конфиденциальности данных»." + + "Принимаю" + + "Не принимаю" + + "TAN" + + "Чтобы зарегистрировать Ваш тест, введите TAN вручную." + + "Запросить TAN" + + "Позвоните нам, если у Вас положительный тест на COVID-19." + + "Какая информация есть у Вас?" + + + + "Предупреждение других людей" + + "Помогите всем нам!" + + "Далее Вы можете разрешить приложению Corona-Warn-App предоставление ваших случайных идентификаторов за последние 14 дней другим людям. Так Вы предупредите их и поможете остановить передачу инфекции.\n\nПоскольку передаются только обезличенные случайные идентификаторы, Ваша анонимность сохраняется." + + "Конфиденциальность данных" + + "Нажав на «Принимаю», Вы выражаете свое согласие на передачу Приложением положительного результата Вашего теста вместе с Вашими случайными кодами за последние 14 дней в серверную систему Приложения, чтобы другие пользователи Приложения с активированной функцией определения риска были автоматически проинформированы о том, что они могли быть подвержены риску заражения. Передаваемые случайные коды не содержат никакой информации, которая бы раскрыла Вашу личность.\n\nПередача Вашего результата теста через Приложение является добровольной. Если Вы не передадите результат своего теста, никакого наказания не последует. Ввиду того, что невозможно проследить и проконтролировать, пользуетесь ли Вы Приложением и как Вы это делаете, никто, кроме Вас, не будет знать, передали ли Вы информацию об инфицировании.\n\nВы можете в любое время отозвать свое согласие, удалив Приложение. Отзыв согласия не затрагивает правомерность обработки, осуществлявшейся до момента отзыва. Дальнейшую информацию см. в пункте меню «Информация о конфиденциальности данных»." + + "Дальше" + + "Устройство передает зашифрованную информацию о положительном тесте в систему." + + + + + "Спасибо!" + + "Ваш вклад очень ценен. Благодарим за поддержку. Теперь другие люди получат предупреждение и смогут принять необходимые меры." + + "Внимание!" + + "Вы заразны." + + "Изолируйтесь от других людей." + + "Дополнительная информация:" + + + "Карантин обычно длится 14 дней. Наблюдайте за симптомами и их развитием." + "Ваш местный орган здравоохранения попросит Вас составить список людей, с которыми Вы контактировали. Вам нужно указать всех людей, с которыми у Вас были близкие контакты (личное общение на расстоянии менее 2 м) дольше 15 мин в последние два дня до появления у Вас симптомов." + "Особенно важно вспомнить людей, которые не будут уведомлены приложением, так как у них нет установленного приложения или даже смартфона." + "Даже если у Вас больше нет симптомов и Вы чувствуете себя хорошо, Вы еще можете быть заразны." + + + "Готово" + + "Группа людей радуется, потому что кто-то поделился результатом теста." + + + + "Запросить TAN" + + "Как это работает:" + + "Для запроса TAN просим Вас подготовить результат теста (если есть) и Ваш номер телефона.\n\nЧтобы обратиться на горячую линию по телефону, слабослышащие могут использовать услуги Tess Relay (перевод с немецкого письменного языка на язык жестов и обратно). ПО можно выгрузить с Google Play." + + "Позвонить" + + "Ввести TAN" + + "Позвоните на горячую линию и запросите TAN:" + + "+49 800 7540002" + + "+49 800 7540002" + + "Чтобы зарегистрировать тест, введите TAN в приложении." + + "Языки: \nнемецкий, английский, турецкий\n\nЧасы работы:\nпн-вс, круглосуточно\n\nВсе звонки бесплатны." + + + "Позвонить на горячую линию и запросить TAN" + + "Первый шаг - это звонок на горячую линию для запроса TAN. Телефон горячей линии: +49 800 7540002. Она работает с 8:00 до 22:00 с понедельника по пятницу и с 10:00 до 22:00 в субботу и воскресенье. Все звонки бесплатны." + + "Второй шаг - регистрация Вашего теста в приложении по полученному TAN." + + + + "Данные вызываются..." + + "Вы сдали тест?" + + "Ваш результат еще не доступен" + + "Ваш результат доступен" + + "Положительный тест" + + "Недействительный тест" + + "Отрицательный тест" + + "Ваш результат обновляется" + + "Уведомьте других людей, чтобы остановить передачу инфекции." + + "Анализ вашего теста еще не завершен." + + "Не удалось проанализировать ваш тест." + + "Ваш тест на SARS-CoV-2 положительный." + + "Ваш тест на SARS-CoV-2 отрицательный." + + "Узнать больше и помочь" + + "Просмотреть тест" + + "Внимание!" + + "Вы заразны. Изолируйтесь от других людей." + + "Ваш местный орган здравоохранения свяжется с Вами в ближайшие дни по телефону или почте." + + "Поделитесь Вашими случайными идентификаторами, чтобы предупредить других людей." + + + "Ваш диагноз:" + + "SARS-CoV-2" + + "Зарегистрировано %s" + + "Отрицательный" + + "Положительный" + + "Анализ невозможен" + + "Ваш результат пока не доступен" + + "Дополнительная информация:" + + + "Все еще плохо себя чувствуете? Если Вам плохо и/или симптомы ухудшились, обратитесь к Вашему врачу общей практики." + "Оставайтесь дома до выздоровления. Заражение коронавирусом (SARS-CoV-2) в ослабленном состоянии из-за другой инфекции может привести к серьезным осложнениям." + "Не ходите на работу, если Вы плохо себя чувствуете, чтобы не ставить под угрозу здоровье других людей. Если симптомы ухудшились, сдайте тест на SARS-CoV-2." + + + + + "На предыдущую страницу" + + "Кнопка \"Продолжить\"" + + "Поделиться" + + "Меню" + + "Кнопка" + + "Изображение" + + + + "Нет соединения с Интернетом." + + "Недостаточно свободного места в памяти." + + "Ошибка связи с интерфейсом Google" + + "Невозможно выполнить это действие. Обратитесь на горячую линию." + + "Приложение Corona-Warn-App правильно установлено, но сервис уведомления о контактах с лицами, инфицированными COVID-19 недоступен в операционной системе Вашего смартфона. Это означает, что Вы не можете использовать Corona-Warn-App. Подробнее см. на странице часто задаваемых вопросов: https://www.coronawarn.app/en/faq/" + + "Приложение Corona-Warn-App выполняется корректно, но мы не можем обновить Ваш текущий статус риска. Определение риска остается активным и выполняется корректно. Подробнее см. на странице часто задаваемых вопросов: https://www.coronawarn.app/en/faq/" + + + + "Что-то пошло не так." + + "Причина" + + "ОК" + + "Сведения" + + "Неизвестная ошибка." + + + + "Lorem Ipsum" + + "Test API" + + "Test Risk Level" + + "Test Notification" + + "Android API Test(Manual Test)" + + "Start (Broadcast/Receive Bluetooth)" + + "Get Exposure keys (my keys history from api)" + + "Share my keys via Email" + + "Submit Exposure Key" + + "Show QR Code" + + "Submit keys to Server" + + "Scan Exposure Key" + + "Last 3 Hours Mode" + + "Check Exposure Summary" + + "Exposure summary" + + "Days since last exposure: %1$s" + + "Attenuation Durations in Minutes: %1$s" + + "Summation Risk Score: %1$s" + + "Matched key count: %1$s" + + "Maximum risk score %1$s" + + "My keys (count: %1$d)" + + "Other key" + + "Calculate Risk Level" + + \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/values-tr/strings.xml b/Corona-Warn-App/src/main/res/values-tr/strings.xml index 805a37efca2..4130ff1dd6a 100644 --- a/Corona-Warn-App/src/main/res/values-tr/strings.xml +++ b/Corona-Warn-App/src/main/res/values-tr/strings.xml @@ -163,6 +163,8 @@ "Güncelleme: %1$s" "Günlük olarak güncellenir" + + "Not: Risk durumunuzu güncellemek için lütfen uygulamayı her gün açın." "Güncelle" @@ -303,7 +305,7 @@ "Belirtiler, test kullanılabilirliği veya bireysel izolasyon hakkında sorularınız varsa lütfen aşağıdakilerden biri ile iletişime geçin:" - "Ellerinizi düzenli olarak yıkayın." + "Ellerinizi düzenli olarak 20 saniye sabunla yıkayın." "Diğer insanlarla karşılaştığınızda yüz maskesi takın." @@ -408,6 +410,8 @@ "Maruz kalma günlüğü, cihazınızın Bluetooth üzerinden diğer kullanıcıların şifrelenmiş rastgele kimliklerini alması ve size ait rastgele kimliği diğer kullanıcıların cihazlarına aktarmasıyla çalışır. Bu özellik dilediğiniz zaman devre dışı bırakılabilir." "Şifrelenmiş rastgele kimlikler yalnızca tarih, süre ve yakınlık (sinyal gücünü kullanarak) hakkındaki bilgileri aktarır. Ad, adres, konum gibi kişisel veriler asla kaydedilmez. Kişilerin kimliği belirlenemez." + + "Basitleştirilmiş Dilde ve İşaret Dilinde Uygulama Bilgileri" "Kabul Beyanı" @@ -687,7 +691,11 @@ "İletişim" - "E-posta: CoronaWarnApp@rki.de""\n""Telefon: +49 30 18754 5100" + "E-posta: CoronaWarnApp@rki.de" + + "İletişim Formu" + + "Contact Form in ""English"" or ""German" "KDV numarası" @@ -759,7 +767,7 @@ "QR kod yanlış" - "QR kod yanlış. Lütfen tekrar deneyin." + "QR kod yanlış veya başka bir akıllı telefona zaten kaydedilmiş. QR kod geçerli olsun veya olmasın test sonucunuzu test merkezinden veya laboratuvardan alacaksınız. COVID-19 tanısı alırsanız kamu sağlığı yetkilisi tarafından bilgilendirileceksiniz." "Lütfen tekrar deneyin." @@ -806,7 +814,7 @@ "Test Sonucunuz" - "Testinizi değerlendirirken bir problem oluştu. Lütfen sonraki adımlarınız için kamu sağlığı yetkilisi ile görüşün.\n\nGerekirse yeni bir test kodu kaydedebilmeniz için lütfen testi Corona-Warn-App\'ten silin." + "Testinizi değerlendirirken bir problem oluştu. Lütfen sonraki adımlarınız için test merkezi veya laboratuvar ile görüşün.\n\nGerekirse yeni bir test kodu kaydedebilmeniz için lütfen testi Corona-Warn-App\'ten silin." "Testi Sil" @@ -816,9 +824,9 @@ "Tamam" - "Test silinsin mi?" + "Test yalnızca bir kez taranabilir." - "Test kalıcı olarak Corona-Warn-App\'ten silinir ve tekrar eklenemez. Bu işlem geri alınamaz." + "Testi silerseniz test sonucunuzu alamazsınız. Test sonucunuzu uygulamadan bağımsız olarak test merkezinden veya laboratuvardan alırsınız. COVID-19 tanısı alırsanız kamu sağlığı yetkilisi tarafından bilgilendirileceksiniz." "Kaldır" @@ -938,7 +946,7 @@ "Nasıl çalışır?" - "TAN talebinde bulunmak için lütfen test sonucunuzu (varsa) ve telefon numaranızı hazır tutun." + "TAN talebinde bulunmak için lütfen test sonucunuzu (varsa) ve telefon numaranızı hazır tutun.\n\nİşitme engeli bulunan kişiler yardım hattı ile iletişime geçmek için Tess Relay hizmetlerini (Almanca yazı dili ile işaret dili arasında tercüme) kullanabilir. Yazılımı Google Play\'den indirebilirsiniz." "Ara" From 46b73986e7d7b32bd2938f817e23b7409decd71c Mon Sep 17 00:00:00 2001 From: harambasicluka <64483219+harambasicluka@users.noreply.github.com> Date: Wed, 19 Aug 2020 13:01:45 +0200 Subject: [PATCH 27/27] removed ar & ru, update default strings and some auto formatting (#1040) --- .../src/main/res/values-ar/strings.xml | 1131 ----------------- .../src/main/res/values-ru/strings.xml | 1131 ----------------- .../src/main/res/values/strings.xml | 26 +- .../http/playbook/PlaybookImplTest.kt | 4 +- .../http/service/SubmissionServiceTest.kt | 1 - .../http/service/VerificationServiceTest.kt | 3 +- .../SubmitDiagnosisKeysTransactionTest.kt | 2 +- .../coronawarnapp/util/MockWebServerUtil.kt | 2 +- 8 files changed, 17 insertions(+), 2283 deletions(-) delete mode 100644 Corona-Warn-App/src/main/res/values-ar/strings.xml delete mode 100644 Corona-Warn-App/src/main/res/values-ru/strings.xml diff --git a/Corona-Warn-App/src/main/res/values-ar/strings.xml b/Corona-Warn-App/src/main/res/values-ar/strings.xml deleted file mode 100644 index 235a49d84be..00000000000 --- a/Corona-Warn-App/src/main/res/values-ar/strings.xml +++ /dev/null @@ -1,1131 +0,0 @@ - - - - - - "shared_preferences_cwa" - - "preference_onboarding_completed" - - "preference_onboarding_completed_timestamp" - - "preference_background_check_done" - - "preference_reset_app" - - "preference_only_wifi" - - "preference_tracing" - - "preference_timestamp_diagnosis_keys_fetch" - - "preference_timestamp_manual_diagnosis_keys_retrieval" - - "preference_m_string_google_api_token" - - "preference_notifications_enabled" - - "preference_notifications_risk_enabled" - - "preference_notifications_test_enabled" - - "preference_background_job_enabled" - - "preference_mobile_data_enabled" - - "preference_registration_token" - - "preference_device_pairing_successful_time" - - "preference_initial_tracing_activation_time" - - "preference_initial_result_received_time" - - "preference_risk_level_score" - - "preference_risk_level_score_successful" - - "preference_timestamp_risk_level_calculation" - - "preference_test_guid" - - "preference_is_allowed_to_submit_diagnosis_keys" - - "preference_auth_code" - - "preference_database_password" - - "preference_total_non_active_tracing" - - "preference_last_non_active_tracing_timestamp" - - "preference_number_successful_submissions" - - "preference_teletan" - - "preference_last_three_hours_from_server" - - "preference_polling_test_result_started" - - "preference_test_result_notification" - - "preference_risk_days_explanation_shown" - - - - - "الخلف" - - "التالي" - - "القائمة" - - "إغلاق" - - "تطبيق Corona-Warn-App" - - "زر" - - - - - "نظرة عامة" - - "معلومات التطبيق" - - "الإعدادات" - - - - "de.rki.coronawarnapp.notification.exposureNotificationChannelId" - - "1" - - "تطبيق Corona-Warn-App" - - "إشعارات من تطبيق Corona-Warn-App" - - "تطبيق Corona-Warn-App" - - "لديك رسائل جديدة من تطبيق Corona-Warn-App." - - - - - "التحديث متوفر" - - "يرجى ملاحظة أنه بإمكانك فقط استخدام تطبيق Corona-Warn-App مجددًا بمجرد تثبيت آخر تحديث." - - "تحديث" - - - - - "لا توجد مخالطة حتى الآن" - - - "%1$s مخالطة بخطر منخفض" - "%1$s من المخالطات بخطر منخفض" - "لا توجد مخالطة حتى الآن" - "%1$s مخالطة بخطر منخفض" - "%1$s من المخالطات بخطر منخفض" - "%1$s من المخالطات بخطر منخفض" - - - - "%1$s مخالطة" - "%1$s من المخالطات" - "لا توجد مخالطة حتى الآن" - "%1$s من المخالطات" - "%1$s من المخالطات" - "%1$s من المخالطات" - - - "تسجيل المخالطة كان نشطًا لمدة %1$s من الأربعة عشر يومًا الماضية." - - "تسجيل المخالطة نشط دائمًا" - - "لم يتم فحص التجمُّعات حتى الآن." - - "تم التحديث: %1$s" - - "يتم التحديث يوميًا" - - "ملاحظة: يُرجى فتح التطبيق يوميًا لتحديث مستوى الخطر لديك." - - "تحديث" - - "تحديث في %1$s" - - "تنشيط تسجيل المخالطة" - - "قم بتنشيط تسجيل المخالطة لتقييم مستوى الخطر اليوم." - - "خطر منخفض" - - "خطر مرتفع" - - - "%1$s يوم منذ آخر تجمُّع" - "%1$s من الأيام منذ آخر تجمُّع" - "%1$s من الأيام منذ آخر تجمُّع" - "%1$s من الأيام منذ آخر تجمُّع" - "%1$s من الأيام منذ آخر تجمُّع" - "%1$s من الأيام منذ آخر تجمُّع" - - - "خطر غير معروف" - - "تعذر علينا تقدير خطر العدوى نظرًا لعدم قيامك بتنشيط تسجيل المخالطة لفترة طويلة بما فيه الكفاية." - - "تسجيل المخالطة توقف" - - "آخر تسجيل مخالطة:""\n""%1$s" - - "تسجيل المخالطة غير ممكن" - - "تعذر تحديث تسجيل المخالطة لأكثر من 24 ساعة." - - "لم يتم تحديث مستوى الخطر لمدة تزيد عن 48 ساعة. يرجى تحديث مستوى الخطر." - - "الفحص قيد التشغيل..." - - "يتم تنزيل البيانات الحالية وفحصها.\nقد يستغرق هذا عدة دقائق." - - - - - "الأسئلة المتكررة" - - "يمكنك أن تجد هنا إجابات الأسئلة المتكررة حول تطبيق Corona-Warn-App. سيتم توجيهك إلى موقع إلكتروني خارجي." - - "https://www.bundesregierung.de/corona-warn-app-faq-englisch" - - "يمكنك أن تجد هنا إجابات الأسئلة المتكررة حول تطبيق Corona-Warn-App. سيتم توجيهك إلى موقع إلكتروني خارجي." - - - - - "مشاركة تطبيق Corona-Warn-App" - - "لنكافح فيروس كورونا معًا" - - "كلما زاد عدد مستخدمي التطبيق، أصبح بإمكاننا كسر سلسلة العدوى بشكل أسرع. الرجاء دعوة أسرتك وأصدقائك إلى تنزيل هذا التطبيق." - - "إرسال رابط التنزيل" - - "مكافحة فيروس كورونا معًا ""\n""أنا مستعد لذلك، ماذا عنك؟""\n""https://www.corona-warn-app.de""\n""\n" - - "رجل يشارك تطبيق Corona-Warn-App مع أربعة أشخاص آخرين." - - - - - "نظرة عامة" - - "نظرة عامة" - - "تسجيل المخالطة" - - "تسجيل المخالطة أحد الميزات الجوهرية الثلاث في التطبيق. عند تنشيطه، يتم تسجيل التجمُّعات مع أجهزة الأشخاص الآخرين، ولا يتعين عليك اتخاذ أي إجراء آخر." - - "خطر العدوى" - - "إذا تعاملت خلال آخر 14 يومًا مع شخص مصاب بمرض كوفيد-19، فسيُقدِّر التطبيق خطر العدوى لك؛ وذلك من خلال قياس مدة المخالطة ومدى اقترابك من المصاب." - - "قد يظهر لك مستوى الخطر التالي:" - - "خطر مرتفع" - - "خطر منخفض" - - "خطر غير معروف" - - "إشعار مستخدمين أخرين" - - "من الميزات الجوهرية الأخرى تسجيل اختبارك واسترجاع النتيجة. إذا تم تشخيصك على أنك مصاب بمرض كوفيد-19، يمكنك إشعار الآخرين وكسر سلسلة العدوى." - - "تعريف المصطلحات:" - - "سجل المخالطة" - - "قائمة بمعرفات عشوائية مؤقتة مستلَمة تُحفَظ مؤقتًا في ذاكرة تخزين التشغيل. تُقرأ هذه القائمة عند التحقق من المخالطات، وتُحذَف جميع المعرفات العشوائية تلقائيًا بعد 14 يومًا." - - "التحقق من المخالطة" - - "يتم استرجاع بيانات سجل المخالطة ومزامنتها مع حالات عدوى المستخدمين الآخرين المبلغ عنها. يتم إجراء التحقق من المخالطة تلقائيًا كل ساعتين تقريبًا." - - "المخالطات" - - "التجمُّعات لمدة طويلة ومن مسافة قريبة جدًا مع أشخاص مصابين بمرض كوفيد-19." - - "إشعار المخالطة" - - "عرض المخالطات في تطبيق Corona-Warn-App." - - "المعرفات العشوائية" - - "المعرفات العشوائية هي مجموعات مكونة من أحرف وأرقام مُنشأة بشكل عشوائي. يتم تبادل هذه المعرفات بين الأجهزة الموجودة بالقرب. ولا يمكن تعيين المعرفات العشوائية إلى شخص معين كما يتم حذفها تلقائيًا بعد 14 يومًا. يمكن للأشخاص الذين تم تشخيصهم كمصابين بمرض كوفيد-19 أن يختاروا مشاركة معرفاتهم العشوائية في آخر 14 يومًا مع مستخدمي التطبيق الآخرين." - - "هاتف ذكي يعرض محتوى متنوعًا، مرقمًا من 1 إلى 3." - - "الصفحة الرئيسية لتطبيق Corona-Warn-App" - - - - - "مستوى الخطر" - - "التعليمات" - - "أمور يجب عليك الالتزام بها" - - "يُرجى التوجه إلى منزلك والمكوث به إن أمكن ذلك." - - "إذا كانت لديك استفسارات بشأن الأعراض أو توفر الاختبار أو العزل الذاتي، فالرجاء الاتصال بجهة واحدة مما يلي:" - - "اغسل يديك بانتظام بالصابون لمدة 20 ثانية." - - "ارتدِ قناع الوجه عند التجمُّع مع أشخاص آخرين." - - "حافظ على الابتعاد عن الآخرين بمسافة لا تقل عن 1.5 متر." - - "قم بالعطس أو السعال في مرفقك أو في منديل." - - "طبيبك الممارس العام" - - "خدمة الطوارئ الطبية العامة على الهاتف رقم 116117" - - "دائرة الصحة العامة" - - "خطر العدوى" - - "تم تسجيل الفترة" - - "هذه الفترة مضمَّنة في الاحتساب." - - "يمكن تقدير خطر العدوى بالنسبة إليك فقط للفترات التي كان خلالها تسجيل المخالطة نشطًا. وبالتالي يجب أن تظل ميزة التسجيل نشطة دائمًا." - - "يشمل تسجيل المخالطة الأربعة عشر يومًا الماضية. وأثناء هذه الفترة يمكن أن تكون ميزة التسجيل على جهازك نشطة لمدة %1$s من الأيام. يقوم التطبيق تلقائيًا بحذف السجلات الأقدم، مثل تلك التي لم تعد ذات صلة بمنع العدوى." - - "هذه هي الطريقة التي كان يتم بها تقدير الخطر الواقع عليك" - - "هذه هي الطريقة التي يتم بها تقدير الخطر الواقع عليك" - - "تعذر علينا تقدير خطر العدوى نظرًا لعدم قيامك بتنشيط تسجيل المخالطة لفترة طويلة بما فيه الكفاية." - - "تعذر تحديث تسجيل المخالطة لأكثر من 24 ساعة." - - "لديك خطر منخفض للعدوى لأنه لم يتم تسجيل مخالطتك بأشخاص تم تشخيصهم لاحقًا كمصابين بمرض كوفيد-19، أو لأن تجمعاتك كانت لفترة زمنية قصيرة وعن بُعد." - - - "خطر العدوى لديك مرتفع لأنك خالطت مؤخرًا شخصًا واحدًا على الأقل مُصاب بمرض كوفيد-19 منذ %1$s يوم لفترة زمنية أطول وعن قرب." - "خطر العدوى لديك مرتفع لأنك خالطت مؤخرًا شخصًا واحدًا على الأقل مُصاب بمرض كوفيد-19 منذ %1$s من الأيام لفترة زمنية أطول وعن قرب." - "خطر العدوى لديك مرتفع لأنك خالطت مؤخرًا شخصًا واحدًا على الأقل مُصاب بمرض كوفيد-19 منذ %1$s من الأيام لفترة زمنية أطول وعن قرب." - "خطر العدوى لديك مرتفع لأنك خالطت مؤخرًا شخصًا واحدًا على الأقل مُصاب بمرض كوفيد-19 منذ %1$s من الأيام لفترة زمنية أطول وعن قرب." - "خطر العدوى لديك مرتفع لأنك خالطت مؤخرًا شخصًا واحدًا على الأقل مُصاب بمرض كوفيد-19 منذ %1$s من الأيام لفترة زمنية أطول وعن قرب." - "خطر العدوى لديك مرتفع لأنك خالطت مؤخرًا شخصًا واحدًا على الأقل مُصاب بمرض كوفيد-19 منذ %1$s من الأيام لفترة زمنية أطول وعن قرب." - - - "يتم تقدير خطر العدوى من بيانات تسجيل المخالطة (المدة ومدى الاقتراب) محليًا على جهازك. ولا يمكن الاطلاع على خطر العدوى من جانب أي شخص آخر أو تمريره إليه." - - "لذلك، تم تصنيف خطر العدوى كمنخفض. يتم تقدير خطر العدوى من بيانات تسجيل المخالطة (المدة ومدى الاقتراب) محليًا على جهازك. ولا يمكن الاطلاع على خطر العدوى من جانب أي شخص آخر أو تمريره إليه." - - "وبالتالي، تم تصنيف خطر العدوى كمرتفع. يتم تقدير خطر العدوى من بيانات تسجيل المخالطة (المدة ومدى الاقتراب) محليًا على جهازك. ولا يمكن الاطلاع على خطر العدوى من جانب أي شخص آخر أو تمريره إليه. عند العودة إلى المنزل، يرجى تجنب التعامل عن قرب مع أفراد أسرتك أو عائلتك." - - @string/risk_card_button_update - - @string/risk_card_button_enable_tracing - - "مستوى الخطر" - - - "معلومات حول وظيفة تسجيل المخالطة" - - "لمزيد من المعلومات، راجع صفحة الأسئلة المتكررة." - - - - - "عدم التنشيط" - - "تنشيط" - - "إلغاء" - - "التالي" - - "لنبدأ" - - "الخلف" - - "صفحة البدء 1 من 5: مكافحة فيروس كورونا معًا" - - "لنكافح فيروس كورونا معًا" - - "مزيد من الحماية لك ولنا جميعًا. يمكننا كسر سلاسل العدوى أسرع بكثير من خلال استخدام تطبيق Corona-Warn-App." - - "قم بتحويل جهازك إلى نظام للتحذير من فيروس كورونا. ألقِ نظرة عامة على مستوى الخطر الواقع عليك وتعرف على ما إذا كنت قد تواصلت عن قرب مع أي شخص مصاب بمرض كوفيد-19 خلال آخر 14 يومًا." - - "يسجل التطبيق تجمعات الأفراد بتبادل معرفات عشوائية مشفرة بين أجهزتهم، ولا يتم الوصول إلى أي معلومات شخصية أيًا كانت." - - "مجموعة أشخاص يستخدمون هواتفهم الذكية حول المدينة." - - "صفحة البدء 2 من 5: خصوصية البيانات. يوجد نص طويل. للمتابعة في أي وقت لاحق، استخدم الزر الموجود أعلى الشاشة." - - "خصوصية البيانات" - - - "سيدة تستخدم تطبيق Corona-Warn-App على هاتفها الذكي. ترمز أيقونة القفل الموجودة بخلفية الشاشة إلى بيانات مشفرة." - - "صفحة البدء 3 من 5: كيفية تمكين تسجيل المخالطة" - - "كيفية تمكين تسجيل المخالطة" - - "لتحديد ما إذا كنت معرضًا لخطر العدوى، يجب عليك تنشيط ميزة تسجيل المخالطة." - - "يعمل تسجيل المخالطة من خلال تلقي جهازك، عبر Bluetooth، المعرفات العشوائية المشفرة لمستخدمين آخرين وتمرير معرفك العشوائي إلى أجهزتهم. ويمكن إلغاء تنشيط هذه الميزة في أي وقت." - - "لا تقوم المعرفات العشوائية بإرسال أي معلومات إلى الأشخاص الآخرين إلا معلومات التاريخ والمدة ومدى الاقتراب (باستخدام قوة الإشارة). ولا يتم أبدًا تسجيل البيانات الشخصية مثل الاسم والعنوان والموقع. كما لا يمكن تحديد هوية الأفراد." - - "معلومات التطبيق بلغة مبسطة ولغة الإشارة" - - "إقرار الموافقة" - - "لمعرفة ما إذا كنت قد خالطت شخصًا مصابًا بالعدوى، وما إذا كان هناك خطر عدوى بالنسبة لك، يتعين عليك تنشيط خاصية تسجيل المخالطة الموجودة في التطبيق. الموافقة على تنشيط خاصية تسجيل المخالطة، ومعالجة البيانات في هذا السياق، بالنقر على زر: \"تمكين\".""\n""\n""لكي يمكنك استخدام خاصية تسجيل المخالطة، يتعين عليك أيضًا تنشيط خاصية تسجيل المخالطات المتاحة من جوجل على هاتفك الذكي \"إشعارات التعرض لفيروس كورونا المستجد (كوفيد-19) \"، ومنح اذن لتطبيق Corona-Warn-App لاستخامها.""\n""\n""عند تنشيط خاصية تسجيل المخالطات يتولى هاتفك الذكي إنشاء وإرسال أرقام تعريف عشوائية عبر Bluetooth بصفة مستمرة، والتي يمكن استقبالها في محيطك من هواتف أبل وأندرويد الذكية الأخرى، التي تكون فيها خاصية تسجيل المخالطات منشطة بالمثل. والعكس صحيح، حيث يستقبل هاتفك الذكي المعرفات العشوائية للهواتف الذكية الأخرى. يتم تسجيل أرقام تعريفك العشوائية والمعرفات العشوائية المستقبلة من الهواتف الذكية الأخرى في سجل المخالطة بخاصية تسجيل المخالطات، وتخزن هناك لمدة 14 يومًا.""\n""\n""للتعرف على خطر العدوى بالنسبة لك، يستدعي التطبيق عدة مرات يوميًا -أو عند الرغبة- قائمةً بالمعرفات العشوائية لكافة المستخدمين الذين سجلوا إصابتهم بفيروس كورونا في التطبيق. يتم مقارنة هذه القائمة بعد ذلك مع المعرفات العشوائية المخزنة في سجل المخالطة بخاصية تسجيل المخالطات. وعندما يتأكد التطبيق من أنك ربما خالطت مستخدمًا مصابًا بالعدوى، يخطرك التطبيق بأنك خالطت شخصًا مصابًا، وأنه من المحتمل تعرضك لخطر العدوى. في هذه الحالة يحصل التطبيق أيضًا على إذن بالوصول إلى بيانات إضافية مخزنة في سجل المخالطة بخاصية تسجيل المخالطات لهاتفك الذكي (التاريخ، والمدة، وقوة إشارة Bluetooth عند المخالطة).""\n""\n""يُستدل على البُعد المكاني من قوة إشارة Bluetooth (كلما كانت الإشارة أقوى، كانت المسافة أقل). ثم يقيّم التطبيق هذه البيانات، من أجل تقييم احتمالية اصابتك بفيروس كورونا ، وتقديم التوصيات لك بشأن ما يجب القيام به بعد ذلك. يتم إجراء هذا التقييم حصريًا على هاتفك الذكي. لا يعرف أحدٌ سواك (بما في ذلك معهد روبرت كوخ أيضًا) ما إذا كنت قد خالطت شخصًا مصابًا، وما إذا كان الأمر ينطوي على خطر إصابتك.""\n""\n""لإلغاء موافقتك على خاصية تسجيل المخالطة، يمكنك إلغاء تنشيط الخاصية عبر الشريط الانزلاقي داخل التطبيق أو حذف التطبيق. وإذا كنت ترغب في استخدام خاصية تسجيل المخالطة مجددًا، فيمكنك إعادة تنشيط الشريط الانزلاقي أو تثبيت التطبيق من جديد. عند إلغاء خاصية تسجيل المخالطة، لن يفحص التطبيق ما إذا كنت قد خالطت مستخدمًا مصابًا أم لا. أيضًا لكي توقف إرسال المعرفات العشوائية واستقبالها، يتعين عليك الغاء تنشيط تسجل مخالطة المصابين بمرض كوفيد -19 في إعدادات هاتفك الذكي. يرجى الانتباه إلى أن رموز التعريف العشوائية للهاتف الذكي والهواتف الذكية الأخرى، والمخزنة في سجل المخالطة لن يتم حذفها من التطبيق. لا يمكنك حذف البيانات المخزنة في سجل المخالطة حذفًا نهائيًا إلا من خلال إعدادات هاتفك الذكي.""\n""\n""تجد تعليمات التطبيق الخاصة بحماية البيانات (بما في ذلك المعلومات حول معالجة البيانات لتسجيل المخالطة) تحت بند القائمة \"معلومات خصوصية البيانات\"." - - "تنشيط تسجيل المخالطة" - - "تفويض" - - "هذا يعني أن تطبيق Corona-Warn-App لا يمكنه إرسال أو تلقي إشعارات حول مستوى خطر مرض كوفيد-19. يمكنك إلغاء تنشيط هذه الميزة في أي وقت." - - "عدم التنشيط" - - "الخلف" - - "تحديثات في الخلفية مُلغى تنشيطها" - - "قمت بإلغاء تنشيط تحديثات في الخلفية لتطبيق Corona-Warn-App. الرجاء تنشيط تحديثات في الخلفية لاستخدام تسجيل المخالطة التلقائي. إذا لم تقم بتنشيط تحديثات في الخلفية، فيمكنك فقط بدء تسجيل المخالطة يدويًا في التطبيق. يمكنك تنشيط تحديثات في الخلفية للتطبيق في إعدادات الجهاز لديك." - - "فتح إعدادات الجهاز" - - "بدء تسجيل المخالطة يدويًا" - - "السماح بنشاط له أفضلية في الخلفية" - - "قم بتمكين النشاط الذي له أفضلية في الخلفية للسماح للتطبيق بتحديد مستوى الخطر الواقع عليك في الخلفية في أي وقت (مستحسَن). يؤدي ذلك إلى تعطيل زيادة عمر البطارية لتطبيق Corona-Warn-App فقط، ولا نتوقع أن يؤدي إلى انخفاض ملحوظ في عمر بطارية جهازك.\nإذا لم تسمح بهذا الإعداد، فمن المستحسن لك فتح التطبيق يدويًا مرة واحدة يوميًا على الأقل." - - "السماح" - - "عدم السماح" - - "النشاط الذي له أفضلية في الخلفية معطَّل" - - "يرجى العلم أنه مع تعطيل النشاط الذي له أفضلية في الخلفية، سيتعين عليك فتح التطبيق مرة واحدة يوميًا لتحديث مستوى الخطر. \n\nيمكنك تعطيل النشاط الذي له أفضلية في الخلفية من إعداداتك في أي وقت." - - "موافق" - - "قام ثلاثة أشخاص بتنشيط تسجيل المخالطة على أجهزتهم؛ مما سيعمل على تسجيل تجمُّعاتهم مع بعضهم بعضًا." - - "السماح بالوصول إلى الموقع" - - "لا يمكن الوصول إلى موقعك. يتطلب جوجل و/أو أندرويد الوصول إلى موقع جهازك لاستخدام Bluetooth." - - "فتح إعدادات الجهاز" - - "صفحة البدء 4 من 5: إذا كنت مصابًا بمرض كوفيد-19..." - - "إذا كنت مصابًا بمرض كوفيد-19..." - - "...يُرجى الإبلاغ عن هذا في تطبيق Corona-Warn-App. مشاركة نتائج اختبارك أمر اختياري وآمن. يُرجى القيام بهذا من أجل صحة الجميع." - - "يتم تشفير إشعارك ومعالجته بصورة آمنة على خادم آمن. الآن، سيتلقى الأشخاص الذين قام جهازك بتجميع معرفاتهم العشوائية المشفرة تحذيرًا مصحوبًا بمعلومات حول ما يجب عليهم فعله على الفور." - - "يتم إرسال تشخيص اختبار إيجابي مشفرًا إلى النظام؛ مما سينتج عنه تحذير المستخدمين الآخرين." - - "صفحة البدء 5 من 5: تلقي التحذيرات وتحديد الأخطار" - - "تلقي التحذيرات وتحديد الأخطار" - - "يمكن للتطبيق إشعارك تلقائيًا بمستوى الخطر الواقع عليك وتحذيرك من حالات العدوى الجديدة من الأشخاص الذين خالطتهم. اسمح للتطبيق الآن بإشعارك." - - "ويمكنك بعد ذلك عزل نفسك ذاتيًا لحماية الآخرين ومعرفة مكان إجراء الاختبار." - - "سيدة تتلقى إشعارًا من تطبيق Corona-Warn-App." - - - - - "الإعدادات" - - "تشغيل" - - "إيقاف تشغيل" - - "تسجيل المخالطة" - - "هذه هي طريقة عمل تسجيل المخالطة" - - "السماح بإنشاء معرفات عشوائية لمرض كوفيد-19 ومشاركتها." - - "تسجيل المخالطة نشط" - - "تسجيل المخالطة توقف" - - "خدمات الموقع تم إلغاء تنشيطها" - - "يتعين عليك تنشيط ميزة تسجيل المخالطة لتحديد ما إذا كنت معرضًا لخطر العدوى أم لا، ويعمل تحديد خطر العدوى من خلال تلقي جهازك، عبر Bluetooth، المعرفات العشوائية المشفرة لمستخدمين آخرين وتمرير معرفك العشوائي إلى أجهزتهم. ويمكنك تعطيل هذه الميزة في أي وقت.""\n""\n""لا تمرر المعرفات العشوائية المشفرة إلا معلومات حول التاريخ والمدة ومدى الاقتراب من الأشخاص الآخرين (يتم التقدير باستخدام قوة الإشارة). ولا يتم أبدًا تسجيل البيانات الشخصية، مثل الاسم والعنوان والموقع، كما لا يمكن تحديد هوية الأفراد." - - "نشط" - - "موقوف" - - "مقيَّد" - - "لا يوجد اتصال بالإنترنت" - - "تم إيقاف تشغيل Bluetooth" - - "تشغيل Bluetooth" - - "يجب تشغيل Bluetooth لتسجيل المخالطة من أجل تسجيل التجمُّعات. يرجى تشغيل Bluetooth من إعدادات جهازك." - - "فتح إعدادات الجهاز" - - "السماح بالوصول إلى الموقع" - - "لا يمكن الوصول إلى موقعك. يتطلب جوجل و/أو أندرويد الوصول إلى موقع جهازك لاستخدام Bluetooth." - - "فتح إعدادات الجهاز" - - "فتح الاتصال بالإنترنت" - - "يتطلب تسجيل المخالطة اتصالًا بالإنترنت لتقدير المخالطات. يُرجى تشغيل WIFI أو بيانات الهاتف من إعدادات جهازك." - - "فتح إعدادات الجهاز" - - - "تسجيل المخالطة نشط لمدة يوم واحد.\nلا يمكن أن يكون التحقق من المخالطة موثوقًا به إلا إذا كان تسجيل المخالطة نشطًا دائمًا." - "تسجيل المخالطة نشط لمدة %1$s من الأيام.\nلا يمكن أن يكون التحقق من المخالطة موثوقًا به إلا إذا كان تسجيل المخالطة نشطًا دائمًا." - "تسجيل المخالطة نشط لمدة %1$s من الأيام.\nلا يمكن أن يكون التحقق من المخالطة موثوقًا به إلا إذا كان تسجيل المخالطة نشطًا دائمًا." - "تسجيل المخالطة نشط لمدة %1$s من الأيام.\nلا يمكن أن يكون التحقق من المخالطة موثوقًا به إلا إذا كان تسجيل المخالطة نشطًا دائمًا." - "تسجيل المخالطة نشط لمدة %1$s من الأيام.\nلا يمكن أن يكون التحقق من المخالطة موثوقًا به إلا إذا كان تسجيل المخالطة نشطًا دائمًا." - "تسجيل المخالطة نشط لمدة %1$s من الأيام.\nلا يمكن أن يكون التحقق من المخالطة موثوقًا به إلا إذا كان تسجيل المخالطة نشطًا دائمًا." - - - "قام ثلاثة أشخاص بتنشيط تسجيل المخالطة على أجهزتهم؛ مما سيعمل على تسجيل تجمُّعاتهم مع بعضهم بعضًا." - - "ألغى شخص تنشيط تسجيل المخالطة على هاتفه الذكي؛ وبالتالي، لم يتم تسجيل تجمُّع مع شخصين آخرين." - - "أوقف شخص تشغيل Bluetooth على هاتفه الذكي؛ وبالتالي، لم يتم تسجيل تجمُّع مع شخصين آخرين." - - - - "قطع شخص الاتصال بالإنترنت على هاتفه الذكي؛ وبالتالي، لم يتم تسجيل تجمُّع مع شخصين آخرين." - - - "الإشعارات" - - "هل تريد تنشيط إشعارات مستوى خطر مرض كوفيد-19؟" - - "تم إلغاء تنشيط الإشعارات" - - "السماح بالإشعارات التلقائية لمستوى خطر مرض كوفيد-19" - - "حدد المناطق التي تريد استمرار تلقي الإشعارات عنها." - - "لتنشيط الإشعارات، يجب السماح بإشعارات تطبيق Corona-Warn-App من إعدادات جهازك." - - "تنشيط الإشعارات" - - "الإشعارات" - - "تم تغيير خطر العدوى" - - "حالة اختبار مرض كوفيد-19" - - "فتح إعدادات الجهاز" - - "سيدة تتلقى إشعارًا من تطبيق Corona-Warn-App." - - "سيدة ألغت تنشيط إشعارات تطبيق Corona-Warn-App." - - "إعادة تعيين التطبيق" - - "حذف كل البيانات في التطبيق." - - "هل تريد بالتأكيد إعادة تعيين التطبيق؟" - - "لن يتم إشعارك بعد الآن بالمخالطات ولن يكون بمقدورك تحذير المستخدمين الآخرين." - - "حذف سجل ""\n""المخالطة" - - "يجب حذف سجل المخالطة بشكل منفصل من إعدادات جهازك." - - "إعادة تعيين التطبيق" - - "إلغاء" - - "هاتف ذكي يعرض رمزًا يشير إلى إعادة تعيين التطبيق." - - "إعادة تعيين التطبيق" - - "لن يتم إشعارك بعد الآن بالمخالطات ولن يكون بمقدورك تحذير المستخدمين الآخرين. لا يمكن التراجع عن هذا الإجراء." - - "إلغاء" - - "إعادة تعيين" - - "نشاط له أفضلية في الخلفية" - - "السماح بتحديثات مستوى الخطر تلقائيًا" - - "تشغيل تطبيق Corona-Warn-App في الخلفية" - - "يتم تشغيل تطبيق Corona-Warn-App في الخلفية بشكل دائم عند تنشيط نشاط له أفضلية في الخلفية، وهذا يتيح للتطبيق تحديد مستوى الخطر في أي وقت." - - - - "لتعطيل نشاط له أفضلية في الخلفية، الرجاء إلغاء تنشيطه في إعدادات الجهاز." - - "فتح إعدادات الجهاز" - - "تعطيل نشاط له أفضلية في الخلفية" - - - - - "معلومات التطبيق" - - "الإصدار:%1s" - - "نبذة عن التطبيق" - - "لنكافح فيروس كورونا معًا" - - "معهد روبرت كوخ (RKI) هو الهيئة الصحية الاتحادية العامة في ألمانيا. ينشر المعهد تطبيق Corona-Warn-App بالنيابة عن الحكومة الاتحادية، والتطبيق مصمم كامتداد رقمي لإجراءات الصحة العامة المنفَّذة بالفعل: التباعد الاجتماعي والنظافة الشخصية واستخدام أقنعة الوجه." - - "يمكن لأي شخص يستخدم التطبيق تتبع سلسلة العدوى وكسرها. يحفظ التطبيق التجمُّعات مع الأشخاص الآخرين محليًا على جهازك. ويتم إشعارك عند تجمُّعك مع أشخاص تم تشخيصهم مؤخرًا على أنهم مصابون بمرض كوفيد-19، علمًا أن هويتك وخصوصيتك محميتان دائمًا." - - "مجموعة أشخاص يستخدمون هواتفهم الذكية حول المدينة." - - "خصوصية البيانات" - - "سيدة تستخدم تطبيق Corona-Warn-App على هاتفها الذكي. ترمز أيقونة القفل الموجودة بخلفية الشاشة إلى بيانات مشفرة." - - "privacy_en.html" - - "شروط الاستخدام" - - "المحتوى" - - "هاتف ذكي تظهر على شاشته نصوص بخط كبير وبجوارها علامة صح ترمز إلى قبول شروط الاستخدام." - - "terms_en.html" - - "الخط الساخن الفني" - - "كيف يمكننا مساعدتك؟" - - "للاستفسارات الفنية حول تطبيق Corona-Warn-App، الرجاء الاتصال بالخط الساخن." - - "الخط الساخن الفني:" - - "‎+49 800 7540001" - - "‎+49 800 7540001" - - "خدمة العملاء هنا لمساعدتك." - - "اللغات: الألمانية والإنجليزية والتركية\nساعات العمل:""\n""الاثنين إلى السبت: من الساعة 7 صباحًا حتى 10 مساءً""\n(فيما عد العطلات الرسمية)""\nالاتصال مجاني." - - "إذا كان لديك أي استفسارات متعلقة بصحتك، فيُرجى التواصل مع طبيبك الممارس العام أو الخط الساخن لخدمة الطوارئ الطبية، هاتف ‎116 117." - - "رجل يرتدي سماعة رأس أثناء إجراء اتصال." - - "الأسئلة المتكررة" - - "الأسئلة المتكررة. سيتم إعادة توجيهك إلى موقع ويب خارجي." - - "الإخطارات القانونية" - - "هاتف ذكي تظهر على شاشته نصوص بخط كبير وبجوارها ميزان يرمز إلى الإشعارات القانونية." - - "technical_en.html" - - "بيان النشر" - - "تم النشر بواسطة" - - "(مسؤول بموجب المادة 5، الفقرة 1 من قانون الإعلام عن بُعد \"TMG\"، المادة 55، الفقرة 1 من عقد البث الإذاعي \"RStV\"، قانون حماية البيانات \"DS-GVO\"، القانون الاتحادي لحماية البيانات \"BDSG\")" - - "معهد روبرت كوخ""\n""نوردوفر 20""\n""13353 برلين""\n""\n""ممثلًا بواسطة رئيسه" - - "الاتصال" - - "البريد الإلكتروني: CoronaWarnApp@rki.de" - - "نموذج الاتصال" - - "Contact Form in ""English"" or ""German" - - "رقم تعريف ضريبة القيمة المضافة" - - "DE 165 893 430" - - "هاتف ذكي تظهر على شاشته نصوص بخط كبير وبجوارها رمز لقسم يمثل بيان النشر." - - - - - - "خطأ" - - "تعذر إنشاء اتصال (%1$d). يرجى المحاولة لاحقًا." - - "تعذر إنشاء اتصال. يرجى المحاولة لاحقًا." - - "الخلف" - - - "خطأ" - - "رمز الاستجابة السريعة (QR)/رقم المعاملة (TAN) غير صالح أو مستخدم بالفعل. يُرجى المحاولة مرة أخرى أو الاتصال بالخط الساخن الفني عبر معلومات التطبيق -> الخط الساخن الفني." - - "الخلف" - - - "خطأ" - - "تعذر إنشاء رقم المعاملة (TAN) للتقديم. يُرجى الاتصال بالخط الساخن الفني عبر معلومات التطبيق -> الخط الساخن الفني." - - "الخلف" - - - "خطأ" - - "رقم المعاملة (TAN) المُنشأ غير صالح للتقديم. الرجاء الاتصال بالخط الساخن الفني عبر معلومات التطبيق ← الخط الساخن الفني." - - "الخلف" - - - "الاختبار به أخطاء" - - "هناك مشكلة في تقييم اختبارك، حيث انتهت صلاحية رمز الاستجابة السريعة (QR)." - - "موافق" - - - - "تفويض الكاميرا مطلوب" - - "السماح للتطبيق باستخدام الكاميرا لمسح رمز الاستجابة السريعة (QR)." - - "سماح" - - "عدم السماح" - - - - "الوصول إلى الكاميرا لازم" - - "يُرجى فتح إعدادات النظام والسماح للتطبيق باستخدام الكاميرا لمسح رمز الاستجابة السريعة (QR)." - - "موافق" - - - - "رمز الاستجابة السريعة (QR) غير صالح" - - "رمز الاستجابة السريعة (QR) غير صالح أو تم تسجيله بالفعل على هاتف ذكي آخر. ستتلقى نتيجة الاختبار من مركز الاختبار أو المختبر بغض النظر عن صلاحية رمز الاستجابة السريعة (QR). إذا تمت إصابتك بمرض كوفيد-19، فسيتم إعلامك من قبل دائرة الصحة العامة." - - "يُرجى المحاولة مرة أخرى." - - "إلغاء" - - - "ضع رمز الاستجابة السريعة (QR) داخل الإطار." - - "ضع رمز الاستجابة السريعة (QR) داخل الإطار." - - - - "نتيجة الاختبار" - - "كيف يعمل ذلك:" - - "تمت إضافة الاختبار بنجاح" - - "تم تخزين اختبارك في تطبيق Corona-Warn-App." - - "نتيجة الاختبار غير متوفرة حتى الآن" - - "نتيجة اختبارك غير متوفرة حتى الآن." - - "تحديث" - - "حذف الاختبار" - - "نتيجة اختبارك" - - "لا تشير نتيجة المعمل لإصابتك بفيروس كورونا المستجد\n\nيُرجى حذف الاختبار من تطبيق Corona-Warn-App حتى تتمكن من حفظ رمز نتيجة اختبار جديد هنا عند الحاجة." - - "حذف الاختبار" - - "نتيجة اختبارك" - - "تم التحقق من إيجابية نتيجة اختبارك." - - "تحذير الآخرين" - - "شارِك معرفاتك العشوائية لآخر 14 يومًا لحماية الآخرين وكسر سلسلة العدوى." - - "التالي" - - "نتيجة اختبارك" - - "حدثت مشكلة أثناء تقييم اختبارك. يُرجى التواصل مع مركز الاختبار أو المعمل لمعرفة كيفية المتابعة.\n\nيُرجى حذف الاختبار من تطبيق Corona-Warn-App؛ حتى تتمكن من حفظ رمز اختبار جديد فيه، عند الحاجة." - - "حذف الاختبار" - - "تسجيل المخالطة مطلوب" - - "يُرجى تنشيط تسجيل المخالطة لتحذير أشخاص آخرين." - - "موافق" - - "يمكن مسح الاختبار ضوئيًا مرة واحدة فقط." - - "إذا قمت بحذف الاختبار، فلن تتمكن من استرجاع نتيجة الاختبار الخاصة بك. تتلقى نتيجة الاختبار الخاصة بك من مركز الاختبار أو المختبر، بغض النظر عن التطبيق. إذا تمت إصابتك بمرض كوفيد-19، فسيتم إعلامك من قبل دائرة الصحة العامة." - - "إزالة" - - "إلغاء" - - "فيروس كورونا المستجد إيجابي" - - "تم تشخيصك على أنك مصاب بفيروس كورونا المستجد." - - - - "إدخال رقم المعاملة (TAN)" - - "الرجاء إدخال رقم المعاملة (TAN) المكون من 10 أرقام والمقدم إليك." - - "التالي" - - "إدخال رقم المعاملة (TAN)" - - "رقم المعاملة (TAN) غير صالح. يرجى التحقق من إدخالك." - - "الإدخال غير صالح. يُرجى التحقق من إدخالك." - - - - "هل خضعت للاختبار؟" - - "هذه هي طريقة عمل تطبيق Corona-Warn-App" - - "حتى يعمل التطبيق جيدًا، نعتمد على دعم الأشخاص المصابين بمرض كوفيد-19 لنا.\n\nبما أنه لا يتم تبادل إلا المعرفات العشوائية المشفرة، ستظل هويتك غير معروفة. يمكنك الآن المتابعة كما يلي:" - - "التالي" - - "يتم إرسال تشخيص اختبار إيجابي مشفرًا إلى النظام؛ مما سينتج عنه تحذير المستخدمين الآخرين." - - - "إذا كنت مصابًا بمرض كوفيد-19، يمكنك إشعار الآخرين." - "إذا تم منحك رقم المعاملة (TAN) لتشخيص إيجابي، يمكنك استخدامه لتسجيل الاختبار." - "إذا لم يكن لديك رقم المعاملة (TAN)، يمكنك طلبه بالهاتف." - - - "هل خضعت للاختبار؟ هذه هي طريقة عمل تطبيق Corona-Warn-App" - - - - "تحديد" - - "ما المعلومات التي لديك؟" - - "مستند برمز الاستجابة السريعة (QR)" - - "سجِّل اختبارك من خلال مسح رمز الاستجابة السريعة (QR) لمستند اختبارك." - - "إقرار الموافقة" - - "بالنقر على \"قبول\"، فإنك توافق على السماح للتطبيق بالاستعلام عن حالة فحص فيروس كورونا خاصتك، وعرض الحالة في التطبيق. تتاح لك هذه الخاصية عندما تتلقى رمز استجابة سريعة (QR) وتوافق على السماح بإرسال نتيجة الاختبار إلى نظام السيرفر الخاص بالتطبيق. بمجرد أن يودع معمل الفحوصات نتيجة اختبارك على السيرفر، يمكنك الاطلاع على النتيجة في التطبيق. وإذا كنت قد نشطت خاصية الإشعارات، فستتلقى إشعارًا أيضًا خارج التطبيق بظهور نتيجة الاختبار. نتيجة الاختبار نفسها لا تظهر إلا في التطبيق لأسباب متعلقة بحماية البيانات. يمكنك إلغاء هذه الموافقة في أي وقت عن طريق حذف تسجيل الاختبار في التطبيق. عند إلغاء الموافقة، تظل مشروعية المعالجة حتى تاريخ الإلغاء قائمةً. تجد المزيد من المعلومات تحت بند القائمة \"معلومات خصوصية البيانات\"." - - "قبول" - - "عدم القبول" - - "رقم المعاملة (TAN)" - - "سجِّل اختبارك بإدخال رقم المعاملة (TAN) يدويًا." - - "طلب رقم المعاملة (TAN)" - - "يُرجى الاتصال بنا إذا كنت مصابًا بمرض كوفيد-19." - - "ما المعلومات التي لديك؟" - - - - "تحذير الآخرين" - - "يُرجى مساعدتنا جميعًا!" - - "يمكنك لاحقًا التأكد من مشاركة تطبيق Corona-Warn-App لمعرفاتك العشوائية في آخر 14 يومًا مع الآخرين. ومن خلال القيام بذلك، يمكنك تحذير الأشخاص الآخرين والمساعدة على كسر سلسلة العدوى.\n\nستظل هويتك مجهولة حيث يتم إرسال المعرفات العشوائية غير الشخصية فقط." - - "خصوصية البيانات" - - "بالنقر على \"قبول\"، فإنك توافق على أن يرسل التطبيق نتيجة اختبارك الإيجابية مع أرقام تعريفك العشوائية لآخر 14 يومًا إلى نظام سيرفر التطبيق، حتى يتسنى إخطار غيرك من مستخدمي التطبيق المنشطين لخاصية تسجيل المخالطة أوتوماتيكيًا باحتمالية تعرضهم لخطر العدوى. لا تتضمن المعرفات العشوائية المتداولة أية بيانات تسمح بثغرات يمكن التعرف من خلالها على هويتك أو شخصك.\n\nنشر نتيجة اختبارك عبر التطبيق خطوة اختيارية. إذا لم تنشر نتيجة اختبارك، لن تترتب عليك أية أضرار؛ لأنه لا يمكن لأحد سواك معرفة أو مراقبة ما إذا كنت تستخدم التطبيق، وكيف تستخدمه، وما إذا كنت نشرت إصابتك بالعدوى أم لا.\n\nيمكنك إلغاء موافقتك في أي وقت عن طريق حذف التطبيق. عند إلغاء الموافقة، تظل مشروعية المعالجة بدايةً من الموافقة حتى تاريخ الإلغاء قائمةً. تجد المزيد من المعلومات تحت بند القائمة \"معلومات خصوصية البيانات\"." - - "التالي" - - "جهاز يرسل تشخيص اختبار إيجابي مشفرًا إلى النظام." - - - - - "شكرًا لك" - - "لقد قدمت مساهمة قيمة. بفضل دعمك، ستيم تحذير أشخاص آخرين ويمكنهم التصرف بالشكل الصحيح." - - "يُرجى ملاحظة ما يلي:" - - "أنت معدٍ." - - "يُرجى عزل نفسك عن الآخرين." - - "معلومات أخرى:" - - - "فترة الحجر الصحي عادة ما تكون 14 يومًا. الرجاء ملاحظة أعراضك ومراقبة مدى تطورها." - "ستطالبك دائرة الصحة العامة بإنشاء قائمة بالأشخاص الذين تواصلت معهم. يجب أن يتضمن ذلك كل الأشخاص الذين تواصلت معهم عن قرب (أقل من مترين، محادثة وجهًا لوجه) لمدة تزيد عن 15 دقيقة في اليومين السابقين لتطور الأعراض." - "الرجاء التفكير بصفة خاصة في الأشخاص الذين لن يتم إشعارهم مباشرة من خلال التطبيق نظرًا لعدم امتلاكهم هاتف ذكي أو عدم قيامهم بتثبيت التطبيق." - "قد تظل معديًا حتى إن لم تعد تشعر بأي أعراض وكنت تشعر بأنك بحالة جيدة." - - - "تم" - - "جميع الأشخاص في المجموعة سعداء لمشاركة شخص ما نتيجة اختباره." - - - - "طلب رقم المعاملة (TAN)" - - "كيف يعمل ذلك:" - - "يُرجى الاحتفاظ بنتيجة اختبارك (إن وُجدت) وجهز رقم هاتفك لطلب رقم المعاملة (TAN).\n\nيُدعم الخط الساخن خدمات Tess Relay للأشخاص الذين يُعانون من ضعف السمع.(الترجمة بين اللغة الألمانية المكتوبة ولغة الإشارة) للاتصال بالخط الساخن للهاتف. يمكنك تنزيل البرنامج من Google Play." - - "اتصال" - - "إدخال رقم المعاملة (TAN)" - - "اتصل بالخط الساخن واطلب رقم المعاملة (TAN):" - - "‎+49 800 7540002" - - "‎+49 800 7540002" - - "سجِّل الاختبار بإدخال رقم المعاملة (TAN) في التطبيق." - - "اللغات\nالألمانية والإنجليزية والتركية\n\nساعات العمل:\nالاثنين إلى الأحد: 24 ساعة\n\nالاتصال مجاني." - - - "اتصل بالخط الساخن واطلب رقم المعاملة (TAN)" - - "في الخطوة الأولى، اتصل بالخط الساخن واطلب رقم المعاملة (TAN). يمكنك الاتصال بالخط الساخن على ‎+49 800 7540002. مواعيد العمل من الاثنين إلى الجمعة من الثامنة صباحًا إلى 10 مساءً ويومي السبت والأحد من العاشرة صباحًا إلى العاشرة مساءً. الاتصال مجاني." - - "في الخطوة التالية، قم بتسجيل اختبارك باستخدام رقم المعاملة (TAN) في التطبيق." - - - - "جار استرجاع البيانات..." - - "هل خضعت للاختبار؟" - - "النتيجة غير متوفرة حتى الآن" - - "نتيجتك متوفرة" - - "تشخيص إيجابي" - - "الاختبار غير صالح" - - "تشخيص سلبي" - - "جار تحديث نتيجتك" - - "ساعِد على كسر سلسلة العدوى من خلال إشعار الآخرين." - - "لم يتم إجراء تقييم اختبارك حتى الآن." - - "تعذر تقييم اختبارك." - - "تم تشخيصك على أنك إيجابي بخصوص بفيروس كورونا المستجد." - - "تم تشخيصك على أنك سلبي بخصوص بفيروس كورونا المستجد." - - "معرفة المزيد والمساعدة" - - "عرض الاختبار" - - "يُرجى ملاحظة ما يلي:" - - "أنت معدٍ. اعزل نفسك عن الأشخاص الآخرين." - - "ستتواصل معك دائرة الصحة العامة خلال الأيام القليلة القادمة بالهاتف أو بخطاب." - - "شارِك معرفاتك العشوائية حتى يمكن تحذير الآخرين." - - - "تشخيصك:" - - "فيروس كورونا المستجد" - - "تاريخ التسجيل %s" - - "سلبي" - - "إيجابي" - - "التقييم غير ممكن" - - "النتيجة غير متوفرة حتى الآن" - - "معلومات أخرى:" - - - "هل لا تزال تشعر بتوعك؟ إذا كنت تشعر بتوعك شديد و/أو تفاقمت أعراضك، فالرجاء الاتصال بطبيبك الممارس العام." - "ابقَ في المنزل حتى تشعر بأنك بصحة جيدة مرة أخرى. إذا أُصبت بفيروس كورونا (فيروس كورونا المستجد) مع ضعفك نتيجة عدوى أخرى، فقد يؤدي ذلك إلى مرض خطير." - "لا تذهب إلى عملك إذا كنت مريضًا لتضمن عدم تعريض الآخرين للخطر. إذا ازدادت الأعراض سوءًا، قد تحتاج للخضوع لاختبار فيروس كورونا المستجد مرة أخرى." - - - - - "عودة إلى الصفحة السابقة" - - "زر المتابعة" - - "مشاركة" - - "القائمة" - - "زر" - - "الصورة" - - - - "أنت غير متصل بالإنترنت." - - "ليس لديك ذاكرة فارغة كافية." - - "حدث خطأ خلال الاتصال بواجهة Google" - - "لا يمكنك القيام بهذا الإجراء. يُرجى الاتصال بالخط الساخن." - - "تم تثبيت تطبيق Corona-Warn-App بشكل صحيح؛ لكن خدمة \"إشعارات المخالطة لمرض كوفيد-19\" غير متوفرة على نظام تشغيل هاتفك الذكي؛ وهذا يعني أنه لا يمكنك استخدام التطبيق. لمزيد من المعلومات، يرجى الاطلاع على صفحة الأسئلة المتكررة لدينا على: https://www.coronawarn.app/en/faq/" - - "يعمل تطبيق Corona-Warn-App بشكل صحيح؛ لكن لا يمكن تحديث مستوى الخطر الحالي. يظل تسجيل المخالطة نشطًا، ويعمل بشكل صحيح. لمزيد من المعلومات، يرجى الاطلاع على صفحة الأسئلة المتكررة لدينا على: https://www.coronawarn.app/en/faq/" - - - - "حدث خطأ ما." - - "السبب" - - "موافق" - - "التفاصيل" - - "حدث خطأ غير معروف." - - - - "Lorem Ipsum" - - "Test API" - - "Test Risk Level" - - "Test Notification" - - "Android API Test(Manual Test)" - - "Start (Broadcast/Receive Bluetooth)" - - "Get Exposure keys (my keys history from api)" - - "Share my keys via Email" - - "Submit Exposure Key" - - "Show QR Code" - - "Submit keys to Server" - - "Scan Exposure Key" - - "Last 3 Hours Mode" - - "Check Exposure Summary" - - "Exposure summary" - - "Days since last exposure: %1$s" - - "Attenuation Durations in Minutes: %1$s" - - "Summation Risk Score: %1$s" - - "Matched key count: %1$s" - - "Maximum risk score %1$s" - - "My keys (count: %1$d)" - - "Other key" - - "Calculate Risk Level" - - \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/values-ru/strings.xml b/Corona-Warn-App/src/main/res/values-ru/strings.xml deleted file mode 100644 index 97d4ef1ae66..00000000000 --- a/Corona-Warn-App/src/main/res/values-ru/strings.xml +++ /dev/null @@ -1,1131 +0,0 @@ - - - - - - "shared_preferences_cwa" - - "preference_onboarding_completed" - - "preference_onboarding_completed_timestamp" - - "preference_background_check_done" - - "preference_reset_app" - - "preference_only_wifi" - - "preference_tracing" - - "preference_timestamp_diagnosis_keys_fetch" - - "preference_timestamp_manual_diagnosis_keys_retrieval" - - "preference_m_string_google_api_token" - - "preference_notifications_enabled" - - "preference_notifications_risk_enabled" - - "preference_notifications_test_enabled" - - "preference_background_job_enabled" - - "preference_mobile_data_enabled" - - "preference_registration_token" - - "preference_device_pairing_successful_time" - - "preference_initial_tracing_activation_time" - - "preference_initial_result_received_time" - - "preference_risk_level_score" - - "preference_risk_level_score_successful" - - "preference_timestamp_risk_level_calculation" - - "preference_test_guid" - - "preference_is_allowed_to_submit_diagnosis_keys" - - "preference_auth_code" - - "preference_database_password" - - "preference_total_non_active_tracing" - - "preference_last_non_active_tracing_timestamp" - - "preference_number_successful_submissions" - - "preference_teletan" - - "preference_last_three_hours_from_server" - - "preference_polling_test_result_started" - - "preference_test_result_notification" - - "preference_risk_days_explanation_shown" - - - - - "Назад" - - "Дальше" - - "Меню" - - "Закрыть" - - "Приложение Corona-Warn-App" - - "Кнопка" - - - - - "Обзор" - - "Информация о приложении" - - "Настройки" - - - - "de.rki.coronawarnapp.notification.exposureNotificationChannelId" - - "1" - - "Приложение Corona-Warn-App" - - "Уведомления от Corona-Warn-App" - - "Приложение Corona-Warn-App" - - "Есть новые сообщения от приложения Corona-Warn-App." - - - - - "Доступно обновление" - - "Для дальнейшего использования приложения Corona-Warn-App установите последнее обновление." - - "Обновить" - - - - - "Пока нет контактов" - - - "%1$s контакт" - "%1$s контакта" - "Пока нет контактов" - "%1$s контакта" - "%1$s контакта" - "%1$s контактов" - - - - "%1$s контакт" - "%1$s контакта" - "Пока нет контактов" - "%1$s контакта" - "%1$s контакта" - "%1$s контактов" - - - "Определение риска активно %1$s из 14 прошедших дней." - - "Определение риска постоянно активно." - - "Контакты еще не проверены." - - "Обновлено: %1$s" - - "Обновляется ежедневно" - - "Примечание: ежедневно открывайте приложение для обновления своего статуса риска." - - "Обновить" - - "Обновление через %1$s" - - "Активировать определение риска" - - "Активируйте определение риска, чтобы оценить свой статус риска сегодня." - - "Низкий риск" - - "Повышенный риск" - - - "%1$s день с последнего контакта" - "%1$s дня с последнего контакта" - "%1$s дней с последнего контакта" - "%1$s дня с последнего контакта" - "%1$s дня с последнего контакта" - "%1$s дней с последнего контакта" - - - "Неизвестный риск" - - "С момента активации определения риска не прошло достаточно времени, чтобы рассчитать Ваш риск заражения." - - "Определение риска остановлено" - - "Последнее определение риска:""\n""%1$s" - - "Определение риска невозможно" - - "Не удается обновить определение риска более 24 часов." - - "Ваш статус риска не обновлялся более 48 часов: обновите свой статус риска." - - "Проверка выполняется..." - - "Текущие данные выгружаются и проверяются. Это может занять несколько минут." - - - - - "Часто задаваемые вопросы" - - "Здесь Вы найдете ответы на часто задаваемые вопросы о приложении Corona-Warn-App. Вы будете переадресованы на внешний веб-сайт." - - "https://www.bundesregierung.de/corona-warn-app-faq-englisch" - - "Здесь Вы найдете ответы на часто задаваемые вопросы о приложении Corona-Warn-App. Вы будете переадресованы на внешний веб-сайт." - - - - - "Поделиться Corona-Warn-App" - - "Давайте победим коронавирус вместе" - - "Чем больше пользователей приложения, тем быстрее мы сможем остановить передачу инфекции. Предложите своим родным и друзьям выгрузить приложение." - - "Отправить ссылку для выгрузки" - - "Победим коронавирус вместе""\n""Я участвую, а ты?""\n""https://www.corona-warn-app.de""\n""\n" - - "Человек делится приложением Corona-Warn-App с четырьмя другими людьми." - - - - - "Обзор" - - "Обзор" - - "Определение риска" - - "Определение риска - одна из трех основных функций приложения. Когда она активирована, регистрируются контакты с устройствами других людей. Вам не нужно ничего делать." - - "Риск заражения" - - "Если Вы в течение последних 14 дней контактировали с лицом с положительным тестом на COVID-19, приложение рассчитает Ваш риск заражения. Для этого оцениваются продолжительность и близость контакта." - - "Статус риска может иметь следующие значения:" - - "Повышенный риск" - - "Низкий риск" - - "Неизвестный риск" - - "Уведомление других пользователей" - - "Еще одна из основных функций - регистрация Вашего теста и получение результата. Если у Вас положительный текст на COVID-19, Вы можете уведомить других людей и остановить передачу инфекции." - - "Терминология:" - - "Журнал контактов" - - "Список полученных и случайных идентификаторов, временно сохраненных в хранилище операционной системы. Этот список считывается при проверке контактов. Все случайные идентификаторы автоматически удаляются через 14 дней." - - "Проверка контактов" - - "Данные журнала контактов вызываются и синхронизируются с зарегистрированными заражениями других пользователей. Проверка контактов выполняется автоматически с интервалом около двух часов." - - "Контакты" - - "Продолжительные и близкие контакты с лицом, у которого диагностирован COVID-19." - - "Уведомление о контакте" - - "Отображение уведомлений в приложении Corona-Warn-App." - - "Случайные идентификаторы" - - "Случайные идентификаторы представляют собой комбинации цифр и букв, генерируемые произвольно. Они передаются между устройствами в непосредственной близости. По случайным идентификаторам нельзя отследить конкретных лиц. Они автоматически удаляются через 14 дней. Лица с положительным тестом на COVID-19 могут по желанию поделиться своими случайными идентификаторами за срок до 14 дней с другими пользователями приложения." - - "На смартфоне отображается разное содержимое, пронумерованное от 1 до 3." - - "Главная страница приложения Corona-Warn-App" - - - - - "Ваш статус риска" - - "Инструкции" - - "Вот что Вам нужно сделать" - - "По возможности возвращайтесь домой и оставайтесь дома." - - "Контакты для вопросов о симптомах, доступности тестирования и самоизоляции:" - - "Регулярно мойте руки с мылом не менее 20 секунд." - - "Носите защитную маску при контактах с другими людьми." - - "Соблюдайте расстояние не менее 1,5 м от других людей." - - "Во время чихания и кашля прикрывайте рот сгибом локтя или салфеткой." - - "Ваш врач общей практики" - - "Скорая помощь (тел. 116117)" - - "Местный орган здравоохранения" - - "Риск заражения" - - "Период нахождения в системе" - - "Этот период включен в расчет." - - "Ваш риск заражения можно рассчитать только для периодов активного определения риска, поэтому функция определения должна быть постоянно активной." - - "Определение риска охватывает последние 14 дней. В течение этого времени функция определения на Вашем устройстве была активна %1$s дн. Приложение автоматически удаляет старые журналы, как только они теряют значение для предотвращения заражения." - - "Вот как был рассчитан Ваш риск" - - "Вот как рассчитывается Ваш риск" - - "С момента активации определения риска не прошло достаточно времени, чтобы рассчитать Ваш риск заражения." - - "Не удается обновить определение риска более 24 часов." - - "У Вас низкий риск заражения, поскольку не зарегистрировано контактов с лицами с положительным тестом на COVID-19 или контакты были кратковременными и на большом расстоянии." - - - "У Вас повышенный риск заражения, поскольку %1$s день назад у Вас был продолжительный близкий контакт минимум с одним лицом с положительным тестом на COVID-19." - "У Вас повышенный риск заражения, поскольку %1$s дня назад у Вас был продолжительный близкий контакт минимум с одним лицом с положительным тестом на COVID-19." - "У Вас повышенный риск заражения, поскольку %1$s дней назад у Вас был продолжительный близкий контакт минимум с одним лицом с положительным тестом на COVID-19." - "У Вас повышенный риск заражения, поскольку %1$s дня назад у Вас был продолжительный близкий контакт минимум с одним лицом с положительным тестом на COVID-19." - "У Вас повышенный риск заражения, поскольку %1$s дня назад у Вас был продолжительный близкий контакт минимум с одним лицом с положительным тестом на COVID-19." - "У Вас повышенный риск заражения, поскольку %1$s дней назад у Вас был продолжительный близкий контакт минимум с одним лицом с положительным тестом на COVID-19." - - - "Риск заражения рассчитывается на Вашем устройстве по локальным данным определения риска (продолжительности и близости). Данные риска заражения не показываются и не передаются другим лицам." - - "Поэтому Ваш риск заражения был оценен как низкий. Риск заражения рассчитывается на Вашем устройстве по локальным данным определения риска (продолжительности и близости). Данные риска заражения не показываются и не передаются другим лицам." - - "Поэтому Ваш риск заражения был оценен как повышенный. Риск заражения рассчитывается по локальным данным определения риска (продолжительности и близости) на Вашем устройстве. Данные риска заражения не показываются и не передаются другим лицам. По возвращении домой избегайте близкого контакта с членами вашей семьи." - - @string/risk_card_button_update - - @string/risk_card_button_enable_tracing - - "Ваш статус риска" - - - "Информация о функции определения риска" - - "Подробнее см. на странице часто задаваемых вопросов." - - - - - "Не активировать" - - "Активировать" - - "Отменить" - - "Дальше" - - "Давайте начнем" - - "Назад" - - "Страница адаптации 1 из 5. Победим коронавирус вместе" - - "Давайте победим коронавирус вместе" - - "Более надежная защита для Вас и для всех нас. Приложение Corona-Warn-App поможет быстрее остановить передачу инфекции." - - "Сделайте из Вашего устройства систему предупреждения о коронавирусе. Просматривайте Ваш статус риска и определяйте, были ли у Вас близкие контакты с лицами с положительным тестом на COVID-19 за последние 14 дней." - - "Контакты людей регистрируются в приложении путем обмена зашифрованными случайными идентификаторами между устройствами без доступа к каким-либо персональным данным." - - "Группа людей использует свои смартфоны в городе." - - "Страница адаптации 2 из 5. Конфиденциальность данных. Далее идет подробный текст. Для продолжения нажмите кнопку внизу экрана." - - "Конфиденциальность данных" - - - "На смартфоне одной женщины установлено приложение Corona-Warn-App. Значок замка на фоне щита указывает на шифрование данных." - - "Страница адаптации 3 из 5. Активация определения риска" - - "Как активировать определение риска" - - "Чтобы узнать, есть ли у Вас риск заражения, нужно активировать функцию определения риска." - - "Для определения риска Ваше устройство получает по Bluetooth зашифрованные случайные идентификаторы других пользователей и передает Ваш случайный идентификатор на их устройства. Эту функцию можно деактивировать в любое время." - - "Зашифрованные случайные идентификаторы передают другим людям только информацию о дате, продолжительности и близости (по силе сигнала) контакта. Персональные данные, такие как имя, адрес или местоположение, никогда не регистрируются. Идентификация лица невозможна." - - "Информация о приложении простым языком и на языке жестов" - - "Заявление о согласии" - - "Чтобы узнать, был ли у Вас контакт с инфицированным лицом и есть ли риск заражения, Вам необходимо активировать в Приложении функцию \"Определение риска\". Вы даете свое согласие на активацию определения риска и соответствующую обработку данных, нажав \"Активировать определение риска\".""\n""\n""Для использования функции определения риска Вам также необходимо активировать на своем смартфоне разработанную компанией Google функцию записи контактов „COVID-19: отслеживание контактов“ и разрешить допуск к мобильному приложению Corona-Warn-App.""\n""\n""При активации функции записи контактов Ваш смартфон автоматически генерирует и посылает через Bluetooth случайные коды, которые могут быть получены другими смартфонами Apple и Android вблизи от Вас, в которых также активирована функция записи контактов. В свою очередь, Ваш смартфон получает случайные коды других смартфонов. Ваши собственные и полученные с других смартфонов случайные коды хранятся в течение 14 дней в журнале контактов функции «COVID-19: отслеживание контактов».""\n""\n""Для определения Вашего риска заражения Приложение загружает в течение дня, неоднократно или по запросу, список случайных кодов всех пользователей, которые сообщили через Приложение о своем подтвержденном диагнозе. Затем данный список сравнивается со списком случайных кодов, сохраненных в журнале контактов функции записи контактов. Если при этом Приложение зафиксирует возможный контакт с инфицированным пользователем, Приложение уведомит Вас о контакте с инфицированным лицом и о риске заражения. В этом случае Приложение получит доступ к остальным данным, сохраненным в журнале контактов функции «COVID-19: отслеживание контактов» Вашего смартфона (дата, длительность контакта и сила сигнала Bluetooth).""\n""\n""Сила сигнала Bluetooth помогает определить расстояние (чем сильнее сигнал, тем меньше расстояние). Приложение обрабатывает эти данные для того, чтобы оценить для Вас риск заражения коронавирусом и предоставить Вам рекомендации для дальнейших действий. Данная обработка данных осуществляется исключительно локально на Вашем смартфоне. Никто (в том числе ИРК), кроме Вас, не узнает о том, находились ли Вы в контакте с инфицированным лицом и каким был результат оценки риска заражения.""\n""\n""Чтобы отозвать свое согласие на определение риска, Вы можете деактивировать эту функцию в Приложении, нажав на ползунок, или удалить Приложение. Если Вы хотите снова использовать определение степени риска, активируйте заново ползунок или снова установите Приложение. При отключении функции определения риска Приложение больше не проверяет, был ли у Вас контакт с инфицированным пользователем. Чтобы остановить отправку и получение случайных кодов, Вам необходимо отключить в настройках Вашего смартфона функцию «COVID-19: отслеживание контактов». Обратите внимание, что Ваши и сторонние случайные коды, сохраненные в журнале контактов функции «COVID-19: отслеживание контактов» не удаляются в Приложении. Сохраненные данные в журнале контактов функции «COVID-19: отслеживание контактов» Вы можете удалить на долгосрочный период только в настройках смартфона.""\n""\n""Политика конфиденциальности Приложения (в том числе информация об обработке данных для определения степени риска) доступна в пункте меню «Информация о конфиденциальности данных»." - - "Активировать определение риска" - - "Авторизация" - - "Это означает, что приложение Corona-Warn-App не может отправлять и получать уведомления о Вашем статусе риска заражения COVID-19. Вы можете деактивировать эту функцию в любое время." - - "Не активировать" - - "Назад" - - "Обновление в фоновом режиме отключено" - - "Вы отключили обновление приложения Corona-Warn-App в фоновом режиме. Включите обновление в фоновом режиме для использования автоматического определения риска. При отключенном обновлении в фоновом режиме определение риска можно запустить только вручную. Активировать обновление в фоновом режиме можно в настройках своего устройства." - - "Открыть настройки устройства" - - "Запустить определение риска вручную" - - "Разрешить приоритетную фоновую активность" - - "Включите приоритетную фоновую активность, чтобы разрешить приложению влюбое время определять Ваш статус риска в фоновом режиме (рекомендуется). Такая настройка отключает оптимизацию расхода заряда аккумулятора только для приложения Corona-Warn-App. Мы не предполагаем, что это может существенно снизить расход Вашего аккумулятора.\n\nПри отказе от данной настройки рекомендуем Вам открывать приложении вручную хотя бы раз в 24 часа." - - "Разрешить" - - "Не разрешать" - - "Приоритетная фоновая активность отключена" - - "Обратите внимание, что при отключении приоритетной фоновой активности Вам нужно раз в 24 часа открывать приложение вручную, чтобы определить свой статус риска.\n\nВы в любое время можете включить приоритетную фоновую активность в настройках." - - "ОК" - - "Три человека активировали определение риска на своих устройствах, то есть их контакты друг с другом будут регистрироваться." - - "Разрешить доступ к местоположению" - - "Доступ к Вашему местоположению невозможен. Чтобы использовать Bluetooth, Google и/или Android требуется доступ к местоположению Вашего устройства." - - "Открыть настройки устройства" - - "Страница адаптации 4 из 5. Если у Вас положительный тест на COVID-19..." - - "Если у Вас положительный тест на COVID-19..." - - "…Укажите это в приложении Corona-Warn-App. Предоставление результата Вашего теста является добровольным и безопасным. Просим Вас об этом ради здоровья других людей." - - "Ваше уведомление шифруется для защиты и обрабатывается на безопасном сервере. Людям, от которых Ваше устройство получило зашифрованные случайные идентификаторы, отправляется предупреждение вместе с рекомендуемыми действиями." - - "Зашифрованная информация о положительном тесте передается в систему, и другим пользователям отправляются предупреждения." - - "Страница адаптации 5 из 5. Получение предупреждений и определение риска" - - "Получение предупреждений и определение риска" - - "Приложение может автоматически уведомлять о Вашем статусе риска и предупреждать о новых инфицированных людях среди Ваших контактов. Разрешите приложению уведомлять Вас." - - "Тогда Вы сможете самоизолироваться для защиты окружающих и узнать, где сдать тест." - - "Женщина получает уведомление от приложения Corona-Warn-App." - - - - - "Настройки" - - "Вкл." - - "Выкл." - - "Определение риска" - - "Вот как работает определение риска" - - "Разрешите генерацию и предоставление случайных идентификаторов COVID-19." - - "Определение риска активно" - - "Определение риска остановлено" - - "Сервисы определения местоположения отключены" - - "Чтобы определить наличие риска заражения включите функцию определения риска. Для идентификации риска Ваше устройство должно получать по Bluetooth зашифрованные случайные идентификаторы других пользователей и передавать Ваш случайный идентификатор на их устройства. Эту функцию можно в любое время отключить.""\n""\nЗашифрованные случайные идентификаторы передают другим людям только информацию о дате, продолжительности и близости (рассчитанной по силе сигнала) контакта. Персональные данные, например имя, адрес или местоположение, никогда не регистрируются. Персональная идентификация невозможна." - - "Активно" - - "Остановлено" - - "Ограничено" - - "Нет соединения с Интернетом" - - "Bluetooth выключен" - - "Включить Bluetooth" - - "Bluetooth нужно включить для регистрации контактов функцией определения риска. Включите Bluetooth в настройках вашего устройства." - - "Открыть настройки устройства" - - "Разрешить доступ к местоположению" - - "Доступ к Вашему местоположению невозможен. Чтобы использовать Bluetooth, Google и/или Android требуется доступ к местоположению Вашего устройства." - - "Открыть настройки устройства" - - "Установить соединение с Интернетом" - - "Для расчета контактов функцией определения риска требуется соединение с Интернетом. Включите Wi-Fi или мобильные данные в настройках устройства." - - "Открыть настройки устройства" - - - "Определение риска активно в течение %1$s дня.\nДля надежной проверки контактов функция определения риска должна быть активна всегда." - "Определение риска активно в течение %1$s дня.\nДля надежной проверки контактов функция определения риска должна быть активна всегда." - "Определение риска активно в течение %1$s дней.\nДля надежной проверки контактов функция определения риска должна быть активна всегда." - "Определение риска активно в течение %1$s дней.\nДля надежной проверки контактов функция определения риска должна быть активна всегда." - "Определение риска активно в течение %1$s дней.\nДля надежной проверки контактов функция определения риска должна быть активна всегда." - "Определение риска активно в течение %1$s дней.\nДля надежной проверки контактов функция определения риска должна быть активна всегда." - - - "Три человека активировали определение риска на своих устройствах, то есть их контакты друг с другом будут регистрироваться." - - "Человек деактивировал определение риска на своем смартфоне, то есть его контакты с двумя другими людьми не будут регистрироваться." - - "Человек выключил Bluetooth на своем смартфоне, то есть его контакты с двумя другими людьми не будут регистрироваться." - - - - "Человек отключил соединение с Интернетом на своем смартфоне, то есть его контакты с двумя другими людьми не будут регистрироваться." - - - "Уведомления" - - "Активировать уведомления о Вашем статусе риска заражения COVID-19?" - - "Уведомления деактивированы" - - "Разрешить автоматические уведомления о статусе риска заражения COVID-19" - - "Укажите уведомления, которые Вы хотите получать." - - "Чтобы активировать уведомления, нужно разрешить уведомления от приложения Corona-Warn-App в настройках Вашего устройства." - - "Активировать уведомления" - - "Уведомления" - - "Ваш риск заражения изменился" - - "Статус Вашего теста на COVID-19" - - "Открыть настройки устройства" - - "Женщина получает уведомление от приложения Corona-Warn-App." - - "Женщина деактивировала уведомления от приложения Corona-Warn-App." - - "Сбросить приложение" - - "Удалить все Ваши данные в приложении." - - "Действительно сбросить приложение?" - - "Вы больше не будете получать уведомления о контактах и не сможете предупреждать других пользователей." - - "Удалить журнал ""\n""контактов" - - "Журнал контактов удаляется отдельно в настройках Вашего устройства." - - "Сбросить приложение" - - "Отменить" - - "Рука держит смартфон, на котором отображается значок выполняемого сброса приложения." - - "Сбросить приложение" - - "Вы больше не будете получать уведомления о контактах и не сможете предупреждать других пользователей. Это действие нельзя отменить." - - "Отменить" - - "Сброс" - - "Приоритетная фоновая активность" - - "Разрешить автоматические обновления статуса риска" - - "Запускать Corona-Warn-App в фоновом режиме" - - "Приложение Corona-Warn-App всегда работает в фоновом режиме, если активировать приоритетную фоновую активность. Это позволяет приложению определять Ваш статус риска в любое время." - - - - "Чтобы отключить приоритетную фоновую активность, деактивируйте ее в нстройках устройства." - - "Открыть настройки устройства" - - "Отключить приоритетную фоновую активность" - - - - - "Информация о приложении" - - "Версия: %1s" - - "О приложении" - - "Давайте победим коронавирус вместе" - - "Институт Роберта Коха (РКИ) — это центральный федеральный институт Германии в области здравоохранения. По поручению федерального правительства РКИ выпустил приложение Corona-Warn-App. Приложение задумано как цифровое дополнение к уже принятым санитарным мерам: социальной дистанции, гигиене и ношению защитных масок." - - "Каждый пользователь приложения помогает отслеживать и останавливать передачу инфекции. Приложение регистрирует контакты с другими людьми локально на вашем устройстве. Вы получаете уведомления о контактах с людьми, которые впоследствии получили положительный результат теста на COVID-19. Ваши персональные данные и конфиденциальность надежно защищены." - - "Группа людей использует свои смартфоны в городе." - - "Конфиденциальность данных" - - "На смартфоне одной женщины установлено приложение Corona-Warn-App. Значок замка на фоне щита указывает на шифрование данных." - - "privacy_ru.html" - - "Условия использования" - - "Содержимое" - - "Рука держит смартфон с длинным текстом на экране. Рядом с текстом отображается галочка, символизирующая принятия условий использования." - - "terms_ru.html" - - "Горячая линия по техническим вопросам" - - "Чем мы можем Вам помочь?" - - "По техническим вопросам о приложении Corona-Warn-App обращайтесь на нашу горячую линию." - - "Горячая линия по техническим вопросам:" - - "+49 800 7540001" - - "+49 800 7540001" - - "Наша служба поддержки всегда готова помочь." - - "Языки: немецкий, английский, турецкий\nЧасы работы:""\n""пн-сб, 7:00-22:00""\n(кроме государственных праздников)""\nВсе звонки бесплатны." - - "По всем медицинским вопросам обращайтесь к вашему врачу общей практики или в скорую помощь по телефону: 116 117." - - "Человек совершает телефонный звонок с использованием гарнитуры." - - "Часто задаваемые вопросы" - - "Часто задаваемые вопросы. Вы будете переадресованы на внешний веб-сайт." - - "Правовые уведомления" - - "Рука держит смартфон с длинным текстом на экране. Рядом с текстом отображается значок весов, представляющий правовые уведомления." - - "technical_ru.html" - - "Правовая информация" - - "Опубликовано" - - "(ответственность согласно § 5 п. 1 TMG, § 55 п. 1 RStV, DS-GVO, BDSG)" - - "Институт Роберта Коха""\n""Nordufer 20""\n""13353 Berlin (Германия)""\n""\n""в лице его президента" - - "Контакты" - - "E-mail: CoronaWarnApp@rki.de" - - "Форма контакта" - - "Contact Form in ""English"" or ""German" - - "ИНН" - - "DE 165 893 430" - - "Рука держит смартфон с длинным текстом на экране. Рядом с текстом отображается значок параграфа, представляющий правовую информацию." - - - - - - "Ошибка" - - "Не удалось установить соединение (%1$d). Повторите попытку." - - "Не удалось установить соединение. Повторите попытку." - - "Назад" - - - "Ошибка" - - "QR-код/TAN недействителен или уже использовался. Повторите попытку или обратитесь на горячую линию по техническим вопросам по пути: Информация о приложении -> Горячая линия по техническим вопросам." - - "Назад" - - - "Ошибка" - - "Не удалось сгенерировать TAN для отправки. Обратитесь на горячую линию по техническим вопросам по пути: Информация о приложении -> Горячая линия по техническим вопросам." - - "Назад" - - - "Ошибка" - - "Сгенерированный TAN не действителен для отправки. Обратитесь на горячую линию по техническим вопросам, выбрав: Информация о приложении → Горячая линия по техническим вопросам." - - "Назад" - - - "В тесте есть ошибки" - - "Обнаружена проблема при анализе вашего теста. Ваш QR-код уже просрочен." - - "ОК" - - - - "Требуется разрешение на доступ к камере" - - "Разрешить приложению использовать камеру для сканирования QR-кода." - - "Разрешить" - - "Не разрешать" - - - - "Требуется доступ к камере" - - "Откройте системные настройки и разрешите приложению использовать камеру для сканирования QR-кода." - - "ОК" - - - - "Недействительный QR-код." - - "QR-код недействительный или уже зарегистрирован на другом смартфоне. Повторите попытку. Вы получите результат теста из центра тестирования или выполнившей тест лаборатории вне зависимости от действительности QR-кода. Если у вас диагностирован COVID-19, вы получите уведомление от соответствующего органа здравоохранения." - - "Повторите попытку." - - "Отменить" - - - "Наведите рамку на QR-код." - - "Наведите рамку на QR-код." - - - - "Результат теста" - - "Как это работает:" - - "Тест успешно добавлен." - - "Ваш тест сохранен в приложении Corona-Warn-App." - - "Результат теста еще не доступен" - - "Ваш результат теста еще не доступен." - - "Обновить" - - "Удалить тест" - - "Ваш результат теста" - - "Лабораторное исследование не показало инфицирования коронавирусом SARS-CoV-2.\n\nУдалите тест из приложения Corona-Warn-App, чтобы здесь можно было сохранить новый код теста." - - "Удалить тест" - - "Ваш результат теста" - - "Ваш результат теста положительный." - - "Предупреждение других людей" - - "Предоставьте ваши случайные идентификаторы за последние 14 дней, чтобы защитить других людей и остановить передачу инфекции." - - "Дальше" - - "Ваш результат теста" - - "При анализе вашего теста возникла проблема. Обратитесь в центр тестирования или выполнявшую тест лабораторию за дальнейшими рекомендациями.\n\nУдалите тест из приложения Corona-Warn-App, чтобы здесь можно было сохранить новый код теста." - - "Удалить тест" - - "Требуется определение риска" - - "Активируйте определение риска, чтобы предупредить других людей" - - "ОК" - - "Тест можно отсканировать только один раз." - - "После удаления теста вы не сможете запросить результат тестирования. Вы получите результат теста из центра тестирования или выполнившей тест лаборатории вне зависимости от приложения. Если у вас диагностирован COVID-19, вы получите уведомление от соответствующего органа здравоохранения. " - - "Удалить" - - "Отменить" - - "Положительный тест на SARS-CoV-2" - - "Ваш тест на вирус SARS-CoV-2 положительный." - - - - "Ввод TAN" - - "Введите полученный 10-значный TAN." - - "Дальше" - - "Ввод TAN" - - "Неверный TAN, проверьте введенные данные." - - "Неверно, проверьте введенные данные." - - - - "Вы сдали тест?" - - "Вот как работает приложение Corona-Warn-App" - - "Чтобы приложение работало, нам нужна поддержка людей с положительным тестом на COVID-19.\n\nПоскольку передаются только зашифрованные случайные идентификаторы, анонимность будет сохранена. Вы можете выполнить следующие действия:" - - "Дальше" - - "Зашифрованная информация о положительном тесте передается в систему, и другим пользователям отправляются предупреждения." - - - "Если у Вас положительный тест на COVID-19, Вы можете уведомить других людей." - "Если Вы получили TAN для положительного теста, можете зарегистрировать свой тест по нему." - "Если у Вас нет TAN, Вы можете запросить его по телефону." - - - "Вы сдали тест? Вот как работает приложение Corona-Warn-App" - - - - "Выбор" - - "Какая информация есть у Вас?" - - "Документ с QR-кодом" - - "Отсканируйте QR-код из документа, чтобы зарегистрировать Ваш тест." - - "Заявление о согласии" - - "Нажав на «Принимаю», Вы соглашаетесь с тем, что Приложение вправе узнавать о статусе Вашего теста на коронавирус и высвечивать его в Приложении. Эта функция доступна, если Вы получили QR-код и дали свое согласие на передачу результатов теста в серверную систему Приложения. После того как тестирующая лаборатория разместит результаты теста на сервере, Вы сможете увидеть их в Приложении. Если Вы активировали уведомления, Вас проинформируют о получении результатов теста и вне Приложения. Сам же результат теста, тем не менее, будет показан только в Приложении, в целях обеспечения конфиденциальности. Вы можете в любое время отозвать данное согласие, удалив в Приложении регистрирование теста. Отзыв согласия не затрагивает правомерность обработки, осуществлявшейся до него. Дальнейшую информацию см. в пункте меню «Информация о конфиденциальности данных»." - - "Принимаю" - - "Не принимаю" - - "TAN" - - "Чтобы зарегистрировать Ваш тест, введите TAN вручную." - - "Запросить TAN" - - "Позвоните нам, если у Вас положительный тест на COVID-19." - - "Какая информация есть у Вас?" - - - - "Предупреждение других людей" - - "Помогите всем нам!" - - "Далее Вы можете разрешить приложению Corona-Warn-App предоставление ваших случайных идентификаторов за последние 14 дней другим людям. Так Вы предупредите их и поможете остановить передачу инфекции.\n\nПоскольку передаются только обезличенные случайные идентификаторы, Ваша анонимность сохраняется." - - "Конфиденциальность данных" - - "Нажав на «Принимаю», Вы выражаете свое согласие на передачу Приложением положительного результата Вашего теста вместе с Вашими случайными кодами за последние 14 дней в серверную систему Приложения, чтобы другие пользователи Приложения с активированной функцией определения риска были автоматически проинформированы о том, что они могли быть подвержены риску заражения. Передаваемые случайные коды не содержат никакой информации, которая бы раскрыла Вашу личность.\n\nПередача Вашего результата теста через Приложение является добровольной. Если Вы не передадите результат своего теста, никакого наказания не последует. Ввиду того, что невозможно проследить и проконтролировать, пользуетесь ли Вы Приложением и как Вы это делаете, никто, кроме Вас, не будет знать, передали ли Вы информацию об инфицировании.\n\nВы можете в любое время отозвать свое согласие, удалив Приложение. Отзыв согласия не затрагивает правомерность обработки, осуществлявшейся до момента отзыва. Дальнейшую информацию см. в пункте меню «Информация о конфиденциальности данных»." - - "Дальше" - - "Устройство передает зашифрованную информацию о положительном тесте в систему." - - - - - "Спасибо!" - - "Ваш вклад очень ценен. Благодарим за поддержку. Теперь другие люди получат предупреждение и смогут принять необходимые меры." - - "Внимание!" - - "Вы заразны." - - "Изолируйтесь от других людей." - - "Дополнительная информация:" - - - "Карантин обычно длится 14 дней. Наблюдайте за симптомами и их развитием." - "Ваш местный орган здравоохранения попросит Вас составить список людей, с которыми Вы контактировали. Вам нужно указать всех людей, с которыми у Вас были близкие контакты (личное общение на расстоянии менее 2 м) дольше 15 мин в последние два дня до появления у Вас симптомов." - "Особенно важно вспомнить людей, которые не будут уведомлены приложением, так как у них нет установленного приложения или даже смартфона." - "Даже если у Вас больше нет симптомов и Вы чувствуете себя хорошо, Вы еще можете быть заразны." - - - "Готово" - - "Группа людей радуется, потому что кто-то поделился результатом теста." - - - - "Запросить TAN" - - "Как это работает:" - - "Для запроса TAN просим Вас подготовить результат теста (если есть) и Ваш номер телефона.\n\nЧтобы обратиться на горячую линию по телефону, слабослышащие могут использовать услуги Tess Relay (перевод с немецкого письменного языка на язык жестов и обратно). ПО можно выгрузить с Google Play." - - "Позвонить" - - "Ввести TAN" - - "Позвоните на горячую линию и запросите TAN:" - - "+49 800 7540002" - - "+49 800 7540002" - - "Чтобы зарегистрировать тест, введите TAN в приложении." - - "Языки: \nнемецкий, английский, турецкий\n\nЧасы работы:\nпн-вс, круглосуточно\n\nВсе звонки бесплатны." - - - "Позвонить на горячую линию и запросить TAN" - - "Первый шаг - это звонок на горячую линию для запроса TAN. Телефон горячей линии: +49 800 7540002. Она работает с 8:00 до 22:00 с понедельника по пятницу и с 10:00 до 22:00 в субботу и воскресенье. Все звонки бесплатны." - - "Второй шаг - регистрация Вашего теста в приложении по полученному TAN." - - - - "Данные вызываются..." - - "Вы сдали тест?" - - "Ваш результат еще не доступен" - - "Ваш результат доступен" - - "Положительный тест" - - "Недействительный тест" - - "Отрицательный тест" - - "Ваш результат обновляется" - - "Уведомьте других людей, чтобы остановить передачу инфекции." - - "Анализ вашего теста еще не завершен." - - "Не удалось проанализировать ваш тест." - - "Ваш тест на SARS-CoV-2 положительный." - - "Ваш тест на SARS-CoV-2 отрицательный." - - "Узнать больше и помочь" - - "Просмотреть тест" - - "Внимание!" - - "Вы заразны. Изолируйтесь от других людей." - - "Ваш местный орган здравоохранения свяжется с Вами в ближайшие дни по телефону или почте." - - "Поделитесь Вашими случайными идентификаторами, чтобы предупредить других людей." - - - "Ваш диагноз:" - - "SARS-CoV-2" - - "Зарегистрировано %s" - - "Отрицательный" - - "Положительный" - - "Анализ невозможен" - - "Ваш результат пока не доступен" - - "Дополнительная информация:" - - - "Все еще плохо себя чувствуете? Если Вам плохо и/или симптомы ухудшились, обратитесь к Вашему врачу общей практики." - "Оставайтесь дома до выздоровления. Заражение коронавирусом (SARS-CoV-2) в ослабленном состоянии из-за другой инфекции может привести к серьезным осложнениям." - "Не ходите на работу, если Вы плохо себя чувствуете, чтобы не ставить под угрозу здоровье других людей. Если симптомы ухудшились, сдайте тест на SARS-CoV-2." - - - - - "На предыдущую страницу" - - "Кнопка \"Продолжить\"" - - "Поделиться" - - "Меню" - - "Кнопка" - - "Изображение" - - - - "Нет соединения с Интернетом." - - "Недостаточно свободного места в памяти." - - "Ошибка связи с интерфейсом Google" - - "Невозможно выполнить это действие. Обратитесь на горячую линию." - - "Приложение Corona-Warn-App правильно установлено, но сервис уведомления о контактах с лицами, инфицированными COVID-19 недоступен в операционной системе Вашего смартфона. Это означает, что Вы не можете использовать Corona-Warn-App. Подробнее см. на странице часто задаваемых вопросов: https://www.coronawarn.app/en/faq/" - - "Приложение Corona-Warn-App выполняется корректно, но мы не можем обновить Ваш текущий статус риска. Определение риска остается активным и выполняется корректно. Подробнее см. на странице часто задаваемых вопросов: https://www.coronawarn.app/en/faq/" - - - - "Что-то пошло не так." - - "Причина" - - "ОК" - - "Сведения" - - "Неизвестная ошибка." - - - - "Lorem Ipsum" - - "Test API" - - "Test Risk Level" - - "Test Notification" - - "Android API Test(Manual Test)" - - "Start (Broadcast/Receive Bluetooth)" - - "Get Exposure keys (my keys history from api)" - - "Share my keys via Email" - - "Submit Exposure Key" - - "Show QR Code" - - "Submit keys to Server" - - "Scan Exposure Key" - - "Last 3 Hours Mode" - - "Check Exposure Summary" - - "Exposure summary" - - "Days since last exposure: %1$s" - - "Attenuation Durations in Minutes: %1$s" - - "Summation Risk Score: %1$s" - - "Matched key count: %1$s" - - "Maximum risk score %1$s" - - "My keys (count: %1$d)" - - "Other key" - - "Calculate Risk Level" - - \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index 1e7d94d268f..167cf47779f 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -166,7 +166,7 @@ "Updated daily" - + "Note: Please open the app daily to update your risk status." "Update" @@ -278,7 +278,7 @@ "Exposures" - "Encounters over a longer duration and close proximity to people diagnosed with COVID-19." + "Encounters over an extended period and in close proximity to a person diagnosed with COVID-19." "Exposure Notification" @@ -307,7 +307,7 @@ "If you have questions about symptoms, testing availability, or self-isolation, please contact one of the following:" - "Wash your hands regularly." + "Wash your hands regularly, with soap, for 20 seconds." "Wear a face mask when you encounter other people." @@ -413,7 +413,7 @@ "The encrypted random IDs only pass information about date, duration and proximity (using signal strength) to other people. Personal data such as name, address, location is never recorded. Individuals cannot be identified." - Informationen zur App in leichter Sprache und Gebärdensprache + "App Information in Simplified Language and Sign Language" "Declaration of Consent" @@ -693,11 +693,11 @@ "Contact" - "E-Mail: CoronaWarnApp@rki.de" + "E-mail: CoronaWarnApp@rki.de" - Contact Form + "Contact Form" - Contact Form in English or German + "Contact Form in ""English"" or ""German" "VAT identification number" @@ -767,9 +767,9 @@ - "Incorrect QR code" + "QR code is invalid" - "The QR code is not correct. Please try again." + "The QR code is invalid or has been registered on another smartphone already. You will receive your test result from the test center or laboratory regardless of the validity of the QR code. If you are diagnosed with COVID-19, you will be notified by the public health authority." "Please try again." @@ -816,7 +816,7 @@ "Your Test Result" - "There was a problem evaluating your test. Please contact the public health authority to find out how to proceed.\n\nPlease delete the test from your Corona-Warn-App so that you will be able to save a new test code there, if necessary." + "There was a problem evaluating your test. Please contact the test center or laboratory involved to find out how to proceed.\n\nPlease delete the test from your Corona-Warn-App so that you will be able to save a new test code there, if necessary." "Delete Test" @@ -826,9 +826,9 @@ "OK" - "Delete the test?" + "The test can only be scanned once." - "The test will be permanently deleted from the Corona-Warn-App and cannot be added again. This procedure cannot be undone." + "If you delete the test, you can no longer retrieve your test result. You receive your test result from the test center or laboratory, independently of the app. If you are diagnosed with COVID-19, you will be notified by the public health authority." "Remove" @@ -948,7 +948,7 @@ "How this works:" - "Please keep your test result (if available) and your phone number ready to request a TAN." + "Please keep your test result (if available) and your phone number ready to request a TAN.\n\nPeople with hearing impairments can use Tess Relay services (interpreting between German written language and sign language) to contact the phone hotline. You can download the software from Google Play." "Call" diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/playbook/PlaybookImplTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/playbook/PlaybookImplTest.kt index 3ddfb092af1..60cf0a73826 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/playbook/PlaybookImplTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/playbook/PlaybookImplTest.kt @@ -115,7 +115,6 @@ class PlaybookImplTest { assertRequestPattern(server) } - @Test fun hasRequestPatternWhenRealRequestFails_testResult(): Unit = runBlocking { val server = MockWebServer() @@ -162,5 +161,4 @@ class PlaybookImplTest { assertThat(server.takeRequest().path, Matchers.startsWith("/verification/")) assertThat(server.takeRequest().path, Matchers.startsWith("/submission/")) } - -} \ No newline at end of file +} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/service/SubmissionServiceTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/service/SubmissionServiceTest.kt index 00d958ccaed..d8eae0c49d4 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/service/SubmissionServiceTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/service/SubmissionServiceTest.kt @@ -8,7 +8,6 @@ import okhttp3.mockwebserver.MockWebServer import org.junit.Assert import org.junit.Test - class SubmissionServiceTest { @Test diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/service/VerificationServiceTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/service/VerificationServiceTest.kt index fc80e2f344f..3dde34e4171 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/service/VerificationServiceTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/service/VerificationServiceTest.kt @@ -10,7 +10,6 @@ import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.Matchers.equalTo import org.junit.Test - class VerificationServiceTest { @Test @@ -58,4 +57,4 @@ class VerificationServiceTest { ) } } -} \ No newline at end of file +} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/transaction/SubmitDiagnosisKeysTransactionTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/transaction/SubmitDiagnosisKeysTransactionTest.kt index da3ead756a7..c43d6b9ebd0 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/transaction/SubmitDiagnosisKeysTransactionTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/transaction/SubmitDiagnosisKeysTransactionTest.kt @@ -39,7 +39,7 @@ class SubmitDiagnosisKeysTransactionTest { @Before fun setUp() { MockKAnnotations.init(this) - + mockkObject(WebRequestBuilder.Companion) every { WebRequestBuilder.getInstance() } returns webRequestBuilder diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/MockWebServerUtil.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/MockWebServerUtil.kt index d0a1ec7f072..5a908210db8 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/MockWebServerUtil.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/MockWebServerUtil.kt @@ -47,4 +47,4 @@ fun RecordedRequest.requestHeaderWithoutContentLength() = .joinToString("\n") fun RecordedRequest.headerSizeIgnoringContentLength() = - requestHeaderWithoutContentLength().utf8Size() \ No newline at end of file + requestHeaderWithoutContentLength().utf8Size()