diff --git a/Corona-Warn-App/build.gradle b/Corona-Warn-App/build.gradle index 234312729c8e8f4da3f197e6b89e71595a19e36e..f96ff2b5c72c7cb822b610468eb1cc3872ade337 100644 --- a/Corona-Warn-App/build.gradle +++ b/Corona-Warn-App/build.gradle @@ -40,7 +40,7 @@ android { applicationId 'de.rki.coronawarnapp' minSdkVersion 23 targetSdkVersion 29 - versionCode 39 + versionCode 42 versionName "1.4.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -309,7 +309,7 @@ dependencies { implementation 'joda-time:joda-time:2.10.6' // SECURITY - implementation "androidx.security:security-crypto:1.0.0-rc02" + implementation "androidx.security:security-crypto:1.0.0-rc03" implementation 'net.zetetic:android-database-sqlcipher:4.4.0' implementation 'org.conscrypt:conscrypt-android:2.4.0' diff --git a/Corona-Warn-App/config/detekt.yml b/Corona-Warn-App/config/detekt.yml index 5a483363dc80a7702453dac0b684dd37b27b49ec..0d06a280c125c8b8c72ebac0e0e8d104882ef824 100644 --- a/Corona-Warn-App/config/detekt.yml +++ b/Corona-Warn-App/config/detekt.yml @@ -568,7 +568,7 @@ style: active: false ReturnCount: active: true - max: 2 + max: 6 excludedFunctions: 'equals' excludeLabeled: false excludeReturnFromLambda: true diff --git a/Corona-Warn-App/src/device/java/de/rki/coronawarnapp/ui/main/MainFragment.kt b/Corona-Warn-App/src/device/java/de/rki/coronawarnapp/ui/main/MainFragment.kt index 1497361028fcaf932a437764a4da710305f269c8..eace8dd5a4b3c93757e7f7dd1986ad0600143a63 100644 --- a/Corona-Warn-App/src/device/java/de/rki/coronawarnapp/ui/main/MainFragment.kt +++ b/Corona-Warn-App/src/device/java/de/rki/coronawarnapp/ui/main/MainFragment.kt @@ -20,6 +20,8 @@ import de.rki.coronawarnapp.ui.viewmodel.TracingViewModel import de.rki.coronawarnapp.util.DialogHelper import de.rki.coronawarnapp.util.ExternalActionHelper import de.rki.coronawarnapp.util.ui.viewBindingLazy +import de.rki.coronawarnapp.util.di.AppInjector +import de.rki.coronawarnapp.util.errors.RecoveryByResetDialogFactory import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -41,6 +43,10 @@ class MainFragment : Fragment(R.layout.fragment_main) { private val submissionViewModel: SubmissionViewModel by activityViewModels() private val binding: FragmentMainBinding by viewBindingLazy() + private val errorResetTool by lazy { + AppInjector.component.errorResetTool + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.tracingViewModel = tracingViewModel @@ -53,6 +59,19 @@ class MainFragment : Fragment(R.layout.fragment_main) { showOneTimeTracingExplanationDialog() } + override fun onActivityCreated(savedInstanceState: Bundle?) { + super.onActivityCreated(savedInstanceState) + + if (errorResetTool.isResetNoticeToBeShown) { + RecoveryByResetDialogFactory(this).showDialog( + detailsLink = R.string.errors_generic_text_catastrophic_error_encryption_failure, + onDismiss = { + errorResetTool.isResetNoticeToBeShown = false + } + ) + } + } + override fun onResume() { super.onResume() // refresh required data @@ -133,7 +152,7 @@ class MainFragment : Fragment(R.layout.fragment_main) { private fun toSubmissionIntro() { findNavController().doNavigate( MainFragmentDirections.actionMainFragmentToSubmissionIntroFragment() - ) + ) } private fun showPopup(view: View) { diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/ui/main/MainFragment.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/ui/main/MainFragment.kt index 715f99a8e8d198f3eedfb49c65c9f64d049b96ea..e294c6778e3475ff9ebcf7887fad3904578a6074 100644 --- a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/ui/main/MainFragment.kt +++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/ui/main/MainFragment.kt @@ -19,7 +19,9 @@ import de.rki.coronawarnapp.ui.viewmodel.SubmissionViewModel import de.rki.coronawarnapp.ui.viewmodel.TracingViewModel import de.rki.coronawarnapp.util.DialogHelper import de.rki.coronawarnapp.util.ExternalActionHelper +import de.rki.coronawarnapp.util.di.AppInjector import de.rki.coronawarnapp.util.ui.viewBindingLazy +import de.rki.coronawarnapp.util.errors.RecoveryByResetDialogFactory import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -41,6 +43,10 @@ class MainFragment : Fragment(R.layout.fragment_main) { private val submissionViewModel: SubmissionViewModel by activityViewModels() private val binding: FragmentMainBinding by viewBindingLazy() + private val errorResetTool by lazy { + AppInjector.component.errorResetTool + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.tracingViewModel = tracingViewModel @@ -53,6 +59,19 @@ class MainFragment : Fragment(R.layout.fragment_main) { showOneTimeTracingExplanationDialog() } + override fun onActivityCreated(savedInstanceState: Bundle?) { + super.onActivityCreated(savedInstanceState) + + if (errorResetTool.isResetNoticeToBeShown) { + RecoveryByResetDialogFactory(this).showDialog( + detailsLink = R.string.errors_generic_text_catastrophic_error_encryption_failure, + onDismiss = { + errorResetTool.isResetNoticeToBeShown = false + } + ) + } + } + override fun onResume() { super.onResume() // refresh required data diff --git a/Corona-Warn-App/src/main/assets/privacy_de.html b/Corona-Warn-App/src/main/assets/privacy_de.html index 43a28a5ea27729b881fb63d5e9112899523b98a3..67ffd4ec0154d208e64e6caa5631715e6b9a0c50 100644 --- a/Corona-Warn-App/src/main/assets/privacy_de.html +++ b/Corona-Warn-App/src/main/assets/privacy_de.html @@ -159,7 +159,7 @@ Wenn Sie auf Ihrem Smartphone die betriebssystemseitige Funktion zur Begegnungs-Aufzeichnung aktivieren, versendet Ihr Smartphone per Bluetooth Low Energy kontinuierlich zufallsgenerierte Kennnummern, auch als - Zufallscodes zu bezeichnet (im Folgenden: „<strong>Zufalls-IDs“</strong>), + Zufallscodes bezeichnet (im Folgenden: „<strong>Zufalls-IDs“</strong>), die von anderen Smartphones in Ihrer Nähe mit ebenfalls aktivierter Kontaktaufzeichnung empfangen werden können. Umgekehrt empfängt Ihr Smartphone auch die Zufalls-IDs der anderen Smartphones. Zu den von anderen @@ -182,7 +182,7 @@ </p> <p> Die Begegnungsaufzeichnungs-Funktion heißt bei Android-Smartphones - "COVID-19-Benachrichtungen" und bei iPhones „Begegnungsmittelungen“. Wir + "COVID-19-Benachrichtungen" und bei iPhones „Begegnungsmitteilungen“. Wir weisen Sie darauf hin, dass diese Funktionen kein Bestandteil der App, sondern ein integraler Bestandteil Ihres Betriebssystems sind. Anbieter der Begegnungsaufzeichnungs-Funktionen sind daher Apple (iPhones) bzw. Google @@ -295,7 +295,7 @@ </p> <p> Die Ermittlung des Infektionsrisikos findet ausschließlich lokal auf Ihrem - Smartphone statt, das heißt die Daten werden offline ohne Zugriffe auf das + Smartphone statt, das heißt, die Daten werden offline ohne Zugriffe auf das Serversystem der App verarbeitet. Das ermittelte Infektionsrisiko wird ebenfalls ausschließlich in der App berechnet und an keine anderen Empfänger (auch nicht an das RKI, Apple, Google und sonstige Dritte) @@ -395,7 +395,7 @@ c. Andere warnen </h2> <p> - Wenn Sie die Funktion „Andere warnen“ nutzen überträgt die App die von + Wenn Sie die Funktion „Andere warnen“ nutzen, überträgt die App die von Ihrem Smartphone gespeicherten eigenen Zufalls-IDs (einschließlich der jeweiligen Ãœbertragungsrisiko-Werte) der letzten 14 Tage und die TAN an das Serversystem der App. Dieses prüft zunächst, ob die TAN gültig ist und @@ -460,11 +460,11 @@ Soweit Sie die App nur informatorisch nutzen, also keine der oben genannten Funktionen der App verwenden und keine Daten eingeben, findet die Verarbeitung ausschließlich lokal auf Ihrem Smartphone statt und es fallen - keine personenbezogenen Daten an. In der App verlinkte Webseiten z.B.: www.bundesregierung.de + keine personenbezogenen Daten an. In der App verlinkte Webseiten, z.B.: www.bundesregierung.de, werden je nach Betriebssystem im Standard-Browser Ihres Smartphones (Android-Smartphones) oder innerhalb der App (iPhone) geöffnet und angezeigt. Welche Daten dabei verarbeitet - werden hängt von der Datenverarbeitungspraxis der aufgerufenen Webseite ab. + werden, hängt von der Datenverarbeitungspraxis der aufgerufenen Webseite ab. </p> <h1> 7. Welche Berechtigungen und Funktionen benötigt die App? @@ -829,4 +829,4 @@ </p> <p> Stand: 05.10.2020 -</p> \ No newline at end of file +</p> diff --git a/Corona-Warn-App/src/main/assets/privacy_en.html b/Corona-Warn-App/src/main/assets/privacy_en.html index b9f7a0f9feeec8d72c569ad83b20cf186fb1c038..2c43b7e9877517963106e94c09c922192a1fac1b 100644 --- a/Corona-Warn-App/src/main/assets/privacy_en.html +++ b/Corona-Warn-App/src/main/assets/privacy_en.html @@ -202,7 +202,7 @@ https://support.google.com/android/answer/9888358?hl=en </li> <li> - Information from Apple for iPhones can be found on your device under “Settings†+ Information from Apple for iPhones can be found on your smartphone under “Settings†> "Exposure Notification“ and the link “How Exposure Notification works…â€. </li> @@ -493,7 +493,7 @@ </ul> <p> Your smartphone’s Bluetooth interface must be enabled for your smartphone - to record random IDs from other smartphones and store them in the device’s + to record random IDs from other smartphones and store them in the smartphone’s exposure log. </p> <ul> @@ -521,7 +521,7 @@ b. Android smartphones </h3> <p> - If you are using an Android device, the following system features must also + If you are using an Android smartphone, the following system features must also be enabled: </p> <ul> @@ -541,7 +541,7 @@ </li> </ul> <p> - Your smartphone’s location service must be enabled for your device to + Your smartphone’s location service must be enabled for your smartphone to search for Bluetooth signals from other smartphones. Please note that no location data is collected in this process. </p> @@ -629,7 +629,7 @@ deletion depends on what Apple or Google has determined. Currently, the data is automatically deleted after 14 days. It may also be possible, using the functionality provided by Apple and Google, to manually - delete data in your device’s system settings. + delete data in your smartphone’s system settings. </li> <li> The risk of infection displayed in the App will be deleted as soon as a @@ -747,7 +747,7 @@ <p> To withdraw your consent to the test registration feature, you can delete the test registration in the App. The token for retrieving the test result - will then be deleted from your device. Neither the RKI nor the testing + will then be deleted from your smartphone. Neither the RKI nor the testing laboratory can then assign the transmitted data to your App or smartphone. If you wish to register another test, you will be asked to grant your consent again. @@ -804,4 +804,4 @@ </p> <p> Last amended: 05 October 2020 -</p> \ No newline at end of file +</p> diff --git a/Corona-Warn-App/src/main/assets/privacy_tr.html b/Corona-Warn-App/src/main/assets/privacy_tr.html index b421d7df2c895672d1aadedaab6d117d5dca8f05..06d11d1763c12ce4c04f2d79d8a57f79b6be6a6e 100644 --- a/Corona-Warn-App/src/main/assets/privacy_tr.html +++ b/Corona-Warn-App/src/main/assets/privacy_tr.html @@ -194,7 +194,7 @@ https://support.google.com/android/answer/9888358?hl=de </li> <li> - iPhone için Apple bilgilerini aygıtınızda "Ayarlar" > "Temas + iPhone için Apple bilgilerini akıllı telefonunuzda "Ayarlar" > "Temas bildirimleri" kısmında "Temas bildirimleri bu ÅŸekilde çalışır …" baÄŸlantısında bulabilirsiniz. </li> @@ -215,7 +215,7 @@ SaÄŸlık verileri, belirli bir kiÅŸinin saÄŸlık durumuna iliÅŸkin bilgiler içeren tüm verilerdir. Bunlara sadece eski ve güncel hastalıklara iliÅŸkin bilgiler deÄŸil, ayrıca bir kiÅŸinin hastalık risklerine iliÅŸkin bilgiler de - dahildir (örn. kiÅŸiye koronavirüsün bulaÅŸ riski). + dahildir (örn. kiÅŸiye koronavirüsün bulaÅŸma riski). </p> <p> AÅŸağıdaki iÅŸlevler kullanılırken UYGULAMA, saÄŸlık verilerinizi iÅŸler: @@ -249,10 +249,10 @@ rastgele kimliklerini "DiÄŸerlerini uyar" iÅŸlevi ile UYGULAMA üzerinden sunan kullanıcıların listesini çağırır. Taşıma riski deÄŸeri, ilgili maruz kalmanın bulaÅŸma olasılığının seviyesinin deÄŸeridir. Bulaşıcılık (test - sonuçları pozitif kiÅŸilerin temaslarının bulaÅŸ riski seviyesi), o andaki + sonuçları pozitif kiÅŸilerin temaslarının bulaÅŸma riski seviyesi), o andaki bilgi seviyesine göre bulaşıcı hastalığın seyir ve süresine baÄŸlı olduÄŸundan, bulgu baÅŸlangıcından itibaren geçen zamana göre maruz kalmanın - bulaÅŸ riski azaldığı dikkate alınır. + bulaÅŸma riski azaldığı dikkate alınır. </p> <p> UYGULAMA, rastgele kimlikleri akıllı telefonunuzun temas kayıt iÅŸlevine @@ -277,7 +277,7 @@ UYGULAMA'ya iletilir. </p> <p> - BulaÅŸ riski tespiti sadece lokal olarak akıllı telefonunuzda yapılır; + BulaÅŸma riski tespiti sadece lokal olarak akıllı telefonunuzda yapılır; bununla kastedilen, verilerin UYGULAMA'nın sunucu sistemine eriÅŸimler olmaksızın çevrimdışı iÅŸleneceÄŸidir. Tespit edilen enfeksiyon riski de sadece UYGULAMA tarafından hesaplanır ve diÄŸer alıcılara (RKI, Apple, @@ -471,7 +471,7 @@ </ul> <p> DiÄŸer akıllı telefonların rastgele kimliklerini alabilmesi ve bunları - cihazın temas protokolünde saklayabilmesi için akıllı telefonunuzun + temas protokolünde saklayabilmesi için akıllı telefonunuzun Bluetooth ara yüzü etkinleÅŸtirilmelidir. </p> <ul> @@ -480,8 +480,8 @@ </li> </ul> <p> - Test kaydı amacıyla QR kodunu tarayabilmesi için akıllı telefonunuz, bir - kamera gerektirir. + Test kaydı amacıyla QR kodunu tarayabilmesi için akıllı telefonunuzda, bir + kamera olması gerekmektedir. </p> <ul> <li> @@ -519,7 +519,7 @@ </li> </ul> <p> - Cihazınızın diÄŸer akıllı telefonların Bluetooth sinyallerini araması için + DiÄŸer akıllı telefonların Bluetooth sinyallerini araması için akıllı telefonunuzun konum tespiti etkinleÅŸtirilmelidir. Bu arama esnasında konum verileri toplanmaz. </p> @@ -605,7 +605,7 @@ (kendi rastgele kimlikleriniz dahil) ve diÄŸer akıllı telefonlardaki temas verilerinin silinmesine iliÅŸkin olarak RKI'nin hiçbir etkisi yoktur. Silme iÅŸlemi Apple veya Google'ın kararlarına göre gerçekleÅŸir. - Veriler ÅŸu anda 14 gün sonra otomatik silinir. Ayrıca cihazınızın + Veriler ÅŸu anda 14 gün sonra otomatik silinir. Ayrıca akıllı telfonunuzun sistem ayarlarında Apple ve Google tarafından sunulan fonksiyonları kullanarak bunları manuel olarak silebilirsiniz. </li> @@ -644,7 +644,7 @@ </h2> <ul> <li> - UYGULAMA aracılığıyla sunulan rastgele kimlikler ve risk bulaÅŸ + UYGULAMA aracılığıyla sunulan rastgele kimlikler ve risk bulaÅŸma deÄŸerleri, 14 gün sonra sunucu sistemi tarafından silinir. </li> <li> @@ -725,7 +725,7 @@ <p> "Test kaydetme" iÅŸlevine verdiÄŸiniz onayı geri almak için UYGULAMA'daki test kaydını silebilirsiniz. Test sonucunun çaÄŸrılması için alınan - belirteç, bundan sonra cihazınızdan silinir. RKI ve test laboratuvarı, + belirteç, bundan sonra akıllı telefonunuzdan silinir. RKI ve test laboratuvarı, iletilen verileri UYGULAMA'nıza ya da akıllı telefonunuza ekleyemez. BaÅŸka bir testi kaydettirmek isterseniz sizden yeni bir onay vermeniz istenir. </p> @@ -786,4 +786,4 @@ </p> <p> Versiyon: 05.10.2020 -</p> \ No newline at end of file +</p> diff --git a/Corona-Warn-App/src/main/assets/terms_en.html b/Corona-Warn-App/src/main/assets/terms_en.html index 272081ee0baefdd7ee7c1142890c5557c070b1da..eeb0360c0d55ffe388cfc2b01c2dcbfdec28ddbe 100644 --- a/Corona-Warn-App/src/main/assets/terms_en.html +++ b/Corona-Warn-App/src/main/assets/terms_en.html @@ -59,9 +59,8 @@ 13353 Berlin ("RKI") </p> <p> - represented by its President. Please call the RKI on +49 30 187 545 100 or - email us at CoronaWarnApp@rki.de if you have any questions relating to - these Terms of Use or if you wish to submit any complaints or legal claims. + represented by its President. Please email us at CoronaWarnApp@rki.de if you have any questions + relating to these Terms of Use or if you wish to submit any complaints or legal claims. </p> <p> Please make sure that you read these Terms of Use carefully. These Terms of diff --git a/Corona-Warn-App/src/main/assets/terms_tr.html b/Corona-Warn-App/src/main/assets/terms_tr.html index d0e57459d7b39e29a276b2e590c765978ea12353..222635b9bd2406c536cef128e6b55c5b784094aa 100644 --- a/Corona-Warn-App/src/main/assets/terms_tr.html +++ b/Corona-Warn-App/src/main/assets/terms_tr.html @@ -60,9 +60,8 @@ </p> <p> Robert Koch-Institut'tür ("<strong>RKI</strong>"). Bu kullanım koÅŸulları - ile ilgili soru, ÅŸikayet ya da istekleriniz için +49 30 18754-5100 numaralı - telefon ve CoronaWarnApp@rki.de e-posta adresi aracılığıyla RKI'ye - ulaÅŸabilirsiniz. + ile ilgili soru, ÅŸikayet ya da istekleriniz için CoronaWarnApp@rki.de e-posta adresi + aracılığıyla RKI'ye ulaÅŸabilirsiniz. </p> <p> Lütfen bu kullanım koÅŸullarını dikkatlice okuyun. Bu kullanım koÅŸulları, diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/riskdetails/RiskDetailsFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/riskdetails/RiskDetailsFragment.kt index 4a7512b80e8021f39a33b706e600b2140dfcd4e0..b3846cbb98c8f33c0c9619151881a6f599fbade5 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/riskdetails/RiskDetailsFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/riskdetails/RiskDetailsFragment.kt @@ -14,6 +14,7 @@ import de.rki.coronawarnapp.ui.main.MainActivity import de.rki.coronawarnapp.ui.viewmodel.SettingsViewModel import de.rki.coronawarnapp.ui.viewmodel.TracingViewModel import de.rki.coronawarnapp.util.ui.viewBindingLazy +import de.rki.coronawarnapp.util.convertToHyperlink /** * This is the detail view of the risk card if additional information for the user. @@ -32,6 +33,7 @@ class RiskDetailsFragment : Fragment(R.layout.fragment_risk_details) { binding.tracingViewModel = tracingViewModel binding.settingsViewModel = settingsViewModel setButtonOnClickListeners() + setUpWebLinks() } override fun onResume() { @@ -45,6 +47,14 @@ class RiskDetailsFragment : Fragment(R.layout.fragment_risk_details) { binding.riskDetailsContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) } + /** + * Make the links clickable and convert to hyperlink + */ + private fun setUpWebLinks() { + binding.riskDetailsInformationLowriskBodyUrl + .convertToHyperlink(getString(R.string.risk_details_explanation_faq_body_with_link)) + } + private fun setButtonOnClickListeners() { binding.riskDetailsHeaderButtonBack.setOnClickListener { (activity as MainActivity).goBack() diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/RetryMechanism.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/RetryMechanism.kt new file mode 100644 index 0000000000000000000000000000000000000000..ba2a372b51a99e49b2fdd04881f0d47d2b99f2c6 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/RetryMechanism.kt @@ -0,0 +1,77 @@ +package de.rki.coronawarnapp.util + +import timber.log.Timber +import kotlin.math.pow +import kotlin.math.roundToLong + +object RetryMechanism { + + fun <T> retryWithBackOff( + delayCalculator: (Attempt) -> Long? = createDelayCalculator(), + delayOperation: (Long) -> Unit = { Thread.sleep(it) }, + retryCondition: (Attempt) -> Boolean = { true }, + action: () -> T + ): T { + var current = Attempt() + while (true) { + Timber.v("Executing attempt: %s", current) + try { + return action() + } catch (e: Exception) { + current = current.copy(exception = e) + } + + if (!retryCondition(current)) throw current.exception!! + + val newDelay = delayCalculator(current) + + if (newDelay == null) { + Timber.w("Retrycondition exceeded: %s", current) + throw current.exception!! + } else { + delayOperation(newDelay) + } + + current = current.copy( + count = current.count + 1, + lastDelay = newDelay, + totalDelay = current.totalDelay + newDelay + ) + } + } + + private const val DEFAULT_TOTAL_MAX_RETRY = 15 * 1000L // 15 seconds total delay + private const val DEFAULT_MAX_DELAY = 3 * 1000L // 3 seconds max between retries + private const val DEFAULT_MIN_DELAY = 25L // Almost immediate retry + private const val DEFAULT_RETRY_MULTIPLIER = 1.5 + + fun createDelayCalculator( + maxTotalDelay: Long = DEFAULT_TOTAL_MAX_RETRY, + maxDelay: Long = DEFAULT_MAX_DELAY, + minDelay: Long = DEFAULT_MIN_DELAY, + multiplier: Double = DEFAULT_RETRY_MULTIPLIER + ): (Attempt) -> Long? = { attempt -> + if (attempt.totalDelay > maxTotalDelay) { + Timber.w("Max retry duration exceeded.") + null + } else { + val exp = 2.0.pow(attempt.count.toDouble()) + val calculatedDelay = (multiplier * exp).roundToLong() + + val newDelay = if (calculatedDelay > attempt.lastDelay) { + (attempt.lastDelay..calculatedDelay).random() + } else { + (calculatedDelay..attempt.lastDelay).random() + } + + newDelay.coerceAtMost(maxDelay).coerceAtLeast(minDelay) + } + } + + data class Attempt( + val count: Int = 1, + val totalDelay: Long = 0L, + val lastDelay: Long = 0L, + val exception: Exception? = null + ) +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt index 90796bbb74f337dbff22ff1d1c1786097eb92698..3d9b8556e85efb62167e716764fb5607c2943294 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt @@ -26,6 +26,8 @@ import de.rki.coronawarnapp.ui.ActivityBinder import de.rki.coronawarnapp.util.ConnectivityHelperInjection import de.rki.coronawarnapp.util.UtilModule import de.rki.coronawarnapp.util.device.DeviceModule +import de.rki.coronawarnapp.util.security.EncryptedPreferencesFactory +import de.rki.coronawarnapp.util.security.EncryptionErrorResetTool import javax.inject.Singleton @Singleton @@ -67,6 +69,9 @@ interface ApplicationComponent : AndroidInjector<CoronaWarnApplication> { val enfClient: ENFClient + val encryptedPreferencesFactory: EncryptedPreferencesFactory + val errorResetTool: EncryptionErrorResetTool + @Component.Factory interface Factory { fun create(@BindsInstance app: CoronaWarnApplication): ApplicationComponent diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/errors/ExceptionExtensions.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/errors/ExceptionExtensions.kt new file mode 100644 index 0000000000000000000000000000000000000000..f2d986507e3a6bd8f88acbdfc5ef125fe8835ee1 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/errors/ExceptionExtensions.kt @@ -0,0 +1,11 @@ +package de.rki.coronawarnapp.util.errors + +fun Throwable.causes(): Sequence<Throwable> = sequence { + var error = this@causes + + while (true) { + yield(error) + + error = error.cause ?: break + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/errors/RecoveryByResetDialogFactory.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/errors/RecoveryByResetDialogFactory.kt new file mode 100644 index 0000000000000000000000000000000000000000..da52bb3e6e5ceb049fee5dc6cdd0eec93fed6c8b --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/errors/RecoveryByResetDialogFactory.kt @@ -0,0 +1,30 @@ +package de.rki.coronawarnapp.util.errors + +import android.content.Context +import androidx.annotation.StringRes +import androidx.appcompat.app.AlertDialog +import androidx.fragment.app.Fragment +import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.util.ExternalActionHelper + +class RecoveryByResetDialogFactory(private val fragment: Fragment) { + + private val context: Context + get() = fragment.requireContext() + + fun showDialog( + @StringRes detailsLink: Int, + onDismiss: () -> Unit + ) { + AlertDialog.Builder(context) + .setTitle(R.string.errors_generic_headline) + .setMessage(R.string.errors_generic_text_catastrophic_error_recovery_via_reset) + .setCancelable(false) + .setOnDismissListener { onDismiss() } + .setNeutralButton(R.string.errors_generic_button_negative) { _, _ -> + ExternalActionHelper.openUrl(fragment, context.getString(detailsLink)) + } + .setPositiveButton(R.string.errors_generic_button_positive) { _, _ -> } + .show() + } +} 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 4c06814bafe705811329c21953bd9f75e2361111..bf158e8962fb69e8b6bd7524ad3b456760ba06d5 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 @@ -583,6 +583,16 @@ fun formatVisibilityBehavior(riskLevelScore: Int?): Int = fun formatVisibilityBehaviorIncreasedRisk(riskLevelScore: Int?): Int = formatVisibility(riskLevelScore == RiskLevelConstants.INCREASED_RISK) +/** + * Format the risk details include display for suggested behavior depending on risk level + * Only applied in special case for low level risk + * + * @param riskLevelScore + * @return + */ +fun formatVisibilityBehaviorLowLevelRisk(riskLevelScore: Int?): Int = + formatVisibility(riskLevelScore == RiskLevelConstants.LOW_LEVEL_RISK) + /** * Format the risk details period logged card display depending on risk level * applied in case of low and high risk levels diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/EncryptedPreferencesFactory.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/EncryptedPreferencesFactory.kt new file mode 100644 index 0000000000000000000000000000000000000000..34bd1d355880e860bc2c6ce525ffe0d26f62e75b --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/EncryptedPreferencesFactory.kt @@ -0,0 +1,40 @@ +package de.rki.coronawarnapp.util.security + +import android.content.Context +import android.content.SharedPreferences +import androidx.security.crypto.EncryptedSharedPreferences +import androidx.security.crypto.MasterKeys +import de.rki.coronawarnapp.util.RetryMechanism +import timber.log.Timber +import java.security.KeyException +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class EncryptedPreferencesFactory @Inject constructor( + private val context: Context +) { + + private val masterKeyAlias by lazy { + MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC) + } + + private fun createInstance(fileName: String) = EncryptedSharedPreferences.create( + fileName, + masterKeyAlias, + context, + EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, + EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM + ) + + fun create(fileName: String): SharedPreferences = try { + RetryMechanism.retryWithBackOff { + Timber.d("Creating EncryptedSharedPreferences instance.") + createInstance(fileName).also { + Timber.d("Instance created, %d entries.", it.all.size) + } + } + } catch (e: Exception) { + throw KeyException("Permantly failed to instantiate encrypted preferences", e) + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/EncryptionErrorResetTool.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/EncryptionErrorResetTool.kt new file mode 100644 index 0000000000000000000000000000000000000000..de29ea8f6815868e084d7e29fc6da8f74729620f --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/EncryptionErrorResetTool.kt @@ -0,0 +1,135 @@ +package de.rki.coronawarnapp.util.security + +import android.content.Context +import android.content.SharedPreferences +import androidx.core.content.edit +import de.rki.coronawarnapp.storage.DATABASE_NAME +import de.rki.coronawarnapp.util.errors.causes +import org.joda.time.Instant +import timber.log.Timber +import java.io.File +import java.security.GeneralSecurityException +import javax.inject.Inject +import javax.inject.Singleton + +/** + * This tool determines the narrow scope for which we will recovery from an encryption error + * by resetting our encrypted data. + * This will allow users currently affected by it, that update the app, to keep using it without + * requiring any manual actions from their side. + * + * https://github.com/corona-warn-app/cwa-app-android/issues/642 + */ +@Singleton +class EncryptionErrorResetTool @Inject constructor( + private val context: Context +) { + // https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/app/ContextImpl.java;drc=3b8e8d76315f6718a982d5e6a019b3aa4f634bcd;l=626 + private val encryptedPreferencesFile by lazy { + val appbaseDir = context.filesDir.parentFile!! + val sharedPrefsDir = File(appbaseDir, "shared_prefs") + File(sharedPrefsDir, "${SecurityConstants.ENCRYPTED_SHARED_PREFERENCES_FILE}.xml") + } + private val encryptedDatabaseFile by lazy { + context.getDatabasePath(DATABASE_NAME) + } + private val prefs: SharedPreferences by lazy { + context.getSharedPreferences("encryption_error_reset_tool", Context.MODE_PRIVATE) + } + + private var isResetWindowConsumed: Boolean + get() = prefs.getBoolean(PKEY_EA1851_WAS_WINDOW_CONSUMED, false) + set(value) = prefs.edit { + putBoolean(PKEY_EA1851_WAS_WINDOW_CONSUMED, value) + } + + private var resetPerformedAt: Instant? + get() = prefs.getLong(PKEY_EA1851_RESET_PERFORMED_AT, -1).let { + if (it == -1L) null else Instant.ofEpochMilli(it) + } + set(value) = prefs.edit { + if (value != null) { + putLong(PKEY_EA1851_RESET_PERFORMED_AT, value.millis) + } else { + remove(PKEY_EA1851_RESET_PERFORMED_AT) + } + } + + var isResetNoticeToBeShown: Boolean + get() = prefs.getBoolean(PKEY_EA1851_SHOW_RESET_NOTICE, false) + set(value) = prefs.edit { + putBoolean(PKEY_EA1851_SHOW_RESET_NOTICE, value) + } + + fun tryResetIfNecessary(error: Throwable): Boolean { + Timber.w(error, "isRecoveryWarranted()") + + // We only reset for the first error encountered after upgrading to 1.4.0+ + if (isResetWindowConsumed) { + Timber.v("Reset window has been consumed -> no reset.") + return false + } + isResetWindowConsumed = true + + val keyException = error.causes().singleOrNull { it is GeneralSecurityException } + if (keyException == null) { + Timber.v("Error has no GeneralSecurityException as cause -> no reset.") + return false + } + + // https://github.com/google/tink/blob/a8ec74d083068cd5e1ebed86fd8254630617b592/java_src/src/main/java/com/google/crypto/tink/aead/AeadWrapper.java#L83 + if (keyException.message?.trim()?.equals("decryption failed") != true) { + Timber.v("Not the GeneralSecurityException we are looking for -> no reset.") + return false + } + + if (!encryptedPreferencesFile.exists()) { + // The error we are looking for can only happen if there already is an encrypted preferences file + Timber.w( + "Error fits, but where is the existing preference file (%s)? -> no reset.", + encryptedPreferencesFile + ) + return false + } + + // So we have a GeneralSecurityException("decryption failed") and existing preferences + // And this is the first error we encountered after upgrading to 1.4.0, let's do this! + + return try { + performReset() + } catch (e: Exception) { + // If anything goes wrong, we return false, so that our caller can rethrow the original error. + Timber.e(e, "Error while performing the reset.") + false + } + } + + private fun performReset(): Boolean { + // Delete encrypted shared preferences file + if (!encryptedPreferencesFile.delete()) { + Timber.w("Couldn't delete %s", encryptedPreferencesFile) + // The encrypted preferences are a prerequisite for this error case + // If we can't delete that, we have to assume our reset approach failed. + return false + } + + // The user may have encountered the error even before a database was created. + if (encryptedDatabaseFile.exists() && !encryptedDatabaseFile.delete()) { + Timber.w("Couldn't delete %s", encryptedDatabaseFile) + // There was a database, but we couldn't delete it + // The database is inaccessible without the matching preferences (which we just deleted). + return false + } + + resetPerformedAt = Instant.now() + isResetNoticeToBeShown = true + + return true + } + + companion object { + private const val PKEY_EA1851_RESET_PERFORMED_AT = "ea1851.reset.performedAt" + private const val PKEY_EA1851_WAS_WINDOW_CONSUMED = "ea1851.reset.windowconsumed" + private const val PKEY_EA1851_SHOW_RESET_NOTICE = "ea1851.reset.shownotice" + } +} 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 57617a039fa614edb8e55de95dc972fbd5e085de..370ab58fd4ce02e2358bc1dd9f66557020403546 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 @@ -20,45 +20,46 @@ package de.rki.coronawarnapp.util.security import android.annotation.SuppressLint -import android.content.Context import android.content.SharedPreferences import android.os.Build import android.util.Base64 -import androidx.security.crypto.EncryptedSharedPreferences -import androidx.security.crypto.MasterKeys -import de.rki.coronawarnapp.CoronaWarnApplication +import androidx.annotation.VisibleForTesting import de.rki.coronawarnapp.exception.CwaSecurityException +import de.rki.coronawarnapp.util.di.AppInjector +import de.rki.coronawarnapp.util.di.ApplicationComponent 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.ENCRYPTED_SHARED_PREFERENCES_FILE +import timber.log.Timber import java.security.SecureRandom /** * Key Store and Password Access */ object SecurityHelper { - private val keyGenParameterSpec = MasterKeys.AES256_GCM_SPEC - private val masterKeyAlias = MasterKeys.getOrCreate(keyGenParameterSpec) - val globalEncryptedSharedPreferencesInstance: SharedPreferences by lazy { + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + internal val encryptedPreferencesProvider: (ApplicationComponent) -> SharedPreferences = { + val factory = it.encryptedPreferencesFactory + val encryptionErrorResetTool = it.errorResetTool withSecurityCatch { - CoronaWarnApplication.getAppContext() - .getEncryptedSharedPrefs(ENCRYPTED_SHARED_PREFERENCES_FILE) + try { + factory.create(ENCRYPTED_SHARED_PREFERENCES_FILE) + } catch (e: Exception) { + if (encryptionErrorResetTool.tryResetIfNecessary(e)) { + Timber.w("We could recovery from this error via reset. Now retrying.") + factory.create(ENCRYPTED_SHARED_PREFERENCES_FILE) + } else { + throw e + } + } } } - /** - * Initializes the private encrypted key store - */ - private fun Context.getEncryptedSharedPrefs(fileName: String) = EncryptedSharedPreferences - .create( - fileName, - masterKeyAlias, - this, - EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, - EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM - ) + val globalEncryptedSharedPreferencesInstance: SharedPreferences by lazy { + encryptedPreferencesProvider(AppInjector.component) + } private val String.toPreservedByteArray: ByteArray get() = Base64.decode(this, Base64.NO_WRAP) 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 e538e5b2b0e0729ca98020fab9f012dcb365cf56..a28df352887214d45ff666ff3f8d3e2089e1fafb 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 @@ -264,6 +264,20 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/risk_details_information_body" /> + <TextView + android:id="@+id/risk_details_information_lowrisk_body_url" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/spacing_normal" + android:text="@string/risk_details_explanation_faq_body_with_link" + android:visibility="@{FormatterRiskHelper.formatVisibilityBehaviorLowLevelRisk(tracingViewModel.riskLevel)}" + android:focusable="true" + android:clickable="true" + android:linksClickable="true" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/risk_details_information_body_notice" /> + </androidx.constraintlayout.widget.ConstraintLayout> <androidx.constraintlayout.widget.Guideline @@ -271,7 +285,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" - app:layout_constraintGuide_begin="@dimen/guideline_start" /> + app:layout_constraintGuide_begin="@dimen/guideline_top" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_end" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_symptom_intro.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_symptom_intro.xml index 09df7481b0c54f8241fadfaabc7bd95ccbb3e865..0fb5a5e024a58ccb1cb3699b28add5c405dee041 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_symptom_intro.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_symptom_intro.xml @@ -59,15 +59,27 @@ app:layout_constraintStart_toStartOf="@id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/submission_symptom_initial_headline" /> + <TextView + android:id="@+id/submission_symptom_intro_explanation" + style="@style/subtitleMedium" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/spacing_normal" + android:text="@string/submission_symptom_initial_explanation" + app:layout_constraintEnd_toEndOf="@id/guideline_end" + app:layout_constraintStart_toStartOf="@id/guideline_start" + app:layout_constraintTop_toBottomOf="@+id/further_info_text" /> + <include android:id="@+id/symptom_choice_selection" layout="@layout/include_submission_target_selection" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" + android:layout_marginTop="@dimen/spacing_normal" android:focusable="true" app:layout_constraintEnd_toEndOf="@id/guideline_end" app:layout_constraintStart_toStartOf="@id/guideline_start" - app:layout_constraintTop_toBottomOf="@+id/further_info_text" /> + app:layout_constraintTop_toBottomOf="@+id/submission_symptom_intro_explanation" /> <Button android:id="@+id/symptom_button_next" 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 032bd7d13a7a0ec5c99936d823f2bc5c7d522d45..841858a14775e4b1c09a3913440d3dc3fc9835be 100644 --- a/Corona-Warn-App/src/main/res/values-bg/strings.xml +++ b/Corona-Warn-App/src/main/res/values-bg/strings.xml @@ -246,7 +246,7 @@ <!-- XHED: App overview subtitle for tracing explanation--> <string name="main_overview_subtitle_tracing">"РегиÑтриране на излаганиÑта на риÑк"</string> <!-- YTXT: App overview body text about tracing --> - <string name="main_overview_body_tracing">"РегиÑтрирането на Ð¸Ð·Ð»Ð°Ð³Ð°Ð½Ð¸Ñ Ð½Ð° риÑк е една от трите оÑновни функции на приложението. Когато е активирана, вÑички оÑъщеÑтвени контакти между уÑтройÑтва Ñе запиÑват, без да е необходимо да правите друго."</string> + <string name="main_overview_body_tracing">"РегиÑтрирането на Ð¸Ð·Ð»Ð°Ð³Ð°Ð½Ð¸Ñ Ð½Ð° риÑк е една от трите оÑновни функции на приложението. Когато е активирана, вÑички оÑъщеÑтвени контакти между Ñмартфоните Ñе запиÑват, без да е необходимо да правите друго."</string> <!-- XHED: App overview subtitle for risk explanation --> <string name="main_overview_subtitle_risk">"РиÑк от заразÑване"</string> <!-- YTXT: App overview body text about risk levels --> @@ -345,7 +345,7 @@ <!-- YTXT: risk details - low risk explanation text --> <string name="risk_details_information_body_low_risk">"Вашето ниво на риÑк от заразÑване е ниÑко, защото нÑмате региÑтрирани контакти Ñ Ð»Ð¸Ñ†Ð°, които впоÑледÑтвие Ñа били диагноÑтицирани Ñ COVID-19, или ако Ñте имали такива, те Ñа били краткотрайни и от по-голÑмо разÑтоÑние."</string> <!-- YTXT: risk details - low risk explanation text with encounter with low risk --> - <string name="risk_details_information_body_low_risk_with_encounter">"РиÑкът от заразÑване Ñе изчиÑлÑва локално на уÑтройÑтвото Ви въз оÑнова на региÑтрираните данни за излагане. ИзчиÑлението включва Ñъщо така разÑтоÑнието от и продължителноÑтта на вÑички контакти Ñ Ð»Ð¸Ñ†Ð°, диагноÑтицирани Ñ COVID-19., както и възможноÑтта им да заразÑÑ‚ околните. Ðикой оÑвен Ð’Ð°Ñ Ð½Ðµ може да види или да получи данни за Вашето ниво на риÑк."</string> + <string name="risk_details_information_body_low_risk_with_encounter">"РиÑкът от заразÑване Ñе изчиÑлÑва локално на Ñмартфона Ви въз оÑнова на региÑтрираните данни за излагане. ИзчиÑлението включва Ñъщо така разÑтоÑнието от и продължителноÑтта на вÑички контакти Ñ Ð»Ð¸Ñ†Ð°, диагноÑтицирани Ñ COVID-19., както и възможноÑтта им да заразÑÑ‚ околните. Ðикой оÑвен Ð’Ð°Ñ Ð½Ðµ може да види или да получи данни за Вашето ниво на риÑк."</string> <!-- YTXT: risk details - increased risk explanation text with variable for day(s) since last contact --> <plurals name="risk_details_information_body_increased_risk"> <item quantity="one">"Изложени Ñте на повишен риÑк от заразÑване, защото преди %1$s дни Ñте имали продължителен и близък контакт Ñ Ð¿Ð¾Ð½Ðµ едно лице, диагноÑтицирано Ñ COVID-19."</item> @@ -372,6 +372,8 @@ <string name="risk_details_explanation_dialog_title">"Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð½Ð¾Ñно функционалноÑтта за региÑтриране на Ð¸Ð·Ð»Ð°Ð³Ð°Ð½Ð¸Ñ Ð½Ð° риÑк"</string> <!-- YTXT: one time risk explanation dialog - pointing to the faq page for more information--> <string name="risk_details_explanation_dialog_faq_body">"За повече Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð²Ð¸Ð¶Ñ‚Ðµ Ñтраницата „ЧЗВ“."</string> + <!-- XLNK: risk explanations and informations - pointing to the faq page for more information and contains hyperlink--> + <string name="risk_details_explanation_faq_body_with_link"><a href="https://www.coronawarn.app/en/faq/#encounter_but_green">"За повече Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð²Ð¸Ð¶Ñ‚Ðµ Ñтраницата „ЧЗВ“."</a></string> <!-- #################################### Onboarding @@ -396,7 +398,7 @@ <!-- XHED: onboarding(together) - two/three line headline under an illustration --> <string name="onboarding_subtitle">"Повече защита за Ð’Ð°Ñ Ð¸ за вÑички наÑ. С помощта на приложението Corona-Warn-App можем да прекъÑнем веригите на заразÑване много по-бързо."</string> <!-- YTXT: onboarding(together) - inform about the app --> - <string name="onboarding_body">"Превърнете уÑтройÑтвото Ñи в предупредителна ÑиÑтема за коронавируÑ. Прегледайте ÑÐ²Ð¾Ñ ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° риÑк и разберете дали през поÑледните 14 дни Ñте имали близък контакт Ñ Ð»Ð¸Ñ†Ðµ, диагноÑтицирано Ñ COVID-19."</string> + <string name="onboarding_body">"Превърнете Ñмартфона Ñи в предупредителна ÑиÑтема за коронавируÑ. Прегледайте ÑÐ²Ð¾Ñ ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° риÑк и разберете дали през поÑледните 14 дни Ñте имали близък контакт Ñ Ð»Ð¸Ñ†Ðµ, диагноÑтицирано Ñ COVID-19."</string> <!-- YTXT: onboarding(together) - explain application --> <string name="onboarding_body_emphasized">"Приложението региÑтрира контакти на лица поÑредÑтвом обмÑна на криптирани Ñлучайни ИД кодове между уÑтройÑтвата им, без да оÑъщеÑтвÑва доÑтъп до каквито и да било лични данни."</string> <!-- XACT: onboarding(together) - illustraction description, header image --> @@ -415,7 +417,7 @@ <!-- XHED: onboarding(tracing) - two/three line headline under an illustration --> <string name="onboarding_tracing_subtitle">"За да уÑтановите дали за Ð’Ð°Ñ ÑъщеÑтвува риÑк от заразÑване, Ñ‚Ñ€Ñбва да активирате функциÑта за региÑтриране на Ð¸Ð·Ð»Ð°Ð³Ð°Ð½Ð¸Ñ Ð½Ð° риÑк."</string> <!-- YTXT: onboarding(tracing) - explain tracing --> - <string name="onboarding_tracing_body">"РегиÑтрирането на Ð¸Ð·Ð»Ð°Ð³Ð°Ð½Ð¸Ñ Ð½Ð° риÑк Ñе извършва Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰Ñ‚Ð° на Bluetooth връзка, при коÑто Вашето уÑтройÑтво получава криптираните Ñлучайни ИД кодове на други потребители и изпраща до техните уÑтройÑтва Вашите Ñлучайни ИД кодове. ФункциÑта може да бъде дезактивирана по вÑÑко време."</string> + <string name="onboarding_tracing_body">"РегиÑтрирането на Ð¸Ð·Ð»Ð°Ð³Ð°Ð½Ð¸Ñ Ð½Ð° риÑк Ñе извършва Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰Ñ‚Ð° на Bluetooth връзка, при коÑто ВашиÑÑ‚ Ñмартфон получава криптираните Ñлучайни ИД кодове на други потребители и изпраща до техните Ñмартфони Вашите Ñлучайни ИД кодове. ФункциÑта може да бъде дезактивирана по вÑÑко време."</string> <!-- YTXT: onboarding(tracing) - explain tracing --> <string name="onboarding_tracing_body_emphasized">"Криптираните Ñлучайни ИД кодове предават Ñамо Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° дата, продължителноÑÑ‚ и близоÑÑ‚ на контакта Ñ Ð´Ñ€ÑƒÐ³Ð¸ лица (поÑредÑтвом Ñилата на Ñигнала). Лични данни от типа на име, Ð°Ð´Ñ€ÐµÑ Ð¸ меÑтоположение не Ñе запиÑват и идентифицирането на лицата е невъзможно."</string> <!-- YTXT: onboarding(tracing) - easy language explain tracing link--> @@ -425,7 +427,7 @@ <!-- XHED: onboarding(tracing) - headline for consent information --> <string name="onboarding_tracing_headline_consent">"ПоверителноÑÑ‚"</string> <!-- YTXT: onboarding(tracing) - body for consent information --> - <string name="onboarding_tracing_body_consent">"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 the “Enable†button, you agree to the enabling of the App’s exposure logging feature and the associated data processing."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"In order to use the App’s exposure logging feature, you will have to enable the \"Exposure Notifications\" functionality provided by Google on your smartphone and grant the Corona-Warn-App permission to use this."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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)."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"The Bluetooth signal strength is used to derive the physical distance (the stronger the signal, the smaller the distance). The App then analyzes 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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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â€."</string> + <string name="onboarding_tracing_body_consent">"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 the \"Enable\" button, you agree to the enabling of the App’s exposure logging feature and the associated data processing."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"In order to use the App’s exposure logging feature, you will have to enable the \"Exposure Notifications\" functionality provided by Google on your smartphone and grant the Corona-Warn-App permission to use this."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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)."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"The Bluetooth signal strength is used to derive the physical distance (the stronger the signal, the smaller the distance). The App then analyzes 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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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 smartphone 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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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\"."</string> <!-- XBUT: onboarding(tracing) - button enable tracing --> <string name="onboarding_tracing_button_next">"Ðктивиране на региÑтрирането на Ð¸Ð·Ð»Ð°Ð³Ð°Ð½Ð¸Ñ Ð½Ð° риÑк"</string> <!-- XTXT: onboarding(tracing) - dialog about tracing permission declined --> @@ -473,7 +475,7 @@ <!-- XHED: onboarding(test) - two/three line headline under an illustration --> <string name="onboarding_test_subtitle">"... Ð¼Ð¾Ð»Ñ Ñъобщете за това в приложението Corona-Warn-App. СподелÑнето на резултатите от Вашите теÑтове е доброволно и безопаÑно. Ðаправете го в името на общото здраве."</string> <!-- YTXT: onboarding(test) - explain test --> - <string name="onboarding_test_body">"Вашето извеÑтие Ñе криптира Ñ Ð²Ð¸Ñока Ñтепен на ÑигурноÑÑ‚ и Ñе обработва на защитен Ñървър. Лицата, чиито криптирани Ñлучайни ИД кодове Ñа запазени на Вашето уÑтройÑтво, ще получат предупреждение, както и Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð½Ð¾Ñно това, което Ñ‚Ñ€Ñбва да направÑÑ‚."</string> + <string name="onboarding_test_body">"Вашето извеÑтие Ñе криптира Ñ Ð²Ð¸Ñока Ñтепен на ÑигурноÑÑ‚ и Ñе обработва на защитен Ñървър. Лицата, чиито криптирани Ñлучайни ИД кодове Ñа запазени на Ð’Ð°ÑˆÐ¸Ñ Ñмартфон, ще получат предупреждение, както и Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð½Ð¾Ñно това, което Ñ‚Ñ€Ñбва да направÑÑ‚."</string> <!-- XACT: onboarding(test) - illustraction description, header image --> <string name="onboarding_test_illustration_description">"КриптираниÑÑ‚ положителен резултат от теÑÑ‚ Ñе изпраща в ÑиÑтемата, за да бъдат предупредени оÑтаналите потребители."</string> <!-- XACT: Onboarding (datashare) page title --> @@ -521,7 +523,7 @@ <!-- XTXT: settings(tracing) - shows status under header in home, inactive location --> <string name="settings_tracing_body_inactive_location">"УÑлугите за ÑподелÑне на меÑтоположението Ñа дезактивирани"</string> <!-- YTXT: settings(tracing) - explains tracings --> - <string name="settings_tracing_body_text">"РегиÑтрирането на Ð¸Ð·Ð»Ð°Ð³Ð°Ð½Ð¸Ñ Ð½Ð° риÑк Ñе извършва Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰Ñ‚Ð° на Bluetooth връзка, при коÑто Вашето уÑтройÑтво получава криптираните Ñлучайни идентификатори на други потребители и изпраща до техните уÑтройÑтва Вашите Ñлучайни идентификатори. ФункциÑта може да бъде дезактивирана по вÑÑко време."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Криптираните Ñлучайни ИД кодове предават Ñамо Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° дата, продължителноÑÑ‚ и близоÑÑ‚ на контакта Ñ Ð´Ñ€ÑƒÐ³Ð¸ лица (изчиÑлена чрез Ñилата на Ñигнала). Лични данни от типа на име, Ð°Ð´Ñ€ÐµÑ Ð¸ меÑтоположение не Ñе запиÑват и идентифицирането на лицата е невъзможно."</string> + <string name="settings_tracing_body_text">"РегиÑтрирането на Ð¸Ð·Ð»Ð°Ð³Ð°Ð½Ð¸Ñ Ð½Ð° риÑк Ñе извършва Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰Ñ‚Ð° на Bluetooth връзка, при коÑто ВашиÑÑ‚ Ñмартфон получава криптираните Ñлучайни идентификатори на други потребители и изпраща до техните уÑтройÑтва Вашите Ñлучайни идентификатори. ФункциÑта може да бъде дезактивирана по вÑÑко време."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Криптираните Ñлучайни ИД кодове предават Ñамо Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° дата, продължителноÑÑ‚ и близоÑÑ‚ на контакта Ñ Ð´Ñ€ÑƒÐ³Ð¸ лица (изчиÑлена чрез Ñилата на Ñигнала). Лични данни от типа на име, Ð°Ð´Ñ€ÐµÑ Ð¸ меÑтоположение не Ñе запиÑват и идентифицирането на лицата е невъзможно."</string> <!-- XTXT: settings(tracing) - status next to switch under title --> <string name="settings_tracing_status_active">"Ðктивно"</string> <!-- XTXT: settings(tracing) - status next to switch under title --> @@ -656,7 +658,7 @@ <!-- YTXT: Body text for about information page --> <string name="information_about_body_emphasized">"ИнÑтитутът „Роберт Кох“ (RKI) е федералната Ñлужба за общеÑтвено здравеопазване в ГерманиÑ. Той е издател на приложението Corona-Warn-App по поръчка на федералното правителÑтво. Приложението е предназначено да бъде дигитално допълнение на вече въведените мерки за опазване на общеÑтвеното здраве: Ñоциално диÑтанциране, поддържане на виÑока хигиена и ноÑене на маÑки."</string> <!-- YTXT: Body text for about information page --> - <string name="information_about_body">"Ð’Ñеки, който използва приложението, помага за проÑледÑване и прекъÑване на веригите на заразÑване. Приложението запазва във Вашето уÑтройÑтво данните за контактите Ви Ñ Ð´Ñ€ÑƒÐ³Ð¸ хора. Получавате извеÑтие, ако Ñте били в контакт Ñ Ð»Ð¸Ñ†Ð°, които впоÑледÑтвие Ñа били диагноÑтицирани Ñ COVID-19. Вашата ÑамоличноÑÑ‚ и неприкоÑновеноÑтта на данните Ви Ñа защитени по вÑÑко време."</string> + <string name="information_about_body">"Ð’Ñеки, който използва приложението, помага за проÑледÑване и прекъÑване на веригите на заразÑване. Приложението запазва във Ð’Ð°ÑˆÐ¸Ñ Ñмартфон данните за контактите Ви Ñ Ð´Ñ€ÑƒÐ³Ð¸ хора. Получавате извеÑтие, ако Ñте били в контакт Ñ Ð»Ð¸Ñ†Ð°, които впоÑледÑтвие Ñа били диагноÑтицирани Ñ COVID-19. Вашата ÑамоличноÑÑ‚ и неприкоÑновеноÑтта на данните Ви Ñа защитени по вÑÑко време."</string> <!-- XACT: describes illustration --> <string name="information_about_illustration_description">"Група лица използват Ñмартфоните Ñи, придвижвайки Ñе из града."</string> <!-- XHED: Page title for privacy information page, also menu item / button text --> @@ -920,7 +922,7 @@ <!-- XHED: Dialog headline for dispatcher QR prviacy dialog --> <string name="submission_dispatcher_qr_privacy_dialog_headline">"ПоверителноÑÑ‚"</string> <!-- YTXT: Dialog Body text for dispatcher QR privacy dialog --> - <string name="submission_dispatcher_qr_privacy_dialog_body">"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â€."</string> + <string name="submission_dispatcher_qr_privacy_dialog_body">"By tapping \"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\"."</string> <!-- XBUT: submission(dispatcher QR Dialog) - positive button (right) --> <string name="submission_dispatcher_qr_privacy_dialog_button_positive">"Приемам"</string> <!-- XBUT: submission(dispatcher QR Dialog) - negative button (left) --> @@ -940,17 +942,17 @@ <!-- XHED: Page title for the positive result additional warning page--> <string name="submission_positive_other_warning_title">"Предупредете другите"</string> <!-- XHED: Page headline for the positive result additional warning page--> - <string name="submission_positive_other_warning_headline">"МолÑ, помогнете на вÑички наÑ!"</string> + <string name="submission_positive_other_warning_headline">"Можете да помогнете!"</string> <!-- YTXT: Body text for the positive result additional warning page--> - <string name="submission_positive_other_warning_body">"Като Ñледваща Ñтъпка може да позволите на Corona-Warn-App да Ñподели Вашите Ñлучайни ИД кодове за поÑледните 14 дни Ñ Ð¾Ñтаналите потребители. По този начин може да предупредите други хора и да помогнете за прекъÑване на веригата на заразÑване.\n\nТъй като Ñе разменÑÑ‚ Ñамо Ñлучайни идентификатори, неÑъдържащи лични данни, анонимноÑтта Ви е гарантирана."</string> + <string name="submission_positive_other_warning_body">"Ðко желаете, вече можете да разрешите на ÑиÑтемата на приложението да Ñъобщава локално Ñъхранените ИД от поÑледните 14 дни на оÑтаналите. По този начин ще предупредите оÑтаналите потребители и ще помогнете да Ñе прекъÑне веригата на заразÑване.\n\nПриложението изпраща Ñамо Ñлучайно генерирани ИД и предоÑтавената от Ð’Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° Ñимптоми. СамоличноÑтта Ви не Ñе разкрива."</string> <!-- XHED: Title for the privacy card--> <string name="submission_positive_other_warning_privacy_title">"ПоверителноÑÑ‚"</string> <!-- YTXT: Body text for the privacy card--> - <string name="submission_positive_other_warning_privacy_body">"By tapping “Acceptâ€, you consent to the App sending your positive test result to the App’s server system along with your random IDs from the last 14 days, so that other App users who have enabled the exposure logging feature can be automatically notified that they may have been exposed to a risk of infection. The random IDs transmitted for this purpose do not contain any information that would allow conclusions to be drawn about your identity or your person. \n\nTransmitting your test result via the App is voluntary. You will not be penalized if you do not transmit your test result. Since it is not possible to trace or check whether and how you use the App, nobody but you will know whether you have transmitted the information that you are infected.\n\nYou can withdraw your consent at any time by deleting the App. This withdrawal of your consent will not affect the lawfulness of the processing carried out based on the consent prior to the withdrawal. Further information can be found in the menu under “Data Privacyâ€."</string> + <string name="submission_positive_other_warning_privacy_body">"By tapping “Acceptâ€, you consent to the App sending your positive test result to the App’s server system along with your random IDs from the last 14 days, so that other App users who have enabled the risk identification feature can be automatically notified that they may have been exposed to a risk of infection. If you provided optional information about the onset of your symptoms, the random IDs will be transmitted with a risk value derived from your information, indicating your risk of having infected others on the day the random ID is valid. The random IDs transmitted for this purpose do not contain any information that would allow conclusions to be drawn about your identity or your person.\n\nTransmitting your test result via the App is voluntary. You will not be penalized if you do not transmit your test result. Since it is not possible to trace or check whether and how you use the App, nobody but you will know whether you have transmitted the information that you are infected. \n\nYou can withdraw your consent at any time by deleting the App. This withdrawal of your consent will not affect the lawfulness of the processing carried out on the basis of the consent prior to the withdrawal. Further information can be found under “App Informationâ€> “Data Privacyâ€."</string> <!-- XBUT: other warning continue button --> <string name="submission_positive_other_warning_button">"Приемам"</string> <!-- XACT: other warning - illustration description, explanation image --> - <string name="submission_positive_other_illustration_description">"УÑтройÑтво предава на ÑиÑтемата Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° положителен резултат от теÑÑ‚."</string> + <string name="submission_positive_other_illustration_description">"Смартфонът предава на ÑиÑтемата Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° положителен резултат от теÑÑ‚."</string> <!-- Submission Country Selector --> <!-- XHED: Page title for the submission country selection page --> @@ -994,8 +996,10 @@ <!-- Submission Symptoms --> <!-- XHED: Page title for symptom screens --> <string name="submission_symptom_title">"Симптоми"</string> - <!-- YTXT: headline text for initial symptom screen --> - <string name="submission_symptom_initial_headline">"Имали ли Ñте един или повече от Ñледните Ñимптоми през поÑледните нÑколко дни?"</string> + <!-- XTXT: headline text for initial symptom screen --> + <string name="submission_symptom_initial_headline">"Имали ли Ñте един или повече от Ñледните Ñимптоми?"</string> + <!-- YTXT: explanation text for initial symptom screen --> + <string name="submission_symptom_initial_explanation">"Можете да поÑочвате дали и кога Ñте проÑвили Ñимпотми на COVID-19, за да позволите на приложението да оценÑва по-точно риÑка от заразÑване за оÑтаналите потребители. Ðко не желаете да предоÑтавÑте такава информациÑ, проÑто изберете \"Без отговор\"."</string> <!-- YTXT: Bullet points for symptoms --> <string-array name="submission_symptom_symptom_bullets"> <item>"Повишена температура или треÑка"</item> @@ -1012,7 +1016,7 @@ <!-- XBUT: symptom initial screen no button --> <string name="submission_symptom_negative_button">"Ðе"</string> <!-- XBUT: symptom initial screen no information button --> - <string name="submission_symptom_no_information_button">"Без коментар"</string> + <string name="submission_symptom_no_information_button">"Без отговор"</string> <!-- XBUT: symptom initial screen continue button --> <string name="submission_symptom_further_button">"Ðапред"</string> @@ -1060,7 +1064,7 @@ <!-- XBUT: symptom calendar screen more than 2 weeks button --> <string name="submission_symptom_more_two_weeks">"Преди повече от 2 Ñедмици"</string> <!-- XBUT: symptom calendar screen verify button --> - <string name="submission_symptom_verify">"Без коментар"</string> + <string name="submission_symptom_verify">"Без отговор"</string> <!-- Submission Status Card --> <!-- XHED: Page title for the various submission status: fetching --> @@ -1173,6 +1177,10 @@ <string name="errors_generic_button_negative">"Подробна информациÑ"</string> <!-- XTXT: error dialog - text when no error description is available --> <string name="errors_generic_text_unknown_error_cause">"Възникна неочаквана грешка."</string> + <!-- XTXT: error dialog - text when a catastrophic error occured from which the app recovered automatically via data reset --> + <string name="errors_generic_text_catastrophic_error_recovery_via_reset">"Приложението беше върнато към изходно ÑÑŠÑтоÑние поради техничеÑки проблем. Това нÑма да Ñе отрази на работата му. Ще продължите да получавате извеÑÑ‚Ð¸Ñ Ð·Ð° излаганиÑта и ще можете да предупредите околните в Ñлучай на положителен теÑÑ‚ за COVID-19."</string> + <!-- XTXT: error dialog - link for the details button in the catastrophic error recovery dialog --> + <string name="errors_generic_text_catastrophic_error_encryption_failure">"https://www.coronawarn.app/en/faq/#cause9002"</string> <!-- #################################### Just for Development 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 724845faa9da52eeac9e946c308a2dad7ad97d38..aeebdecde8991a4f5295ae1f7ea2900d1e971d3c 100644 --- a/Corona-Warn-App/src/main/res/values-de/strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/strings.xml @@ -373,6 +373,8 @@ <string name="risk_details_explanation_dialog_title">"Information zur Funktionsweise der Risiko-Ermittlung"</string> <!-- YTXT: one time risk explanation dialog - pointing to the faq page for more information--> <string name="risk_details_explanation_dialog_faq_body">"Weitere Informationen finden Sie in den FAQ."</string> + <!-- XLNK: risk explanations and informations - pointing to the faq page for more information and contains hyperlink--> + <string name="risk_details_explanation_faq_body_with_link"><a href="https://www.coronawarn.app/de/faq/#encounter_but_green">Weitere Informationen finden Sie in den FAQ.</a></string> <!-- #################################### Onboarding @@ -950,11 +952,11 @@ <!-- XHED: Page headline for the positive result additional warning page--> <string name="submission_positive_other_warning_headline">"Helfen Sie mit!"</string> <!-- YTXT: Body text for the positive result additional warning page--> - <string name="submission_positive_other_warning_body">"Als Nächstes können Sie dafür sorgen, dass Ihre Mitmenschen über mögliche Risiko-Begegnungen gewarnt werden. Hierfür können Sie Ihre bislang nur auf Ihrem Smartphone gespeicherten Zufalls-IDs an das von den teilnehmenden Ländern gemeinsam betriebene europäische Serversystem zur Verfügung stellen. Von dort werden die Zufalls-IDs durch die teilnehmenden Länder an die Nutzer der jeweiligen offiziellen Corona-Apps verteilt. Nach dem täglichen Download der Zufalls-IDs werden die Nutzerinnen und Nutzer, mit denen Sie Kontakt hatten, dann gewarnt, sofern eine Risiko-Begegnung stattfand. Es werden nur Zufalls-IDs übertragen. Es werden keine persönlichen Daten wie Ihr Name, Ihre Adresse oder Ihr Aufenthaltsort mitgeteilt."</string> + <string name="submission_positive_other_warning_body">"Als Nächstes können Sie dafür sorgen, dass das Corona-Warn-System Ihre lokal gespeicherten Zufallscodes der letzten 14 Tage an andere verteilt. So können Sie Ihre Mitmenschen warnen und helfen, die Infektionskette zu unterbrechen.\n\nEs werden nur unpersönliche Zufalls-IDs und eventuelle Angaben zum Symptombeginn übertragen. Ihre Identität wird hierdurch nicht offengelegt. "</string> <!-- XHED: Title for the privacy card--> <string name="submission_positive_other_warning_privacy_title">"Datenschutz"</string> <!-- YTXT: Body text for the privacy card--> - <string name="submission_positive_other_warning_privacy_body">"Durch Antippen von „Einverstanden“ willigen Sie ein, dass die App Ihr positives Testergebnis zusammen mit Ihren Zufalls-IDs der letzten 14 Tage an das Serversystem der App übermittelt, damit andere App-Nutzer mit aktivierter Risiko-Ermittlung automatisch informiert werden können, dass sie möglicherweise einem Infektionsrisiko ausgesetzt waren. Wenn Sie optionale Angaben zum Symptombeginn machen, enthalten die übermittelten Zufalls-IDs auch einen aus Ihren Angaben abgeleiteten Risikowert, der Ihr Ansteckungsrisiko am Gültigkeitstag der jeweiligen Zufalls-ID angibt. Die übermittelten Zufalls-IDs enthalten keine Angaben, die Rückschlüsse auf Ihre Identität oder Ihre Person zulassen.\n\nDie Ãœbermittlung Ihres Testergebnisses per App ist freiwillig. Wenn Sie Ihr Testergebnis nicht übermitteln, entstehen Ihnen keine Nachteile. Da weder nachvollzogen noch kontrolliert werden kann, ob und wie Sie die App verwenden, erfährt außer Ihnen niemand, ob Sie eine Infektion übermittelt haben.\n\nSie können Ihre Einwilligung jederzeit widerrufen, indem Sie die App löschen. Durch den Widerruf der Einwilligung wird die Rechtmäßigkeit der aufgrund der Einwilligung bis zum Widerruf erfolgten Verarbeitung nicht berührt. Weitere Informationen finden Sie unter dem Menüpunkt „App-Informationen“ > „Datenschutz“."</string> + <string name="submission_positive_other_warning_privacy_body">"Durch Antippen von „Einverstanden“ willigen Sie ein, dass die App Ihr positives Testergebnis zusammen mit Ihren Zufalls-IDs der letzten 14 Tage an das Serversystem der App übermittelt, damit andere App-Nutzer mit aktivierter Risiko-Ermittlung automatisch informiert werden können, dass sie möglicherweise einem Infektionsrisiko ausgesetzt waren. Wenn Sie optionale Angaben zum Symptombeginn gemacht haben, wird mit den Zufalls-IDs auch ein aus Ihren Angaben abgeleiteter Risikowert übermittelt, der Ihr Ansteckungsrisiko am Gültigkeitstag der jeweiligen Zufalls-ID angibt. Die übermittelten Zufalls-IDs enthalten keine Angaben, die Rückschlüsse auf Ihre Identität oder Ihre Person zulassen.\n\nDie Ãœbermittlung Ihres Testergebnisses per App ist freiwillig. Wenn Sie Ihr Testergebnis nicht übermitteln, entstehen Ihnen keine Nachteile. Da weder nachvollzogen noch kontrolliert werden kann, ob und wie Sie die App verwenden, erfährt außer Ihnen niemand, ob Sie eine Infektion übermittelt haben.\n\nSie können Ihre Einwilligung jederzeit widerrufen, indem Sie die App löschen. Durch den Widerruf der Einwilligung wird die Rechtmäßigkeit der aufgrund der Einwilligung bis zum Widerruf erfolgten Verarbeitung nicht berührt. Weitere Informationen finden Sie unter dem Menüpunkt „App-Informationen“ > „Datenschutz“."</string> <!-- XBUT: other warning continue button --> <string name="submission_positive_other_warning_button">"Einverstanden"</string> <!-- XACT: other warning - illustration description, explanation image --> @@ -1004,8 +1006,10 @@ <!-- Submission Symptoms --> <!-- XHED: Page title for symptom screens --> <string name="submission_symptom_title">"Symptome"</string> - <!-- YTXT: headline text for initial symptom screen --> - <string name="submission_symptom_initial_headline">"Sind eines oder mehrere der folgenden Symptome in den letzten Tagen bei Ihnen neu aufgetreten?"</string> + <!-- XTXT: headline text for initial symptom screen --> + <string name="submission_symptom_initial_headline">"Sind bei Ihnen in den letzten Tagen folgende Symptome aufgetreten?"</string> + <!-- YTXT: explanation text for initial symptom screen --> + <string name="submission_symptom_initial_explanation">"Wenn Sie angeben, ob und wann eventuelle Corona-Symptome bei Ihnen aufgetreten sind, kann das Infektionsrisiko von anderen App-Nutzern genauer berechnet werden. Sie müssen keine Angabe machen, wählen Sie dazu „Keine Angabe“."</string> <!-- YTXT: Bullet points for symptoms --> <string-array name="submission_symptom_symptom_bullets"> <item>"Erhöhte Temperatur oder Fieber"</item> @@ -1183,6 +1187,10 @@ <string name="errors_generic_button_negative">"Details"</string> <!-- XTXT: error dialog - text when no error description is available --> <string name="errors_generic_text_unknown_error_cause">"Ein unbekannter Fehler ist aufgetreten."</string> + <!-- XTXT: error dialog - text when a catastrophic error occured from which the app recovered automatically via data reset --> + <string name="errors_generic_text_catastrophic_error_recovery_via_reset">"Aufgrund eines technischen Problems wurde Ihre App zurückgesetzt. Das hat jedoch keine Auswirkungen auf die Verwendung der App. Sie werden weiterhin über Risiko-Begegnungen benachrichtigt und können andere warnen, falls Sie positiv auf COVID-19 getestet wurden."</string> + <!-- XTXT: error dialog - link for the details button in the catastrophic error recovery dialog --> + <string name="errors_generic_text_catastrophic_error_encryption_failure">"https://www.coronawarn.app/de/faq/#cause9002"</string> <!-- #################################### Just for Development 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 84d77583b4d3fe921ddc321a4603d98452dc4b47..2810d7243367918a1624e6873a41f510b4a18fdf 100644 --- a/Corona-Warn-App/src/main/res/values-en/strings.xml +++ b/Corona-Warn-App/src/main/res/values-en/strings.xml @@ -246,7 +246,7 @@ <!-- XHED: App overview subtitle for tracing explanation--> <string name="main_overview_subtitle_tracing">"Exposure Logging"</string> <!-- YTXT: App overview body text about tracing --> - <string name="main_overview_body_tracing">"Exposure logging is one of the three central features of the app. When you activate it, encounters with people\'s devices are logged. You don\'t have to do anything else."</string> + <string name="main_overview_body_tracing">"Exposure logging is one of three central features of the app. Once you activate it, encounters with people\'s smartphones are logged. You don\'t have to do anything else."</string> <!-- XHED: App overview subtitle for risk explanation --> <string name="main_overview_subtitle_risk">"Risk of Infection"</string> <!-- YTXT: App overview body text about risk levels --> @@ -345,7 +345,7 @@ <!-- YTXT: risk details - low risk explanation text --> <string name="risk_details_information_body_low_risk">"You have a low risk of infection because no exposure to people later diagnosed with COVID-19 was logged, or because your encounters were only for a short time and at a greater distance."</string> <!-- YTXT: risk details - low risk explanation text with encounter with low risk --> - <string name="risk_details_information_body_low_risk_with_encounter">"The risk of infection is calculated locally on your device, using exposure logging data. The calculation also takes into account distance and duration of any exposure to persons diagnosed with COVID-19, as well as their potential infectiousness. Your risk of infection cannot be seen by or passed on to anyone else."</string> + <string name="risk_details_information_body_low_risk_with_encounter">"The risk of infection is calculated locally on your smartphone, using exposure logging data. The calculation also takes into account distance and duration of any exposure to persons diagnosed with COVID-19, as well as their potential infectiousness. Your risk of infection cannot be seen by or passed on to anyone else."</string> <!-- YTXT: risk details - increased risk explanation text with variable for day(s) since last contact --> <plurals name="risk_details_information_body_increased_risk"> <item quantity="one">"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."</item> @@ -358,9 +358,9 @@ <!-- YTXT: risk details - risk calculation explanation --> <string name="risk_details_information_body_notice">"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."</string> <!-- YTXT: risk details - risk calculation explanation for low risk --> - <string name="risk_details_information_body_notice_low">"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."</string> + <string name="risk_details_information_body_notice_low">"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 smartphone. Your risk of infection cannot be seen by, or passed on to, anyone else."</string> <!-- YTXT: risk details - risk calculation explanation for increased risk --> - <string name="risk_details_information_body_notice_increased">"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> + <string name="risk_details_information_body_notice_increased">"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 smartphone. 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> <!-- NOTR --> <string name="risk_details_button_update">@string/risk_card_button_update</string> <!-- NOTR --> @@ -372,6 +372,8 @@ <string name="risk_details_explanation_dialog_title">"Information about exposure logging functionality"</string> <!-- YTXT: one time risk explanation dialog - pointing to the faq page for more information--> <string name="risk_details_explanation_dialog_faq_body">"For further information, please see our FAQ page."</string> + <!-- XLNK: risk explanations and informations - pointing to the faq page for more information and contains hyperlink--> + <string name="risk_details_explanation_faq_body_with_link"><a href="https://www.coronawarn.app/en/faq/#encounter_but_green">"For further information, please see our FAQ page."</a></string> <!-- #################################### Onboarding @@ -396,9 +398,9 @@ <!-- XHED: onboarding(together) - two/three line headline under an illustration --> <string name="onboarding_subtitle">"More protection for you and for us all. By using the Corona-Warn-App we can break infection chains much quicker."</string> <!-- YTXT: onboarding(together) - inform about the app --> - <string name="onboarding_body">"Turn your device into a coronavirus warning system. Get an overview of your risk status and find out whether you\'ve had close contact with anyone diagnosed with COVID-19 in the last 14 days."</string> + <string name="onboarding_body">"Turn your smartphone into a coronavirus warning system. Get an overview of your risk status and find out whether you\'ve had close contact with anyone diagnosed with COVID-19 in the last 14 days."</string> <!-- YTXT: onboarding(together) - explain application --> - <string name="onboarding_body_emphasized">"The app logs encounters between individuals by exchanging encrypted, random IDs between their devices, whereby no personal data whatsoever is accessed."</string> + <string name="onboarding_body_emphasized">"The app logs encounters between individuals by exchanging encrypted, random IDs between their smartphones, whereby no personal data whatsoever is accessed."</string> <!-- XACT: onboarding(together) - illustraction description, header image --> <string name="onboarding_illustration_description">"A group of persons use their smartphones around town."</string> <!-- XACT: Onboarding (privacy) page title --> @@ -415,7 +417,7 @@ <!-- XHED: onboarding(tracing) - two/three line headline under an illustration --> <string name="onboarding_tracing_subtitle">"To identify whether you are at risk of infection, you must activate the exposure logging feature."</string> <!-- YTXT: onboarding(tracing) - explain tracing --> - <string name="onboarding_tracing_body">"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."</string> + <string name="onboarding_tracing_body">"Exposure logging works by your smartphone receiving, via Bluetooth, encrypted random IDs of other users and passing your own random ID to their smartphones. This feature can be deactivated at any time."</string> <!-- YTXT: onboarding(tracing) - explain tracing --> <string name="onboarding_tracing_body_emphasized">"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."</string> <!-- YTXT: onboarding(tracing) - easy language explain tracing link--> @@ -425,7 +427,7 @@ <!-- XHED: onboarding(tracing) - headline for consent information --> <string name="onboarding_tracing_headline_consent">"Declaration of Consent"</string> <!-- YTXT: onboarding(tracing) - body for consent information --> - <string name="onboarding_tracing_body_consent">"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 the “Enable†button, you agree to the enabling of the App’s exposure logging feature and the associated data processing."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"In order to use the App’s exposure logging feature, you will have to enable the \"Exposure Notifications\" functionality provided by Google on your smartphone and grant the Corona-Warn-App permission to use this."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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)."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"The Bluetooth signal strength is used to derive the physical distance (the stronger the signal, the smaller the distance). The App then analyzes 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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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â€."</string> + <string name="onboarding_tracing_body_consent">"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 the \"Enable\" button, you agree to the enabling of the App’s exposure logging feature and the associated data processing."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"In order to use the App’s exposure logging feature, you will have to enable the \"Exposure Notifications\" functionality provided by Google on your smartphone and grant the Corona-Warn-App permission to use this."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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)."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"The Bluetooth signal strength is used to derive the physical distance (the stronger the signal, the smaller the distance). The App then analyzes 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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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 smartphone 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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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\"."</string> <!-- XBUT: onboarding(tracing) - button enable tracing --> <string name="onboarding_tracing_button_next">"Activate Exposure Logging"</string> <!-- XTXT: onboarding(tracing) - dialog about tracing permission declined --> @@ -459,7 +461,7 @@ <!-- XBUT: onboarding(tracing) - dialog about manual checking button --> <string name="onboarding_manual_required_dialog_button">"OK"</string> <!-- XACT: onboarding(tracing) - illustraction description, header image --> - <string name="onboarding_tracing_illustration_description">"Three people have activated exposure logging on their devices, which will log their encounters with each other."</string> + <string name="onboarding_tracing_illustration_description">"Three persons have activated exposure logging on their smartphones, which will log their encounters with each other."</string> <!-- XHED: onboarding(tracing) - location explanation for bluetooth headline --> <string name="onboarding_tracing_location_headline">"Allow location access"</string> <!-- XTXT: onboarding(tracing) - location explanation for bluetooth body text --> @@ -473,7 +475,7 @@ <!-- XHED: onboarding(test) - two/three line headline under an illustration --> <string name="onboarding_test_subtitle">"… please report this in the Corona-Warn-App. Sharing your test results is voluntary and secure. Please do this for the sake of everyone\'s health."</string> <!-- YTXT: onboarding(test) - explain test --> - <string name="onboarding_test_body">"Your notification is encrypted securely and processed on a secure server. People whose encrypted random IDs your device has collected will now receive a warning along with information about what they should now do."</string> + <string name="onboarding_test_body">"Your notification is encrypted securely and processed on a secure server. Persons whose encrypted random IDs your smartphone has collected will now receive a warning along with information about what they should now do."</string> <!-- XACT: onboarding(test) - illustraction description, header image --> <string name="onboarding_test_illustration_description">"An encrypted positive test diagnosis is transmitted to the system, which will now warn other users."</string> <!-- XACT: Onboarding (datashare) page title --> @@ -521,7 +523,7 @@ <!-- XTXT: settings(tracing) - shows status under header in home, inactive location --> <string name="settings_tracing_body_inactive_location">"Location services deactivated"</string> <!-- YTXT: settings(tracing) - explains tracings --> - <string name="settings_tracing_body_text">"You have to activate the exposure logging feature to identify whether you are at risk of infection. Risk identification works by your device receiving, via Bluetooth, encrypted random IDs of other users and passing your random ID to their devices. You can disable this feature any time."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Encrypted random IDs only pass information about date, duration, and proximity to other persons (calculated by signal strength). Personal data such as name, address, and location is never recorded. Individuals cannot be identified."</string> + <string name="settings_tracing_body_text">"You have to activate the exposure logging feature to identify whether you are at risk of infection. Risk identification works by your smartphone receiving, via Bluetooth, encrypted random IDs of other users and passing your random ID to their smartphones. You can disable this feature any time."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Encrypted random IDs only pass information about date, duration, and proximity to other persons (calculated by signal strength). Personal data such as name, address, and location is never recorded. Individuals cannot be identified."</string> <!-- XTXT: settings(tracing) - status next to switch under title --> <string name="settings_tracing_status_active">"Active"</string> <!-- XTXT: settings(tracing) - status next to switch under title --> @@ -562,7 +564,7 @@ <item quantity="many">"Exposure logging has been active for %1$s days.\nAn exposure check can only be reliable if exposure logging is permanently activated."</item> </plurals> <!-- XACT: settings(tracing) - describes illustration --> - <string name="settings_tracing_illustration_description_active">"Three people have activated exposure logging on their devices, which will log their encounters with each other."</string> + <string name="settings_tracing_illustration_description_active">"Three persons have activated exposure logging on their smartphones, which will log their encounters with each other."</string> <!-- XACT: settings(tracing) - describes illustration --> <string name="settings_tracing_illustration_description_inactive">"A person has deactivated exposure logging on their smartphone, so an encounter with two other persons is not logged."</string> <!-- XACT: settings(tracing) - describes illustration --> @@ -656,7 +658,7 @@ <!-- YTXT: Body text for about information page --> <string name="information_about_body_emphasized">"Robert Koch Institute (RKI) is Germany’s federal public health body. The RKI publishes the Corona-Warn-App on behalf of the Federal Government. The app is intended as a digital complement to public health measures already introduced: social distancing, hygiene, and face masks."</string> <!-- YTXT: Body text for about information page --> - <string name="information_about_body">"Whoever uses the app helps to trace and break chains of infection. The app saves encounters with other people locally on your device. You are notified if you have encountered people who were later diagnosed with COVID-19. Your identity and privacy are always protected."</string> + <string name="information_about_body">"Whoever uses the app helps to trace and break chains of infection. The app saves encounters with other persons locally on your smartphone. You are notified if you have encountered persons who were later diagnosed with COVID-19. Your identity and privacy are always protected."</string> <!-- XACT: describes illustration --> <string name="information_about_illustration_description">"A group of persons use their smartphones around town."</string> <!-- XHED: Page title for privacy information page, also menu item / button text --> @@ -920,7 +922,7 @@ <!-- XHED: Dialog headline for dispatcher QR prviacy dialog --> <string name="submission_dispatcher_qr_privacy_dialog_headline">"Declaration of Consent"</string> <!-- YTXT: Dialog Body text for dispatcher QR privacy dialog --> - <string name="submission_dispatcher_qr_privacy_dialog_body">"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â€."</string> + <string name="submission_dispatcher_qr_privacy_dialog_body">"By tapping \"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\"."</string> <!-- XBUT: submission(dispatcher QR Dialog) - positive button (right) --> <string name="submission_dispatcher_qr_privacy_dialog_button_positive">"Accept"</string> <!-- XBUT: submission(dispatcher QR Dialog) - negative button (left) --> @@ -940,17 +942,17 @@ <!-- XHED: Page title for the positive result additional warning page--> <string name="submission_positive_other_warning_title">"Warning Others"</string> <!-- XHED: Page headline for the positive result additional warning page--> - <string name="submission_positive_other_warning_headline">"Please help all of us!"</string> + <string name="submission_positive_other_warning_headline">"You can help!"</string> <!-- YTXT: Body text for the positive result additional warning page--> - <string name="submission_positive_other_warning_body">"Next, you can make sure that the Corona-Warn-App shares your random IDs of the last 14 days with others. By doing this, you can warn other people and help to break the infection chain.\n\nSince only impersonal random IDs are transmitted, your identity will remain anonymous."</string> + <string name="submission_positive_other_warning_body">"If you wish, you can now allow the App system to transmit your locally stored random IDs from the last 14 days to others. In this way, you can warn fellow users and help to break the chain of infection.\n\nThe App will only transmit random IDs and information you provided about the onset of symptoms. Your identity will not be disclosed."</string> <!-- XHED: Title for the privacy card--> <string name="submission_positive_other_warning_privacy_title">"Data Privacy"</string> <!-- YTXT: Body text for the privacy card--> - <string name="submission_positive_other_warning_privacy_body">"By tapping “Acceptâ€, you consent to the App sending your positive test result to the App’s server system along with your random IDs from the last 14 days, so that other App users who have enabled the exposure logging feature can be automatically notified that they may have been exposed to a risk of infection. The random IDs transmitted for this purpose do not contain any information that would allow conclusions to be drawn about your identity or your person. \n\nTransmitting your test result via the App is voluntary. You will not be penalized if you do not transmit your test result. Since it is not possible to trace or check whether and how you use the App, nobody but you will know whether you have transmitted the information that you are infected.\n\nYou can withdraw your consent at any time by deleting the App. This withdrawal of your consent will not affect the lawfulness of the processing carried out based on the consent prior to the withdrawal. Further information can be found in the menu under “Data Privacyâ€."</string> + <string name="submission_positive_other_warning_privacy_body">"By tapping “Acceptâ€, you consent to the App sending your positive test result to the App’s server system along with your random IDs from the last 14 days, so that other App users who have enabled the risk identification feature can be automatically notified that they may have been exposed to a risk of infection. If you provided optional information about the onset of your symptoms, the random IDs will be transmitted with a risk value derived from your information, indicating your risk of having infected others on the day the random ID is valid. The random IDs transmitted for this purpose do not contain any information that would allow conclusions to be drawn about your identity or your person.\n\nTransmitting your test result via the App is voluntary. You will not be penalized if you do not transmit your test result. Since it is not possible to trace or check whether and how you use the App, nobody but you will know whether you have transmitted the information that you are infected. \n\nYou can withdraw your consent at any time by deleting the App. This withdrawal of your consent will not affect the lawfulness of the processing carried out on the basis of the consent prior to the withdrawal. Further information can be found under “App Informationâ€> “Data Privacyâ€."</string> <!-- XBUT: other warning continue button --> <string name="submission_positive_other_warning_button">"Accept"</string> <!-- XACT: other warning - illustration description, explanation image --> - <string name="submission_positive_other_illustration_description">"A device transmits an encrypted positive test diagnosis to the system."</string> + <string name="submission_positive_other_illustration_description">"A smartphone transmits an encrypted positive test diagnosis to the system."</string> <!-- Submission Country Selector --> <!-- XHED: Page title for the submission country selection page --> @@ -994,8 +996,10 @@ <!-- Submission Symptoms --> <!-- XHED: Page title for symptom screens --> <string name="submission_symptom_title">"Symptoms"</string> - <!-- YTXT: headline text for initial symptom screen --> - <string name="submission_symptom_initial_headline">"Have you experienced one or more of the following symptoms in the past few days?"</string> + <!-- XTXT: headline text for initial symptom screen --> + <string name="submission_symptom_initial_headline">"Have you experienced one or more of the following symptoms?"</string> + <!-- YTXT: explanation text for initial symptom screen --> + <string name="submission_symptom_initial_explanation">"You can indicate whether and when you noticed any corona symptoms, to allow the App to calculate more accurately the risk of infection to other app users. If you do not want to provide that information, just select “no answerâ€."</string> <!-- YTXT: Bullet points for symptoms --> <string-array name="submission_symptom_symptom_bullets"> <item>"Increased temperature or fever"</item> @@ -1012,7 +1016,7 @@ <!-- XBUT: symptom initial screen no button --> <string name="submission_symptom_negative_button">"No"</string> <!-- XBUT: symptom initial screen no information button --> - <string name="submission_symptom_no_information_button">"No comment"</string> + <string name="submission_symptom_no_information_button">"No answer"</string> <!-- XBUT: symptom initial screen continue button --> <string name="submission_symptom_further_button">"Next"</string> @@ -1060,7 +1064,7 @@ <!-- XBUT: symptom calendar screen more than 2 weeks button --> <string name="submission_symptom_more_two_weeks">"More than 2 weeks ago"</string> <!-- XBUT: symptom calendar screen verify button --> - <string name="submission_symptom_verify">"No comment"</string> + <string name="submission_symptom_verify">"No answer"</string> <!-- Submission Status Card --> <!-- XHED: Page title for the various submission status: fetching --> @@ -1173,6 +1177,10 @@ <string name="errors_generic_button_negative">"Details"</string> <!-- XTXT: error dialog - text when no error description is available --> <string name="errors_generic_text_unknown_error_cause">"An unknown error occurred."</string> + <!-- XTXT: error dialog - text when a catastrophic error occured from which the app recovered automatically via data reset --> + <string name="errors_generic_text_catastrophic_error_recovery_via_reset">"Your app was reset due to a technical problem. This has no effect on the app\'s functionality. You will continue to be notified about exposures and still be able to warn others, should you be tested positive for COVID-19."</string> + <!-- XTXT: error dialog - link for the details button in the catastrophic error recovery dialog --> + <string name="errors_generic_text_catastrophic_error_encryption_failure">"https://www.coronawarn.app/en/faq/#cause9002"</string> <!-- #################################### Just for Development 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 cc5aff1fbcc65677ed32cecd1d9b65475fd21c93..eb3ce0de59b1c33216e9e13a45226fb7021a7bef 100644 --- a/Corona-Warn-App/src/main/res/values-pl/strings.xml +++ b/Corona-Warn-App/src/main/res/values-pl/strings.xml @@ -246,7 +246,7 @@ <!-- XHED: App overview subtitle for tracing explanation--> <string name="main_overview_subtitle_tracing">"Rejestrowanie narażenia"</string> <!-- YTXT: App overview body text about tracing --> - <string name="main_overview_body_tracing">"Rejestrowanie narażenia jest jednÄ… z trzech głównych funkcji aplikacji. Po jej aktywacji rejestrowane sÄ… kontakty z urzÄ…dzeniami innych osób. Nie musisz robić nic wiÄ™cej."</string> + <string name="main_overview_body_tracing">"Rejestrowanie narażenia jest jednÄ… z trzech głównych funkcji aplikacji. Po jej aktywacji rejestrowane sÄ… kontakty ze smartfonami innych osób. Nie musisz robić nic wiÄ™cej."</string> <!-- XHED: App overview subtitle for risk explanation --> <string name="main_overview_subtitle_risk">"Ryzyko zakażenia"</string> <!-- YTXT: App overview body text about risk levels --> @@ -345,7 +345,7 @@ <!-- YTXT: risk details - low risk explanation text --> <string name="risk_details_information_body_low_risk">"Masz niskie ryzyko zakażenia, ponieważ nie zarejestrowano narażenia na kontakt z osobami, u których później zdiagnozowano COVID-19, lub ponieważ Twoje kontakty trwaÅ‚y krótko przy zachowaniu odpowiednio dużej odlegÅ‚oÅ›ci."</string> <!-- YTXT: risk details - low risk explanation text with encounter with low risk --> - <string name="risk_details_information_body_low_risk_with_encounter">"Ryzyko zakażenia jest obliczane lokalnie na Twoim urzÄ…dzeniu na podstawie danych rejestrowania narażenia. Ta kalkulacja uwzglÄ™dnia również dystans i czas trwania narażenia na kontakt z osobami, u których zdiagnozowano COVID-19, a także potencjalnÄ… podatność na zakażenie. Twoje ryzyko zakażenia nie jest widoczne dla nikogo ani nikomu przekazywane."</string> + <string name="risk_details_information_body_low_risk_with_encounter">"Ryzyko zakażenia jest obliczane lokalnie na Twoim smartfonie na podstawie danych rejestrowania narażenia. Ta kalkulacja uwzglÄ™dnia również dystans i czas trwania narażenia na kontakt z osobami, u których zdiagnozowano COVID-19, a także potencjalnÄ… podatność na zakażenie. Twoje ryzyko zakażenia nie jest widoczne dla nikogo ani nikomu przekazywane."</string> <!-- YTXT: risk details - increased risk explanation text with variable for day(s) since last contact --> <plurals name="risk_details_information_body_increased_risk"> <item quantity="one">"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."</item> @@ -358,9 +358,9 @@ <!-- YTXT: risk details - risk calculation explanation --> <string name="risk_details_information_body_notice">"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."</string> <!-- YTXT: risk details - risk calculation explanation for low risk --> - <string name="risk_details_information_body_notice_low">"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."</string> + <string name="risk_details_information_body_notice_low">"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 na smartfonie. Twoje ryzyko zakażenia nie jest widoczne dla nikogo ani nikomu przekazywane."</string> <!-- YTXT: risk details - risk calculation explanation for increased risk --> - <string name="risk_details_information_body_notice_increased">"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> + <string name="risk_details_information_body_notice_increased">"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 na smartfonie. 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> <!-- NOTR --> <string name="risk_details_button_update">@string/risk_card_button_update</string> <!-- NOTR --> @@ -371,7 +371,9 @@ <!-- XHED: one time risk explanation dialog title --> <string name="risk_details_explanation_dialog_title">"Informacje o funkcjonalnoÅ›ci rejestrowania narażenia"</string> <!-- YTXT: one time risk explanation dialog - pointing to the faq page for more information--> - <string name="risk_details_explanation_dialog_faq_body">"WiÄ™cej informacji znajduje siÄ™ na naszej stronie CzÄ™sto zadawane pytania."</string> + <string name="risk_details_explanation_dialog_faq_body">"WiÄ™cej informacji znajduje siÄ™ na naszej stronie „CzÄ™sto zadawane pytaniaâ€."</string> + <!-- XLNK: risk explanations and informations - pointing to the faq page for more information and contains hyperlink--> + <string name="risk_details_explanation_faq_body_with_link"><a href="https://www.coronawarn.app/en/faq/#encounter_but_green">"WiÄ™cej informacji znajduje siÄ™ na naszej stronie „CzÄ™sto zadawane pytaniaâ€."</a></string> <!-- #################################### Onboarding @@ -396,9 +398,9 @@ <!-- XHED: onboarding(together) - two/three line headline under an illustration --> <string name="onboarding_subtitle">"WiÄ™ksza ochrona dla Ciebie i dla nas wszystkich. KorzystajÄ…c z aplikacji Corona-Warn-App, możemy znacznie szybciej przerwać Å‚aÅ„cuchy zakażeÅ„."</string> <!-- YTXT: onboarding(together) - inform about the app --> - <string name="onboarding_body">"ZmieÅ„ swoje urzÄ…dzenie w system ostrzegania przed koronawirusem. Zapoznaj siÄ™ ze swoim statusem ryzyka i dowiedz siÄ™, czy miaÅ‚eÅ›(-aÅ›) bliski kontakt z osobÄ…, u której w ciÄ…gu ostatnich 14 dni zdiagnozowano COVID-19."</string> + <string name="onboarding_body">"ZmieÅ„ swój smartfon w system ostrzegania przed koronawirusem. Zapoznaj siÄ™ ze swoim statusem ryzyka i dowiedz siÄ™, czy miaÅ‚eÅ›(-aÅ›) bliski kontakt z osobÄ…, u której w ciÄ…gu ostatnich 14 dni zdiagnozowano COVID-19."</string> <!-- YTXT: onboarding(together) - explain application --> - <string name="onboarding_body_emphasized">"Aplikacja rejestruje kontakty miÄ™dzy osobami poprzez wymianÄ™ zaszyfrowanych, losowych identyfikatorów miÄ™dzy ich urzÄ…dzeniami bez uzyskiwania dostÄ™pu do danych osobowych."</string> + <string name="onboarding_body_emphasized">"Aplikacja rejestruje kontakty miÄ™dzy osobami poprzez wymianÄ™ zaszyfrowanych, losowych identyfikatorów miÄ™dzy ich smartfonami bez uzyskiwania dostÄ™pu do danych osobowych."</string> <!-- XACT: onboarding(together) - illustraction description, header image --> <string name="onboarding_illustration_description">"Grupa osób korzysta ze smartfonów na mieÅ›cie."</string> <!-- XACT: Onboarding (privacy) page title --> @@ -415,7 +417,7 @@ <!-- XHED: onboarding(tracing) - two/three line headline under an illustration --> <string name="onboarding_tracing_subtitle">"Aby ustalić wystÄ™powanie ryzyka zakażenia, musisz aktywować funkcjÄ™ rejestrowania narażenia."</string> <!-- YTXT: onboarding(tracing) - explain tracing --> - <string name="onboarding_tracing_body">"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."</string> + <string name="onboarding_tracing_body">"DziaÅ‚anie funkcji rejestrowania narażenia polega na odbieraniu przez Twój smartfon za pomocÄ… Bluetooth zaszyfrowanych, losowych identyfikatorów innych użytkowników i przekazywaniu Twoich wÅ‚asnych, losowych identyfikatorów do ich smartfonów. FunkcjÄ™ tÄ™ można wyÅ‚Ä…czyć w dowolnym momencie."</string> <!-- YTXT: onboarding(tracing) - explain tracing --> <string name="onboarding_tracing_body_emphasized">"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."</string> <!-- YTXT: onboarding(tracing) - easy language explain tracing link--> @@ -425,7 +427,7 @@ <!-- XHED: onboarding(tracing) - headline for consent information --> <string name="onboarding_tracing_headline_consent">"OÅ›wiadczenia o wyrażeniu zgody"</string> <!-- YTXT: onboarding(tracing) - body for consent information --> - <string name="onboarding_tracing_body_consent">"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 the “Enable†button, you agree to the enabling of the App’s exposure logging feature and the associated data processing."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"In order to use the App’s exposure logging feature, you will have to enable the \"Exposure Notifications\" functionality provided by Google on your smartphone and grant the Corona-Warn-App permission to use this."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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)."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"The Bluetooth signal strength is used to derive the physical distance (the stronger the signal, the smaller the distance). The App then analyzes 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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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â€."</string> + <string name="onboarding_tracing_body_consent">"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 the \"Enable\" button, you agree to the enabling of the App’s exposure logging feature and the associated data processing."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"In order to use the App’s exposure logging feature, you will have to enable the \"Exposure Notifications\" functionality provided by Google on your smartphone and grant the Corona-Warn-App permission to use this."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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)."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"The Bluetooth signal strength is used to derive the physical distance (the stronger the signal, the smaller the distance). The App then analyzes 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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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 smartphone 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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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\"."</string> <!-- XBUT: onboarding(tracing) - button enable tracing --> <string name="onboarding_tracing_button_next">"Aktywuj rejestrowanie narażenia"</string> <!-- XTXT: onboarding(tracing) - dialog about tracing permission declined --> @@ -459,7 +461,7 @@ <!-- XBUT: onboarding(tracing) - dialog about manual checking button --> <string name="onboarding_manual_required_dialog_button">"OK"</string> <!-- XACT: onboarding(tracing) - illustraction description, header image --> - <string name="onboarding_tracing_illustration_description">"Trzy osoby aktywowaÅ‚y rejestrowanie narażenia na swoich urzÄ…dzeniach, które bÄ™dÄ… rejestrować ich wzajemne kontakty."</string> + <string name="onboarding_tracing_illustration_description">"Trzy osoby aktywowaÅ‚y rejestrowanie narażenia na swoich smartfonach, które bÄ™dÄ… rejestrować ich wzajemne kontakty."</string> <!-- XHED: onboarding(tracing) - location explanation for bluetooth headline --> <string name="onboarding_tracing_location_headline">"Zezwól na dostÄ™p do lokalizacji"</string> <!-- XTXT: onboarding(tracing) - location explanation for bluetooth body text --> @@ -473,7 +475,7 @@ <!-- XHED: onboarding(test) - two/three line headline under an illustration --> <string name="onboarding_test_subtitle">"… 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."</string> <!-- YTXT: onboarding(test) - explain test --> - <string name="onboarding_test_body">"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."</string> + <string name="onboarding_test_body">"Twoje powiadomienie jest szyfrowane w bezpieczny sposób i przetwarzane na bezpiecznym serwerze. Osoby, których zaszyfrowane losowe identyfikatory zostaÅ‚y zgromadzone przez Twój smartfon, otrzymajÄ… wtedy ostrzeżenie wraz z informacjÄ… na temat dalszych kroków postÄ™powania."</string> <!-- XACT: onboarding(test) - illustraction description, header image --> <string name="onboarding_test_illustration_description">"Zaszyfrowana diagnoza zakażenia jest przesyÅ‚ana do systemu, który bÄ™dzie teraz ostrzegaÅ‚ innych użytkowników."</string> <!-- XACT: Onboarding (datashare) page title --> @@ -521,7 +523,7 @@ <!-- XTXT: settings(tracing) - shows status under header in home, inactive location --> <string name="settings_tracing_body_inactive_location">"UsÅ‚ugi lokalizacji dezaktywowane"</string> <!-- YTXT: settings(tracing) - explains tracings --> - <string name="settings_tracing_body_text">"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 losowych identyfikatorów do ich urzÄ…dzeÅ„. FunkcjÄ™ tÄ™ można wyÅ‚Ä…czyć w dowolnym momencie. "<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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."</string> + <string name="settings_tracing_body_text">"DziaÅ‚anie funkcji rejestrowania narażenia polega na odbieraniu przez Twój smartfon za pomocÄ… Bluetooth zaszyfrowanych, losowych identyfikatorów innych użytkowników i przekazywaniu Twoich losowych identyfikatorów do ich smartfonów. FunkcjÄ™ tÄ™ można wyÅ‚Ä…czyć w dowolnym momencie. "<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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."</string> <!-- XTXT: settings(tracing) - status next to switch under title --> <string name="settings_tracing_status_active">"Aktywne"</string> <!-- XTXT: settings(tracing) - status next to switch under title --> @@ -562,7 +564,7 @@ <item quantity="many">"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."</item> </plurals> <!-- XACT: settings(tracing) - describes illustration --> - <string name="settings_tracing_illustration_description_active">"Trzy osoby aktywowaÅ‚y rejestrowanie narażenia na swoich urzÄ…dzeniach, które bÄ™dÄ… rejestrować ich wzajemne kontakty."</string> + <string name="settings_tracing_illustration_description_active">"Trzy osoby aktywowaÅ‚y rejestrowanie narażenia na swoich smartfonach, które bÄ™dÄ… rejestrować ich wzajemne kontakty."</string> <!-- XACT: settings(tracing) - describes illustration --> <string name="settings_tracing_illustration_description_inactive">"Jedna osoba dezaktywowaÅ‚a rejestrowanie narażenia na swoim smartfonie, wiÄ™c kontakt z dwiema pozostaÅ‚ymi osobami nie jest rejestrowany."</string> <!-- XACT: settings(tracing) - describes illustration --> @@ -656,7 +658,7 @@ <!-- YTXT: Body text for about information page --> <string name="information_about_body_emphasized">"Instytut Roberta Kocha (RKI) to niemiecka federalna instytucja zdrowia publicznego. RKI publikuje aplikacjÄ™ Corona-Warn-App w imieniu rzÄ…du federalnego. Aplikacja ta sÅ‚uży jako cyfrowe uzupeÅ‚nienie już wprowadzonych Å›rodków ochrony zdrowia publicznego, takich jak zachowanie dystansu spoÅ‚ecznego, dbanie o higienÄ™ oraz noszenie maseczek."</string> <!-- YTXT: Body text for about information page --> - <string name="information_about_body">"Wszystkie osoby korzystajÄ…ce z aplikacji pomagajÄ… w Å›ledzeniu i przerwaniu Å‚aÅ„cuchów zakażeÅ„. Aplikacja zapisuje kontakty z innymi osobami lokalnie na Twoim urzÄ…dzeniu. Otrzymasz powiadomienie, jeÅ›li okaże siÄ™, że u osób, z którymi miaÅ‚eÅ›(-aÅ›) kontakt, zdiagnozowano później COVID-19. Twoja tożsamość i prywatność sÄ… zawsze chronione."</string> + <string name="information_about_body">"Wszystkie osoby korzystajÄ…ce z aplikacji pomagajÄ… w Å›ledzeniu i przerwaniu Å‚aÅ„cuchów zakażeÅ„. Aplikacja zapisuje kontakty z innymi osobami lokalnie na Twoim smartfonie. Otrzymasz powiadomienie, jeÅ›li okaże siÄ™, że u osób, z którymi miaÅ‚eÅ›(-aÅ›) kontakt, zdiagnozowano później COVID-19. Twoja tożsamość i prywatność sÄ… zawsze chronione."</string> <!-- XACT: describes illustration --> <string name="information_about_illustration_description">"Grupa osób korzysta ze smartfonów na mieÅ›cie."</string> <!-- XHED: Page title for privacy information page, also menu item / button text --> @@ -920,7 +922,7 @@ <!-- XHED: Dialog headline for dispatcher QR prviacy dialog --> <string name="submission_dispatcher_qr_privacy_dialog_headline">"OÅ›wiadczenia o wyrażeniu zgody"</string> <!-- YTXT: Dialog Body text for dispatcher QR privacy dialog --> - <string name="submission_dispatcher_qr_privacy_dialog_body">"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â€."</string> + <string name="submission_dispatcher_qr_privacy_dialog_body">"By tapping \"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\"."</string> <!-- XBUT: submission(dispatcher QR Dialog) - positive button (right) --> <string name="submission_dispatcher_qr_privacy_dialog_button_positive">"Akceptuj"</string> <!-- XBUT: submission(dispatcher QR Dialog) - negative button (left) --> @@ -940,13 +942,13 @@ <!-- XHED: Page title for the positive result additional warning page--> <string name="submission_positive_other_warning_title">"Ostrzeganie innych"</string> <!-- XHED: Page headline for the positive result additional warning page--> - <string name="submission_positive_other_warning_headline">"Pomóż nam wszystkim!"</string> + <string name="submission_positive_other_warning_headline">"Możesz pomóc!"</string> <!-- YTXT: Body text for the positive result additional warning page--> - <string name="submission_positive_other_warning_body">"Teraz możesz aktywować udostÄ™pnianie Twoich losowych identyfikatorów z ostatnich 14 dni. W ten sposób ostrzeżesz inne osoby i pomożesz w przerwaniu Å‚aÅ„cucha zakażeÅ„.\n\nZachowasz anonimowość, ponieważ przekazywane sÄ… tylko bezosobowe, losowe identyfikatory."</string> + <string name="submission_positive_other_warning_body">"JeÅ›li chcesz, możesz teraz aktywować w aplikacji udostÄ™pnianie innym Twoich losowych identyfikatorów z ostatnich 14 dni. W ten sposób ostrzeżesz inne osoby i pomożesz w przerwaniu Å‚aÅ„cucha zakażeÅ„.\n\nAplikacja udostÄ™pnie losowe identyfikatory i podane przez Ciebie informacje o wystÄ…pieniu symptomów. Twoja tożsamość nie zostanie ujawniona."</string> <!-- XHED: Title for the privacy card--> <string name="submission_positive_other_warning_privacy_title">"Prywatność danych"</string> <!-- YTXT: Body text for the privacy card--> - <string name="submission_positive_other_warning_privacy_body">"By tapping “Acceptâ€, you consent to the App sending your positive test result to the App’s server system along with your random IDs from the last 14 days, so that other App users who have enabled the exposure logging feature can be automatically notified that they may have been exposed to a risk of infection. The random IDs transmitted for this purpose do not contain any information that would allow conclusions to be drawn about your identity or your person. \n\nTransmitting your test result via the App is voluntary. You will not be penalized if you do not transmit your test result. Since it is not possible to trace or check whether and how you use the App, nobody but you will know whether you have transmitted the information that you are infected.\n\nYou can withdraw your consent at any time by deleting the App. This withdrawal of your consent will not affect the lawfulness of the processing carried out based on the consent prior to the withdrawal. Further information can be found in the menu under “Data Privacyâ€."</string> + <string name="submission_positive_other_warning_privacy_body">"By tapping “Acceptâ€, you consent to the App sending your positive test result to the App’s server system along with your random IDs from the last 14 days, so that other App users who have enabled the risk identification feature can be automatically notified that they may have been exposed to a risk of infection. If you provided optional information about the onset of your symptoms, the random IDs will be transmitted with a risk value derived from your information, indicating your risk of having infected others on the day the random ID is valid. The random IDs transmitted for this purpose do not contain any information that would allow conclusions to be drawn about your identity or your person.\n\nTransmitting your test result via the App is voluntary. You will not be penalized if you do not transmit your test result. Since it is not possible to trace or check whether and how you use the App, nobody but you will know whether you have transmitted the information that you are infected. \n\nYou can withdraw your consent at any time by deleting the App. This withdrawal of your consent will not affect the lawfulness of the processing carried out on the basis of the consent prior to the withdrawal. Further information can be found under “App Informationâ€> “Data Privacyâ€."</string> <!-- XBUT: other warning continue button --> <string name="submission_positive_other_warning_button">"Akceptuj"</string> <!-- XACT: other warning - illustration description, explanation image --> @@ -994,8 +996,10 @@ <!-- Submission Symptoms --> <!-- XHED: Page title for symptom screens --> <string name="submission_symptom_title">"Symptomy"</string> - <!-- YTXT: headline text for initial symptom screen --> - <string name="submission_symptom_initial_headline">"Czy w ciÄ…gu ostatnich kilku dni wystÄ…piÅ‚ u Ciebie jeden lub kilka z wymienionych poniżej symptomów?"</string> + <!-- XTXT: headline text for initial symptom screen --> + <string name="submission_symptom_initial_headline">"Czy wystÄ…piÅ‚ u Ciebie jeden lub kilka z wymienionych poniżej symptomów?"</string> + <!-- YTXT: explanation text for initial symptom screen --> + <string name="submission_symptom_initial_explanation">"Możesz podać, czy i kiedy zauważyÅ‚eÅ›(-Å‚aÅ›) symptomy koronawirusa, aby umożliwić aplikacji dokÅ‚adniejsze obliczenie ryzyka zakażenia innych użytkowników aplikacji. JeÅ›li nie chcesz podawać tych informacji, wybierz „brak odpowiedziâ€."</string> <!-- YTXT: Bullet points for symptoms --> <string-array name="submission_symptom_symptom_bullets"> <item>"Podwyższona temperatura lub gorÄ…czka"</item> @@ -1012,7 +1016,7 @@ <!-- XBUT: symptom initial screen no button --> <string name="submission_symptom_negative_button">"Nie"</string> <!-- XBUT: symptom initial screen no information button --> - <string name="submission_symptom_no_information_button">"Bez komentarza"</string> + <string name="submission_symptom_no_information_button">"Brak odpowiedzi"</string> <!-- XBUT: symptom initial screen continue button --> <string name="submission_symptom_further_button">"Dalej"</string> @@ -1060,7 +1064,7 @@ <!-- XBUT: symptom calendar screen more than 2 weeks button --> <string name="submission_symptom_more_two_weeks">"Ponad 2 tygodnie temu"</string> <!-- XBUT: symptom calendar screen verify button --> - <string name="submission_symptom_verify">"Bez komentarza"</string> + <string name="submission_symptom_verify">"Brak odpowiedzi"</string> <!-- Submission Status Card --> <!-- XHED: Page title for the various submission status: fetching --> @@ -1173,6 +1177,10 @@ <string name="errors_generic_button_negative">"Szczegóły"</string> <!-- XTXT: error dialog - text when no error description is available --> <string name="errors_generic_text_unknown_error_cause">"WystÄ…piÅ‚ nieznany bÅ‚Ä…d."</string> + <!-- XTXT: error dialog - text when a catastrophic error occured from which the app recovered automatically via data reset --> + <string name="errors_generic_text_catastrophic_error_recovery_via_reset">"Twoja aplikacja zostaÅ‚a zresetowana z powodu problemu technicznego. Nie bÄ™dzie to miaÅ‚o wpÅ‚ywu na funkcjonalność aplikacji. Nadal bÄ™dziesz otrzymywać powiadomienia o narażeniach i bÄ™dziesz w stanie ostrzegać innych w razie pozytywnego wyniku testu na COVID-19."</string> + <!-- XTXT: error dialog - link for the details button in the catastrophic error recovery dialog --> + <string name="errors_generic_text_catastrophic_error_encryption_failure">"https://www.coronawarn.app/en/faq/#cause9002"</string> <!-- #################################### Just for Development 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 8111b882ca4de9e4ab2598dd6f120e12ddaeb278..5d077c7223767dbbc620596050b47a64d2b886ea 100644 --- a/Corona-Warn-App/src/main/res/values-ro/strings.xml +++ b/Corona-Warn-App/src/main/res/values-ro/strings.xml @@ -246,7 +246,7 @@ <!-- XHED: App overview subtitle for tracing explanation--> <string name="main_overview_subtitle_tracing">"ÃŽnregistrarea în jurnal a expunerilor"</string> <!-- YTXT: App overview body text about tracing --> - <string name="main_overview_body_tracing">"ÃŽnregistrarea în jurnal a expunerilor este una dintre cele trei caracteristici centrale ale aplicaÈ›iei. Când o activaÈ›i, sunt înregistrate întâlnirile cu dispozitivele altor persoane. Nu trebuie să faceÈ›i nimic altceva."</string> + <string name="main_overview_body_tracing">"ÃŽnregistrarea în jurnal a expunerilor este una dintre cele trei caracteristici centrale ale aplicaÈ›iei. Când o activaÈ›i, sunt înregistrate întâlnirile cu smartphone-urile altor persoane. Nu trebuie să faceÈ›i nimic altceva."</string> <!-- XHED: App overview subtitle for risk explanation --> <string name="main_overview_subtitle_risk">"Risc de infectare"</string> <!-- YTXT: App overview body text about risk levels --> @@ -345,7 +345,7 @@ <!-- YTXT: risk details - low risk explanation text --> <string name="risk_details_information_body_low_risk">"AveÈ›i un risc redus de infectare deoarece nu a fost înregistrată nicio expunere la persoane diagnosticate ulterior cu COVID-19 sau întâlnirile au fost limitate la o perioadă scurtă È™i la o distanță mai mare."</string> <!-- YTXT: risk details - low risk explanation text with encounter with low risk --> - <string name="risk_details_information_body_low_risk_with_encounter">"Riscul de infectare este calculat local pe dispozitivul dvs., utilizând datele de înregistrare în jurnal a expunerilor. Calculul poate È›ine cont È™i de distanÈ›a È™i durata expunerii la persoane diagnosticate cu COVID-19, precum È™i de potenÈ›iala contagiozitate a acestora. Riscul dvs. de infectare nu poate fi observat sau transmis mai departe niciunei alte persoane."</string> + <string name="risk_details_information_body_low_risk_with_encounter">"Riscul de infectare este calculat local pe smartphone-ul dvs., utilizând datele de înregistrare în jurnal a expunerilor. Calculul poate È›ine cont È™i de distanÈ›a È™i durata expunerii la persoane diagnosticate cu COVID-19, precum È™i de potenÈ›iala contagiozitate a acestora. Riscul dvs. de infectare nu poate fi observat sau transmis mai departe niciunei alte persoane."</string> <!-- YTXT: risk details - increased risk explanation text with variable for day(s) since last contact --> <plurals name="risk_details_information_body_increased_risk"> <item quantity="one">"AveÈ›i un risc crescut de infectare deoarece aÈ›i fost expus ultima dată acum %1$s zi pe o perioadă mai lungă de timp È™i în strânsă proximitate cu cel puÈ›in o persoană diagnosticată cu COVID-19."</item> @@ -358,9 +358,9 @@ <!-- YTXT: risk details - risk calculation explanation --> <string name="risk_details_information_body_notice">"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."</string> <!-- YTXT: risk details - risk calculation explanation for low risk --> - <string name="risk_details_information_body_notice_low">"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."</string> + <string name="risk_details_information_body_notice_low">"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 smartphone-ul dvs. Riscul dvs. de infectare nu poate fi văzut de o altă persoană sau transmis unei alte persoane."</string> <!-- YTXT: risk details - risk calculation explanation for increased risk --> - <string name="risk_details_information_body_notice_increased">"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> + <string name="risk_details_information_body_notice_increased">"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 smartphone-ul 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> <!-- NOTR --> <string name="risk_details_button_update">@string/risk_card_button_update</string> <!-- NOTR --> @@ -372,6 +372,8 @@ <string name="risk_details_explanation_dialog_title">"InformaÈ›ii despre funcÈ›ionalitatea de înregistrare în jurnal a expunerilor"</string> <!-- YTXT: one time risk explanation dialog - pointing to the faq page for more information--> <string name="risk_details_explanation_dialog_faq_body">"Pentru mai multe informaÈ›ii, consultaÈ›i pagina noastră de întrebări frecvente."</string> + <!-- XLNK: risk explanations and informations - pointing to the faq page for more information and contains hyperlink--> + <string name="risk_details_explanation_faq_body_with_link"><a href="https://www.coronawarn.app/en/faq/#encounter_but_green">"Pentru mai multe informaÈ›ii, consultaÈ›i pagina noastră de întrebări frecvente."</a></string> <!-- #################################### Onboarding @@ -396,9 +398,9 @@ <!-- XHED: onboarding(together) - two/three line headline under an illustration --> <string name="onboarding_subtitle">"Mai multă protecÈ›ie pentru dvs. È™i pentru noi toÈ›i. Utilizând Corona-Warn-App putem întrerupe mai uÈ™or lanÈ›ul de infectare."</string> <!-- YTXT: onboarding(together) - inform about the app --> - <string name="onboarding_body">"TransformaÈ›i-vă dispozitivul într-un sistem de avertizare împotriva coronavirusului. ObÈ›ineÈ›i un sumar al stării de risc È™i aflaÈ›i dacă aÈ›i intrat în contact strâns cu persoane diagnosticate cu COVID-19 în ultimele 14 zile."</string> + <string name="onboarding_body">"TransformaÈ›i-vă smartphone-ul într-un sistem de avertizare împotriva coronavirusului. ObÈ›ineÈ›i un sumar al stării de risc È™i aflaÈ›i dacă aÈ›i intrat în contact strâns cu persoane diagnosticate cu COVID-19 în ultimele 14 zile."</string> <!-- YTXT: onboarding(together) - explain application --> - <string name="onboarding_body_emphasized">"AplicaÈ›ia înregistrează în jurnal întâlnirile dintre persoane prin dispozitivele acestora, care schimbă ID-uri aleatorii criptate, fără a accesa niciun fel de date personale."</string> + <string name="onboarding_body_emphasized">"AplicaÈ›ia înregistrează în jurnal întâlnirile dintre persoane prin smartphone-urile acestora, care schimbă ID-uri aleatorii criptate, fără a accesa niciun fel de date personale."</string> <!-- XACT: onboarding(together) - illustraction description, header image --> <string name="onboarding_illustration_description">"Un grup de persoane își utilizează smartphone-urile prin oraÈ™."</string> <!-- XACT: Onboarding (privacy) page title --> @@ -415,7 +417,7 @@ <!-- XHED: onboarding(tracing) - two/three line headline under an illustration --> <string name="onboarding_tracing_subtitle">"Pentru a identifica dacă sunteÈ›i supus riscului de infectare, trebuie să activaÈ›i caracteristica de înregistrare în jurnal a expunerilor."</string> <!-- YTXT: onboarding(tracing) - explain tracing --> - <string name="onboarding_tracing_body">"ÃŽ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ă."</string> + <string name="onboarding_tracing_body">"ÃŽnregistrarea în jurnal a expunerilor funcÈ›ionează astfel: smartphone-ul dvs. primeÈ™te prin Bluetooth ID-uri aleatorii criptate ale altor utilizatori È™i transmite propriul dvs. ID aleatoriu către smartphone-urile acestora. Această caracteristică poate fi oricând dezactivată."</string> <!-- YTXT: onboarding(tracing) - explain tracing --> <string name="onboarding_tracing_body_emphasized">"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."</string> <!-- YTXT: onboarding(tracing) - easy language explain tracing link--> @@ -425,7 +427,7 @@ <!-- XHED: onboarding(tracing) - headline for consent information --> <string name="onboarding_tracing_headline_consent">"DeclaraÈ›ie de consimțământ"</string> <!-- YTXT: onboarding(tracing) - body for consent information --> - <string name="onboarding_tracing_body_consent">"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 the “Enable†button, you agree to the enabling of the App’s exposure logging feature and the associated data processing."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"In order to use the App’s exposure logging feature, you will have to enable the \"Exposure Notifications\" functionality provided by Google on your smartphone and grant the Corona-Warn-App permission to use this."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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)."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"The Bluetooth signal strength is used to derive the physical distance (the stronger the signal, the smaller the distance). The App then analyzes 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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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â€."</string> + <string name="onboarding_tracing_body_consent">"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 the \"Enable\" button, you agree to the enabling of the App’s exposure logging feature and the associated data processing."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"In order to use the App’s exposure logging feature, you will have to enable the \"Exposure Notifications\" functionality provided by Google on your smartphone and grant the Corona-Warn-App permission to use this."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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)."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"The Bluetooth signal strength is used to derive the physical distance (the stronger the signal, the smaller the distance). The App then analyzes 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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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 smartphone 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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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\"."</string> <!-- XBUT: onboarding(tracing) - button enable tracing --> <string name="onboarding_tracing_button_next">"ActivaÈ›i înregistrarea în jurnal a expunerilor"</string> <!-- XTXT: onboarding(tracing) - dialog about tracing permission declined --> @@ -459,7 +461,7 @@ <!-- XBUT: onboarding(tracing) - dialog about manual checking button --> <string name="onboarding_manual_required_dialog_button">"OK"</string> <!-- XACT: onboarding(tracing) - illustraction description, header image --> - <string name="onboarding_tracing_illustration_description">"Trei persoane È™i-au activat pe dispozitiv înregistrarea în jurnal a expunerilor, ceea ce va duce la înregistrarea întâlnirilor lor."</string> + <string name="onboarding_tracing_illustration_description">"Trei persoane È™i-au activat pe smartphone înregistrarea în jurnal a expunerilor, ceea ce va duce la înregistrarea întâlnirilor lor."</string> <!-- XHED: onboarding(tracing) - location explanation for bluetooth headline --> <string name="onboarding_tracing_location_headline">"PermiteÈ›i accesul la locaÈ›ie"</string> <!-- XTXT: onboarding(tracing) - location explanation for bluetooth body text --> @@ -473,7 +475,7 @@ <!-- XHED: onboarding(test) - two/three line headline under an illustration --> <string name="onboarding_test_subtitle">"… vă rugăm să raportaÈ›i acest lucru în Corona-Warn-App. ÃŽmpărtășirea rezultatului testului este voluntară È™i securizată. Vă rugăm să faceÈ›i acest lucru pentru binele celorlalÈ›i."</string> <!-- YTXT: onboarding(test) - explain test --> - <string name="onboarding_test_body">"Notificarea dvs. este criptată în mod securizat È™i este prelucrată pe un server sigur. Persoanele ale căror ID-uri aleatorii criptate au fost colectate de dispozitivul dvs. vor primi acum o avertizare împreună cu informaÈ›ii despre paÈ™ii de urmat."</string> + <string name="onboarding_test_body">"Notificarea dvs. este criptată în mod securizat È™i este prelucrată pe un server sigur. Persoanele ale căror ID-uri aleatorii criptate au fost colectate de smartphone-ul dvs. vor primi acum o avertizare împreună cu informaÈ›ii despre paÈ™ii de urmat."</string> <!-- XACT: onboarding(test) - illustraction description, header image --> <string name="onboarding_test_illustration_description">"Un diagnostic de test pozitiv criptat este transmis la sistem, iar acesta va avertiza apoi ceilalÈ›i utilizatori."</string> <!-- XACT: Onboarding (datashare) page title --> @@ -521,7 +523,7 @@ <!-- XTXT: settings(tracing) - shows status under header in home, inactive location --> <string name="settings_tracing_body_inactive_location">"Serviciile de localizare au fost dezactivate"</string> <!-- YTXT: settings(tracing) - explains tracings --> - <string name="settings_tracing_body_text">"Trebuie să activaÈ›i caracteristica de înregistrare în jurnal a expunerilor, pentru a identifica dacă sunteÈ›i supus riscului de infectare. Identificarea riscului 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. PuteÈ›i dezactiva oricând această caracteristică."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"ID-urile aleatorii criptate transmit informaÈ›ii doar despre dată, durată È™i proximitatea față de alte persoane (calculate utilizând intensitatea semnalului). Datele personale, precum numele, adresa È™i locaÈ›ia nu sunt înregistrate niciodată. Nu se pot identifica persoanele individuale."</string> + <string name="settings_tracing_body_text">"Trebuie să activaÈ›i caracteristica de înregistrare în jurnal a expunerilor, pentru a identifica dacă sunteÈ›i supus riscului de infectare. Identificarea riscului funcÈ›ionează astfel: smartphone-ul dvs. primeÈ™te prin Bluetooth ID-uri aleatorii criptate ale altor utilizatori È™i transmite propriul dvs. ID aleatoriu cătresmartphone-urile acestora. PuteÈ›i dezactiva oricând această caracteristică."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"ID-urile aleatorii criptate transmit informaÈ›ii doar despre dată, durată È™i proximitatea față de alte persoane (calculate utilizând intensitatea semnalului). Datele personale, precum numele, adresa È™i locaÈ›ia nu sunt înregistrate niciodată. Nu se pot identifica persoanele individuale."</string> <!-- XTXT: settings(tracing) - status next to switch under title --> <string name="settings_tracing_status_active">"Activă"</string> <!-- XTXT: settings(tracing) - status next to switch under title --> @@ -562,7 +564,7 @@ <item quantity="many">"ÃŽnregistrarea în jurnal a expunerilor a fost activă %1$s zile.\nO verificare a expunerii poate fi de încredere doar dacă înregistrarea în jurnal a expunerilor este activată permanent."</item> </plurals> <!-- XACT: settings(tracing) - describes illustration --> - <string name="settings_tracing_illustration_description_active">"Trei persoane È™i-au activat pe dispozitiv înregistrarea în jurnal a expunerilor, ceea ce va duce la înregistrarea întâlnirilor lor."</string> + <string name="settings_tracing_illustration_description_active">"Trei persoane È™i-au activat pe smartphone înregistrarea în jurnal a expunerilor, ceea ce va duce la înregistrarea întâlnirilor lor."</string> <!-- XACT: settings(tracing) - describes illustration --> <string name="settings_tracing_illustration_description_inactive">"O persoană È™i-a dezactivat de pe smartphone înregistrarea în jurnal a expunerilor È™i, prin urmare, întâlnirea cu alte două persoane nu este înregistrată."</string> <!-- XACT: settings(tracing) - describes illustration --> @@ -656,7 +658,7 @@ <!-- YTXT: Body text for about information page --> <string name="information_about_body_emphasized">"Robert Koch Institute (RKI) este un organism federal de sănătate publică din Germania. RKI a publicat aplicaÈ›ia Corona-Warn în numele Guvernului Federal. AplicaÈ›ia are drept scop să completeze sub formă digitală măsurile de sănătate publică deja introduse: distanÈ›area socială, igiena È™i purtarea măștii."</string> <!-- YTXT: Body text for about information page --> - <string name="information_about_body">"Persoanele care utilizează aplicaÈ›ia ajută la urmărirea È™i întreruperea lanÈ›urilor de infectare. AplicaÈ›ia salvează local, pe dispozitivul dvs., întâlnirile cu alte persoane. SunteÈ›i notificat dacă aÈ›i întâlnit persoane care au fost diagnosticate ulterior cu COVID-19. Identitatea È™i confidenÈ›ialitatea dvs. sunt protejate întotdeauna."</string> + <string name="information_about_body">"Persoanele care utilizează aplicaÈ›ia ajută la urmărirea È™i întreruperea lanÈ›urilor de infectare. AplicaÈ›ia salvează local, pe smartphone-ul dvs., întâlnirile cu alte persoane. SunteÈ›i notificat dacă aÈ›i întâlnit persoane care au fost diagnosticate ulterior cu COVID-19. Identitatea È™i confidenÈ›ialitatea dvs. sunt protejate întotdeauna."</string> <!-- XACT: describes illustration --> <string name="information_about_illustration_description">"Un grup de persoane își utilizează smartphone-urile prin oraÈ™."</string> <!-- XHED: Page title for privacy information page, also menu item / button text --> @@ -920,7 +922,7 @@ <!-- XHED: Dialog headline for dispatcher QR prviacy dialog --> <string name="submission_dispatcher_qr_privacy_dialog_headline">"DeclaraÈ›ie de consimțământ"</string> <!-- YTXT: Dialog Body text for dispatcher QR privacy dialog --> - <string name="submission_dispatcher_qr_privacy_dialog_body">"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â€."</string> + <string name="submission_dispatcher_qr_privacy_dialog_body">"By tapping \"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\"."</string> <!-- XBUT: submission(dispatcher QR Dialog) - positive button (right) --> <string name="submission_dispatcher_qr_privacy_dialog_button_positive">"Accept"</string> <!-- XBUT: submission(dispatcher QR Dialog) - negative button (left) --> @@ -940,17 +942,17 @@ <!-- XHED: Page title for the positive result additional warning page--> <string name="submission_positive_other_warning_title">"Avertizarea altor persoane"</string> <!-- XHED: Page headline for the positive result additional warning page--> - <string name="submission_positive_other_warning_headline">"Să ne ajutăm împreună!"</string> + <string name="submission_positive_other_warning_headline">"PuteÈ›i fi de ajutor!"</string> <!-- YTXT: Body text for the positive result additional warning page--> - <string name="submission_positive_other_warning_body">"Apoi, puteÈ›i să vă asiguraÈ›i că aplicaÈ›ia Corona-Warn trimite altor persoane ID-urile aleatorii din ultimele 14 zile. Prin aceasta, puteÈ›i avertiza È™i alte persoane È™i puteÈ›i contribui la întreruperea lanÈ›ului de infectare\n\nPentru că sunt transmise doar ID-uri aleatorii impersonale, identitatea dvs. va rămâne anonimă."</string> + <string name="submission_positive_other_warning_body">"Dacă doriÈ›i, acum îi puteÈ›i permite aplicaÈ›iei să transmită ID-urile dvs. aleatorii memorate local din ultimele 14 zile către ceilalÈ›i. ÃŽn acest mod, îi puteÈ›i avertiza pe ceilalÈ›i utilizatori È™i puteÈ›i contribui la întreruperea lanÈ›ului de infectare.\n\nAplicaÈ›ia va transmite doar ID-urile aleatorii È™i informaÈ›iile pe care le-aÈ›i furnizat despre debutul simptomelor. Identitatea dvs. nu va fi dezvăluită."</string> <!-- XHED: Title for the privacy card--> <string name="submission_positive_other_warning_privacy_title">"ConfidenÈ›ialitatea datelor"</string> <!-- YTXT: Body text for the privacy card--> - <string name="submission_positive_other_warning_privacy_body">"Apăsând pe „Acceptâ€, consimÈ›iÈ›i ca aplicaÈ›ia să trimită rezultatul pozitiv al testului dvs. către sistemul de servere al aplicaÈ›iei, împreună cu ID-urile dvs. aleatorii din ultimele 14 zile, pentru ca ceilalÈ›i utilizatori ai aplicaÈ›iei care au activat caracteristica de înregistrare în jurnal a expunerilor să poată fi notificaÈ›i automat că se poate să fi fost expuÈ™i la riscul de infectare. ID-urile aleatorii transmise în acest scop nu conÈ›in informaÈ›ii care să poată permite tragerea unor concluzii privind identitatea dvs. sau persoana dvs. \n\nTransmiterea rezultatului testului prin intermediul aplicaÈ›iei este voluntară. Nu veÈ›i fi penalizat dacă nu transmiteÈ›i rezultatul testului. Din moment ce nu este posibilă urmărirea sau verificarea modului în care utilizaÈ›i aplicaÈ›ia sau dacă o utilizaÈ›i sau nu, doar dvs. veÈ›i È™ti dacă aÈ›i transmis informaÈ›iile că sunteÈ›i infectat.\n\nPuteÈ›i oricând să vă retrageÈ›i consimțământul prin È™tergerea acestei aplicaÈ›ii. Retragerea consimțământului nu va afecta legalitatea procesării efectuate în baza consimțământului acordat înainte de retragerea acestuia. Pentru informaÈ›ii suplimentare, consultaÈ›i meniul din „ConfidenÈ›ialitatea datelorâ€."</string> + <string name="submission_positive_other_warning_privacy_body">"By tapping “Acceptâ€, you consent to the App sending your positive test result to the App’s server system along with your random IDs from the last 14 days, so that other App users who have enabled the risk identification feature can be automatically notified that they may have been exposed to a risk of infection. If you provided optional information about the onset of your symptoms, the random IDs will be transmitted with a risk value derived from your information, indicating your risk of having infected others on the day the random ID is valid. The random IDs transmitted for this purpose do not contain any information that would allow conclusions to be drawn about your identity or your person.\n\nTransmitting your test result via the App is voluntary. You will not be penalized if you do not transmit your test result. Since it is not possible to trace or check whether and how you use the App, nobody but you will know whether you have transmitted the information that you are infected. \n\nYou can withdraw your consent at any time by deleting the App. This withdrawal of your consent will not affect the lawfulness of the processing carried out on the basis of the consent prior to the withdrawal. Further information can be found under “App Informationâ€> “Data Privacyâ€."</string> <!-- XBUT: other warning continue button --> <string name="submission_positive_other_warning_button">"Accept"</string> <!-- XACT: other warning - illustration description, explanation image --> - <string name="submission_positive_other_illustration_description">"Un dispozitiv transmite un diagnostic de test pozitiv criptat către sistem."</string> + <string name="submission_positive_other_illustration_description">"Un smartphone transmite un diagnostic de test pozitiv criptat către sistem."</string> <!-- Submission Country Selector --> <!-- XHED: Page title for the submission country selection page --> @@ -994,8 +996,10 @@ <!-- Submission Symptoms --> <!-- XHED: Page title for symptom screens --> <string name="submission_symptom_title">"Simptome"</string> - <!-- YTXT: headline text for initial symptom screen --> - <string name="submission_symptom_initial_headline">"AÈ›i resimÈ›it unul sau mai multe dintre următoarele simptome în ultimele zile?"</string> + <!-- XTXT: headline text for initial symptom screen --> + <string name="submission_symptom_initial_headline">"AÈ›i resimÈ›it unul sau mai multe dintre următoarele simptome?"</string> + <!-- YTXT: explanation text for initial symptom screen --> + <string name="submission_symptom_initial_explanation">"PuteÈ›i indica momentul când È™i dacă aÈ›i observat simptomele specifice coronavirusului pentru a-i permite aplicaÈ›iei să calculeze mai exact riscul de infectare al altor utilizatori ai aplicaÈ›iei. Dacă nu doriÈ›i să furnizaÈ›i aceste informaÈ›ii, selectaÈ›i „Nu răspundâ€."</string> <!-- YTXT: Bullet points for symptoms --> <string-array name="submission_symptom_symptom_bullets"> <item>"Temperatură crescută sau febră"</item> @@ -1012,7 +1016,7 @@ <!-- XBUT: symptom initial screen no button --> <string name="submission_symptom_negative_button">"Nu"</string> <!-- XBUT: symptom initial screen no information button --> - <string name="submission_symptom_no_information_button">"Nu comentez"</string> + <string name="submission_symptom_no_information_button">"Nu răspund"</string> <!-- XBUT: symptom initial screen continue button --> <string name="submission_symptom_further_button">"ÃŽnainte"</string> @@ -1060,7 +1064,7 @@ <!-- XBUT: symptom calendar screen more than 2 weeks button --> <string name="submission_symptom_more_two_weeks">"Cu peste 2 săptămâni în urmă"</string> <!-- XBUT: symptom calendar screen verify button --> - <string name="submission_symptom_verify">"Nu comentez"</string> + <string name="submission_symptom_verify">"Nu răspund"</string> <!-- Submission Status Card --> <!-- XHED: Page title for the various submission status: fetching --> @@ -1173,6 +1177,10 @@ <string name="errors_generic_button_negative">"Detalii"</string> <!-- XTXT: error dialog - text when no error description is available --> <string name="errors_generic_text_unknown_error_cause">"A apărut o eroare necunoscută."</string> + <!-- XTXT: error dialog - text when a catastrophic error occured from which the app recovered automatically via data reset --> + <string name="errors_generic_text_catastrophic_error_recovery_via_reset">"AplicaÈ›ia dvs. a fost resetată din cauza unei probleme tehnice. Acest lucru nu are efect asupra funcÈ›ionalității aplicaÈ›iei. VeÈ›i continua să primiÈ›i notificări despre expuneri È™i îi veÈ›i putea avertiza pe ceilalÈ›i în continuare, în cazul în care sunteÈ›i testat pozitiv la COVID-19."</string> + <!-- XTXT: error dialog - link for the details button in the catastrophic error recovery dialog --> + <string name="errors_generic_text_catastrophic_error_encryption_failure">"https://www.coronawarn.app/en/faq/#cause9002"</string> <!-- #################################### Just for Development 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 bf91538fad6a37d5248e1de17744e362c3adfa05..dd20a817a98d5662ba77c144bf8d5292752e3072 100644 --- a/Corona-Warn-App/src/main/res/values-tr/strings.xml +++ b/Corona-Warn-App/src/main/res/values-tr/strings.xml @@ -246,7 +246,7 @@ <!-- XHED: App overview subtitle for tracing explanation--> <string name="main_overview_subtitle_tracing">"Maruz Kalma Günlüğü"</string> <!-- YTXT: App overview body text about tracing --> - <string name="main_overview_body_tracing">"Maruz kalma günlüğü, uygulamanın üç temel özelliÄŸinden biridir. Bu özelliÄŸi etkinleÅŸtirdiÄŸinizde, diÄŸer kiÅŸilerin cihazlarıyla karşılaÅŸmalarınız günlüğe kaydedilir. BaÅŸka bir iÅŸlem yapmanız gerekmez."</string> + <string name="main_overview_body_tracing">"Maruz kalma günlüğü, uygulamanın üç temel özelliÄŸinden biridir. Bu özelliÄŸi etkinleÅŸtirdiÄŸinizde, diÄŸer kiÅŸilerin akıllı telefonlarıyla karşılaÅŸmalarınız günlüğe kaydedilir. BaÅŸka bir iÅŸlem yapmanız gerekmez."</string> <!-- XHED: App overview subtitle for risk explanation --> <string name="main_overview_subtitle_risk">"Enfeksiyon Riski"</string> <!-- YTXT: App overview body text about risk levels --> @@ -345,7 +345,7 @@ <!-- YTXT: risk details - low risk explanation text --> <string name="risk_details_information_body_low_risk">"Daha sonra COVID-19 tanısı konan kiÅŸilere maruz kaldığınıza dair bir günlük kaydı oluÅŸturulmadığı veya bu kiÅŸilerle yalnızca kısa süreyle ve uzak mesafeden karşılaÅŸtığınız için enfeksiyon riskiniz düşüktür."</string> <!-- YTXT: risk details - low risk explanation text with encounter with low risk --> - <string name="risk_details_information_body_low_risk_with_encounter">"Enfeksiyon riskiniz, maruz kalma günlüğünün verileri kullanılarak yerel olarak cihazınızda hesaplanır. Hesaplamada COVID-19 tanısı konan kiÅŸilere maruz kalma mesafesi ve süresinin yanında potansiyel enfeksiyon bulaÅŸtırma durumu da göz önünde bulundurulur. Enfeksiyon riskiniz bir baÅŸkası tarafından görüntülenemez ya da bir baÅŸkasına aktarılamaz."</string> + <string name="risk_details_information_body_low_risk_with_encounter">"Enfeksiyon riskiniz, maruz kalma günlüğünün verileri kullanılarak yerel olarak akıllı telefonunuzda hesaplanır. Hesaplamada COVID-19 tanısı konan kiÅŸilere maruz kalma mesafesi ve süresinin yanında potansiyel enfeksiyon bulaÅŸtırma durumu da göz önünde bulundurulur. Enfeksiyon riskiniz bir baÅŸkası tarafından görüntülenemez ya da bir baÅŸkasına aktarılamaz."</string> <!-- YTXT: risk details - increased risk explanation text with variable for day(s) since last contact --> <plurals name="risk_details_information_body_increased_risk"> <item quantity="one">"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."</item> @@ -358,9 +358,9 @@ <!-- YTXT: risk details - risk calculation explanation --> <string name="risk_details_information_body_notice">"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."</string> <!-- YTXT: risk details - risk calculation explanation for low risk --> - <string name="risk_details_information_body_notice_low">"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."</string> + <string name="risk_details_information_body_notice_low">"Bu nedenle enfeksiyon riskiniz düşük olarak derecelendirilmiÅŸtir. Enfeksiyon riskiniz, akıllı telefonunuzda 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."</string> <!-- YTXT: risk details - risk calculation explanation for increased risk --> - <string name="risk_details_information_body_notice_increased">"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> + <string name="risk_details_information_body_notice_increased">"Bu nedenle enfeksiyon riskiniz artmış olarak derecelendirilmiÅŸtir. Enfeksiyon riskiniz, akıllı telefonunuzda 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> <!-- NOTR --> <string name="risk_details_button_update">@string/risk_card_button_update</string> <!-- NOTR --> @@ -372,6 +372,8 @@ <string name="risk_details_explanation_dialog_title">"Maruz kalma günlüğü iÅŸlevi hakkında bilgi"</string> <!-- YTXT: one time risk explanation dialog - pointing to the faq page for more information--> <string name="risk_details_explanation_dialog_faq_body">"Daha fazla bilgi için lütfen SSS sayfamıza bakın."</string> + <!-- XLNK: risk explanations and informations - pointing to the faq page for more information and contains hyperlink--> + <string name="risk_details_explanation_faq_body_with_link"><a href="https://www.coronawarn.app/en/faq/#encounter_but_green">"Daha fazla bilgi için lütfen SSS sayfamıza bakın."</a></string> <!-- #################################### Onboarding @@ -396,9 +398,9 @@ <!-- XHED: onboarding(together) - two/three line headline under an illustration --> <string name="onboarding_subtitle">"Sizin için ve hepimiz için daha fazla koruma. Corona-Warn-App uygulamasını kullanarak enfeksiyon zincirlerini çok daha kısa süre içinde kırabiliriz."</string> <!-- YTXT: onboarding(together) - inform about the app --> - <string name="onboarding_body">"Cihazınızı koronavirüs uyarı sistemine dönüştürün. Risk durumunuza iliÅŸkin genel bir bakış elde edin ve son 14 gün içinde COVID-19 tanısı konan herhangi biri ile yakın temasa geçip geçmediÄŸinizi öğrenin."</string> + <string name="onboarding_body">"Akıllı telefonunuzu koronavirüs uyarı sistemine dönüştürün. Risk durumunuza iliÅŸkin genel bir bakış elde edin ve son 14 gün içinde COVID-19 tanısı konan herhangi biri ile yakın temasa geçip geçmediÄŸinizi öğrenin."</string> <!-- YTXT: onboarding(together) - explain application --> - <string name="onboarding_body_emphasized">"Uygulama kiÅŸilerin cihazları arasında ÅŸifrelenmiÅŸ rastgele kimlikleri paylaÅŸarak karşılaÅŸma günlüğü oluÅŸturur ve bu sırada hiçbir kiÅŸisel veriye eriÅŸim saÄŸlanmaz."</string> + <string name="onboarding_body_emphasized">"Uygulama kiÅŸilerin akıllı telefonları arasında ÅŸifrelenmiÅŸ rastgele kimlikleri paylaÅŸarak karşılaÅŸma günlüğü oluÅŸturur ve bu sırada hiçbir kiÅŸisel veriye eriÅŸim saÄŸlanmaz."</string> <!-- XACT: onboarding(together) - illustraction description, header image --> <string name="onboarding_illustration_description">"Bölgedeki bir grup insan akıllı telefonlarını kullanıyor."</string> <!-- XACT: Onboarding (privacy) page title --> @@ -415,7 +417,7 @@ <!-- XHED: onboarding(tracing) - two/three line headline under an illustration --> <string name="onboarding_tracing_subtitle">"Enfeksiyon riski taşıyıp taşımadığınızı belirlemek için maruz kalma günlüğü özelliÄŸini etkinleÅŸtirmeniz gerekir."</string> <!-- YTXT: onboarding(tracing) - explain tracing --> - <string name="onboarding_tracing_body">"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."</string> + <string name="onboarding_tracing_body">"Maruz kalma günlüğü, akıllı telefonunuzun Bluetooth üzerinden diÄŸer kullanıcıların ÅŸifrelenmiÅŸ rastgele kimliklerini alması ve size ait rastgele kimliÄŸi diÄŸer kullanıcıların akıllı telefonlarına aktarmasıyla çalışır. Bu özellik dilediÄŸiniz zaman devre dışı bırakılabilir."</string> <!-- YTXT: onboarding(tracing) - explain tracing --> <string name="onboarding_tracing_body_emphasized">"Åž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."</string> <!-- YTXT: onboarding(tracing) - easy language explain tracing link--> @@ -425,7 +427,7 @@ <!-- XHED: onboarding(tracing) - headline for consent information --> <string name="onboarding_tracing_headline_consent">"Kabul Beyanı"</string> <!-- YTXT: onboarding(tracing) - body for consent information --> - <string name="onboarding_tracing_body_consent">"Enfekte olan biriyle temas halinde olup olmadığınızı ve sizin de enfeksiyon riski altında olup olmadığınızı öğrenmek için Uygulamanın maruz kalma günlüğü özelliÄŸini etkinleÅŸtirmeniz gerekir. \"EtkinleÅŸtir\" düğmesine dokunarak Uygulamanın maruz kalma günlüğü özelliÄŸini etkinleÅŸtirmeyi ve iliÅŸkili verilerin iÅŸlenmesini kabul edersiniz."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Uygulamanın maruz kalma günlüğü özelliÄŸini kullanmak için akıllı telefonunuzda Google tarafından sunulan \"Maruz Kalma Bildirimleri\" iÅŸlevini etkinleÅŸtirmeniz ve Corona-Warn-App\'e bu iÅŸlevi kullanma izni vermeniz gerekecektir."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Maruz kalma günlüğü etkinleÅŸtirildiÄŸinde akıllı telefonunuz sürekli olarak rastgele kimlikler oluÅŸturur ve bu rastgele kimlikleri maruz kalma günlüğü etkinleÅŸtirilmiÅŸ olan yakınınızdaki diÄŸer Android veya Apple akıllı telefonlara Bluetooth üzerinden aktarır. Bunun karşılığında akıllı telefonunuz diÄŸer akıllı telefonların rastgele kimliklerini alır. Size ait olan ve diÄŸer akıllı telefonlardan alınan rastgele kimlikler, maruz kalma günlüğüne kaydedilir ve 14 gün süreyle burada saklanır."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Uygulama, enfeksiyon riskinizi belirlemek için koronavirüs enfeksiyonu olduÄŸunu Uygulamada belirten tüm kullanıcıların rastgele kimliklerinin listesini (günde birkaç kez veya talep üzerine) yükler. Ardından bu liste maruz kalma günlüğünde tutulan rastgele kimliklerle karşılaÅŸtırılır. Uygulama enfekte olan bir kullanıcı ile temas halinde olabileceÄŸinizi saptadığında bu konuda bilgilendirilirsiniz ve sizin de enfeksiyon riski taşıdığınız belirtilir. Bu durumda Uygulama akıllı telefonunuzun maruz kalma günlüğünde tutulan diÄŸer verilere (tarih, süre ve temas sırasındaki Bluetooth sinyalinin gücü) eriÅŸir."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Bluetooth sinyal gücü, fiziksel mesafenin belirlenmesi için kullanılır (sinyal ne kadar güçlü olursa mesafe o kadar kısa olur). Ardından Uygulama, koronavirüs enfeksiyonu olasılığınızı deÄŸerlendirmek ve sonraki adımlara yönelik öneriler sunmak üzere bu bilgileri analiz eder. Bu analiz akıllı telefonunuzda yalnızca yerel olarak gerçekleÅŸtirilir. Sizin dışınızda hiç kimse (RKI bile) enfekte olan biriyle temas ettiÄŸinizi ve sizin için belirlenen riski bilmez."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Maruz kalma günlüğüne verdiÄŸiniz onayı geri çekmek için Uygulamadaki düğmeyi kullanarak veya Uygulamayı silerek özelliÄŸi devre dışı bırakabilirsiniz. Maruz kalma günlüğü özelliÄŸini yeniden kullanmaya karar verirseniz özelliÄŸi geri açabilir veya Uygulamayı yeniden yükleyebilirsiniz. Maruz kalma günlüğü özelliÄŸini devre dışı bırakırsanız Uygulama artık enfekte olan bir kullanıcı ile temas halinde olup olmadığınızı kontrol etmez. Cihazınızın rastgele kimlik göndermesini ve almasını durdurmak isterseniz de akıllı telefonunuzun ayarlarında COVID-19\'a Maruz Kalma Günlüğü özelliÄŸini devre dışı bırakmanız gerekir. Size ait olan ve diÄŸer akıllı telefonlardan alınan maruz kalma günlüğündeki rastgele kimliklerin Uygulamada silinmeyeceÄŸini unutmayın. Akıllı telefonunuzun ayarlarında yalnızca maruz kalma günlüğünde tutulan verileri kalıcı olarak silebilirsiniz."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Uygulamanın gizlilik bildirimini (maruz kalma günlüğü özelliÄŸi için gerçekleÅŸtirilen veri iÅŸlemeye iliÅŸkin açıklama dahil) menüde \"Veri GizliliÄŸi Bilgileri\" baÅŸlığında bulabilirsiniz."</string> + <string name="onboarding_tracing_body_consent">"Enfekte olan biriyle temas halinde olup olmadığınızı ve sizin de enfeksiyon riski altında olup olmadığınızı öğrenmek için Uygulamanın maruz kalma günlüğü özelliÄŸini etkinleÅŸtirmeniz gerekir. \"EtkinleÅŸtir\" düğmesine dokunarak Uygulamanın maruz kalma günlüğü özelliÄŸini etkinleÅŸtirmeyi ve iliÅŸkili verilerin iÅŸlenmesini kabul edersiniz."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Uygulamanın maruz kalma günlüğü özelliÄŸini kullanmak için akıllı telefonunuzda Google tarafından sunulan \"Maruz Kalma Bildirimleri\" iÅŸlevini etkinleÅŸtirmeniz ve Corona-Warn-App\'e bu iÅŸlevi kullanma izni vermeniz gerekecektir."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Maruz kalma günlüğü etkinleÅŸtirildiÄŸinde akıllı telefonunuz sürekli olarak rastgele kimlikler oluÅŸturur ve bu rastgele kimlikleri maruz kalma günlüğü etkinleÅŸtirilmiÅŸ olan yakınınızdaki diÄŸer Android veya Apple akıllı telefonlara Bluetooth üzerinden aktarır. Bunun karşılığında akıllı telefonunuz diÄŸer akıllı telefonların rastgele kimliklerini alır. Size ait olan ve diÄŸer akıllı telefonlardan alınan rastgele kimlikler, maruz kalma günlüğüne kaydedilir ve 14 gün süreyle burada saklanır."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Uygulama, enfeksiyon riskinizi belirlemek için koronavirüs enfeksiyonu olduÄŸunu Uygulamada belirten tüm kullanıcıların rastgele kimliklerinin listesini (günde birkaç kez veya talep üzerine) yükler. Ardından bu liste maruz kalma günlüğünde tutulan rastgele kimliklerle karşılaÅŸtırılır. Uygulama enfekte olan bir kullanıcı ile temas halinde olabileceÄŸinizi saptadığında bu konuda bilgilendirilirsiniz ve sizin de enfeksiyon riski taşıdığınız belirtilir. Bu durumda Uygulama akıllı telefonunuzun maruz kalma günlüğünde tutulan diÄŸer verilere (tarih, süre ve temas sırasındaki Bluetooth sinyalinin gücü) eriÅŸir."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Bluetooth sinyal gücü, fiziksel mesafenin belirlenmesi için kullanılır (sinyal ne kadar güçlü olursa mesafe o kadar kısa olur). Ardından Uygulama, koronavirüs enfeksiyonu olasılığınızı deÄŸerlendirmek ve sonraki adımlara yönelik öneriler sunmak üzere bu bilgileri analiz eder. Bu analiz akıllı telefonunuzda yalnızca yerel olarak gerçekleÅŸtirilir. Sizin dışınızda hiç kimse (RKI bile) enfekte olan biriyle temas ettiÄŸinizi ve sizin için belirlenen riski bilmez."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Maruz kalma günlüğüne verdiÄŸiniz onayı geri çekmek için Uygulamadaki düğmeyi kullanarak veya Uygulamayı silerek özelliÄŸi devre dışı bırakabilirsiniz. Maruz kalma günlüğü özelliÄŸini yeniden kullanmaya karar verirseniz özelliÄŸi geri açabilir veya Uygulamayı yeniden yükleyebilirsiniz. Maruz kalma günlüğü özelliÄŸini devre dışı bırakırsanız Uygulama artık enfekte olan bir kullanıcı ile temas halinde olup olmadığınızı kontrol etmez. Akıllı telefonunuzun rastgele kimlik göndermesini ve almasını durdurmak isterseniz de akıllı telefonunuzun ayarlarında COVID-19\'a Maruz Kalma Günlüğü özelliÄŸini devre dışı bırakmanız gerekir. Size ait olan ve diÄŸer akıllı telefonlardan alınan maruz kalma günlüğündeki rastgele kimliklerin Uygulamada silinmeyeceÄŸini unutmayın. Akıllı telefonunuzun ayarlarında yalnızca maruz kalma günlüğünde tutulan verileri kalıcı olarak silebilirsiniz."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Uygulamanın gizlilik bildirimini (maruz kalma günlüğü özelliÄŸi için gerçekleÅŸtirilen veri iÅŸlemeye iliÅŸkin açıklama dahil) menüde \"Veri GizliliÄŸi Bilgileri\" baÅŸlığında bulabilirsiniz."</string> <!-- XBUT: onboarding(tracing) - button enable tracing --> <string name="onboarding_tracing_button_next">"Maruz Kalma Günlüğünü EtkinleÅŸtir"</string> <!-- XTXT: onboarding(tracing) - dialog about tracing permission declined --> @@ -459,7 +461,7 @@ <!-- XBUT: onboarding(tracing) - dialog about manual checking button --> <string name="onboarding_manual_required_dialog_button">"Tamam"</string> <!-- XACT: onboarding(tracing) - illustraction description, header image --> - <string name="onboarding_tracing_illustration_description">"Üç kiÅŸi cihazlarında maruz kalma günlüğünü etkinleÅŸtirdi ve birbirleri ile karşılaÅŸmaları günlüğe kaydedilecektir."</string> + <string name="onboarding_tracing_illustration_description">"Üç kiÅŸi akıllı telefonlarında maruz kalma günlüğünü etkinleÅŸtirdi ve birbirleri ile karşılaÅŸmaları günlüğe kaydedilecektir."</string> <!-- XHED: onboarding(tracing) - location explanation for bluetooth headline --> <string name="onboarding_tracing_location_headline">"Konum eriÅŸimine izin ver"</string> <!-- XTXT: onboarding(tracing) - location explanation for bluetooth body text --> @@ -473,7 +475,7 @@ <!-- XHED: onboarding(test) - two/three line headline under an illustration --> <string name="onboarding_test_subtitle">"… lütfen bunu Corona-Warn-App\'te belirtin. Test sonuçlarınızı paylaÅŸmanız gönüllülük esasına dayalıdır ve güvenlidir. Lütfen herkesin saÄŸlığı için bunu yapın."</string> <!-- YTXT: onboarding(test) - explain test --> - <string name="onboarding_test_body">"Bildiriminiz güvenli olarak ÅŸifrelenir ve güvenli bir sunucuda iÅŸlenir. Cihazınızda ÅŸifrelenmiÅŸ rastgele kimlikleri toplanan kiÅŸilere bundan sonra atmaları gereken adımlarla birlikte bir uyarı gönderilir."</string> + <string name="onboarding_test_body">"Bildiriminiz güvenli olarak ÅŸifrelenir ve güvenli bir sunucuda iÅŸlenir. Akıllı telefonunuza ÅŸifrelenmiÅŸ rastgele kimlikleri toplanan kiÅŸilere bundan sonra atmaları gereken adımlarla birlikte bir uyarı gönderilir."</string> <!-- XACT: onboarding(test) - illustraction description, header image --> <string name="onboarding_test_illustration_description">"ÅžifrelenmiÅŸ bir pozitif test tanısı sisteme aktarılır ve diÄŸer kullanıcılar uyarılır."</string> <!-- XACT: Onboarding (datashare) page title --> @@ -521,7 +523,7 @@ <!-- XTXT: settings(tracing) - shows status under header in home, inactive location --> <string name="settings_tracing_body_inactive_location">"Konum hizmetleri devre dışı bırakıldı"</string> <!-- YTXT: settings(tracing) - explains tracings --> - <string name="settings_tracing_body_text">"Enfeksiyon riski taşıyıp taşımadığınızı belirlemek için maruz kalma günlüğü özelliÄŸini etkinleÅŸtirmeniz gerekir. Risk belirleme, cihazınızın Bluetooth üzerinden diÄŸer kullanıcıların rastgele kimliklerini alması ve size ait rastgele kimlikleri diÄŸer kullanıcıların cihazlarına göndermesi ile çalışır. Bu özelliÄŸi dilediÄŸiniz zaman devre dışı bırakabilirsiniz."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"ÅžifrelenmiÅŸ rastgele kimliklerde diÄŸer kiÅŸilere yalnızca tarih, süre ve yakınlık bilgileri (sinyal gücüne göre hesaplanır) gönderilir. Ad, adres ve konum gibi kiÅŸisel veriler hiçbir durumda kaydedilmez. KiÅŸilerin kimlikleri belirlenemez."</string> + <string name="settings_tracing_body_text">"Enfeksiyon riski taşıyıp taşımadığınızı belirlemek için maruz kalma günlüğü özelliÄŸini etkinleÅŸtirmeniz gerekir. Risk belirleme, akıllı telefonunuzun Bluetooth üzerinden diÄŸer kullanıcıların rastgele kimliklerini alması ve size ait rastgele kimlikleri diÄŸer kullanıcıların akıllı telefonlarına göndermesi ile çalışır. Bu özelliÄŸi dilediÄŸiniz zaman devre dışı bırakabilirsiniz."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"ÅžifrelenmiÅŸ rastgele kimliklerde diÄŸer kiÅŸilere yalnızca tarih, süre ve yakınlık bilgileri (sinyal gücüne göre hesaplanır) gönderilir. Ad, adres ve konum gibi kiÅŸisel veriler hiçbir durumda kaydedilmez. KiÅŸilerin kimlikleri belirlenemez."</string> <!-- XTXT: settings(tracing) - status next to switch under title --> <string name="settings_tracing_status_active">"Etkin"</string> <!-- XTXT: settings(tracing) - status next to switch under title --> @@ -562,7 +564,7 @@ <item quantity="many">"Maruz kalma günlüğü %1$s gündür etkin.\nMaruz kalma denetimi yalnızca maruz kalma günlüğünün kalıcı olarak etkinleÅŸtirilmesi durumunda güvenilir olabilir."</item> </plurals> <!-- XACT: settings(tracing) - describes illustration --> - <string name="settings_tracing_illustration_description_active">"Üç kiÅŸi cihazlarında maruz kalma günlüğünü etkinleÅŸtirdi ve birbirleri ile karşılaÅŸmaları günlüğe kaydedilecektir."</string> + <string name="settings_tracing_illustration_description_active">"Üç kiÅŸi akıllı telefonlarında maruz kalma günlüğünü etkinleÅŸtirdi ve birbirleri ile karşılaÅŸmaları günlüğe kaydedilecektir."</string> <!-- XACT: settings(tracing) - describes illustration --> <string name="settings_tracing_illustration_description_inactive">"Bir kiÅŸi akıllı telefonunda maruz kalma günlüğünü devre dışı bıraktı. Bu nedenle iki diÄŸer kiÅŸi ile karşılaÅŸma günlüğe kaydedilmez."</string> <!-- XACT: settings(tracing) - describes illustration --> @@ -656,7 +658,7 @@ <!-- YTXT: Body text for about information page --> <string name="information_about_body_emphasized">"Robert Koch Institute (RKI), Almanya\'nın federal kamu saÄŸlığı kurumudur. RKI, Federal Hükûmet adına Corona-Warn-App uygulamasını yayınlamaktadır. Uygulama, daha önce açıklanan kamu saÄŸlığı önlemlerine iliÅŸkin dijital bir tamamlayıcı niteliÄŸindedir: sosyal mesafe, hijyen uygulamaları ve yüz maskeleri."</string> <!-- YTXT: Body text for about information page --> - <string name="information_about_body">"Uygulamayı kullanan herkes, enfeksiyon zincirlerinin takip edilmesine ve kırılmasına yardımcı olur. Uygulama, diÄŸer kiÅŸilerle karşılaÅŸmaları cihazınızda yerel olarak kaydeder. Daha sonra COVID-19 tanısı konan kiÅŸilerle karşılaÅŸmışsanız size bildirim gönderilir. KimliÄŸiniz ve gizliliÄŸiniz daima koruma altındadır."</string> + <string name="information_about_body">"Uygulamayı kullanan herkes, enfeksiyon zincirlerinin takip edilmesine ve kırılmasına yardımcı olur. Uygulama, diÄŸer kiÅŸilerle karşılaÅŸmaları akıllı telefonunuzda yerel olarak kaydeder. Daha sonra COVID-19 tanısı konan kiÅŸilerle karşılaÅŸmışsanız size bildirim gönderilir. KimliÄŸiniz ve gizliliÄŸiniz daima koruma altındadır."</string> <!-- XACT: describes illustration --> <string name="information_about_illustration_description">"Bölgedeki bir grup insan akıllı telefonlarını kullanıyor."</string> <!-- XHED: Page title for privacy information page, also menu item / button text --> @@ -940,17 +942,17 @@ <!-- XHED: Page title for the positive result additional warning page--> <string name="submission_positive_other_warning_title">"DiÄŸer Kullanıcıları Uyarma"</string> <!-- XHED: Page headline for the positive result additional warning page--> - <string name="submission_positive_other_warning_headline">"Lütfen hepimize yardımcı olun!"</string> + <string name="submission_positive_other_warning_headline">"Yardımcı olabilirsiniz!"</string> <!-- YTXT: Body text for the positive result additional warning page--> - <string name="submission_positive_other_warning_body">"Corona-Warn-App\'in son 14 güne ait rastgele kimliklerinizi diÄŸer kullanıcılarla paylaÅŸmasını saÄŸlayabilirsiniz. Bu sayede diÄŸer kullanıcıları uyarabilir ve enfeksiyon zincirini kırabilirsiniz.\n\nYalnızca kiÅŸisel olmayan rastgele kimlikler aktarıldığından kimliÄŸiniz gizli kalacaktır."</string> + <string name="submission_positive_other_warning_body">"Dilerseniz Uygulama sisteminin son 14 güne ait rastgele kimliklerinizi diÄŸer kullanıcılarla paylaÅŸmasını saÄŸlayabilirsiniz. Bu sayede baÅŸkalarını uyarabilir ve enfeksiyon zincirini kırmaları için onlara yardımcı olabilirsiniz.\n\nUygulama, yalnızca rastgele kimliklerinizi ve belirtilerin baÅŸlangıcı hakkında saÄŸladığınız bilgileri aktarır. KimliÄŸiniz açıklanmaz."</string> <!-- XHED: Title for the privacy card--> <string name="submission_positive_other_warning_privacy_title">"Veri GizliliÄŸi"</string> <!-- YTXT: Body text for the privacy card--> - <string name="submission_positive_other_warning_privacy_body">"\"Kabul Et\" seçeneÄŸine dokunduÄŸunuzda, Uygulamanın pozitif test sonucunuzu son 14 güne ait rastgele kimliklerinizle birlikte uygulamanın sunucu sistemine göndermesine izin vermiÅŸ olursunuz, bu sayede maruz kalma günlüğünü etkinleÅŸtirmiÅŸ olan diÄŸer Uygulama kullanıcıları otomatik ÅŸekilde bilgilendirilebilir. Ä°letilen rastgele kimlikler, kimliÄŸiniz ya da kiÅŸiliÄŸinize iliÅŸkin sonuç çıkartacak hiçbir bilgi içermez. \n\nTest sonucunuzun Uygulama aracılığıyla iletilmesi, isteÄŸe baÄŸlıdır. Test sonucunuzu iletmezseniz size hiçbir dezavantajı olmaz. Uygulamayı kullanıp kullanmadığınızı ve nasıl kullandığınızı anlayamadığımız ve kontrol edemediÄŸimiz için enfeksiyonu bulaÅŸtırıp bulaÅŸtırmadığınızı sizden baÅŸka kimse öğrenemez.\n\nUygulamayı silerek, onayınızı dilediÄŸinizde geri alabilirsiniz. Onayın geri alınmasıyla, geri almaya kadar yapılmış veri iÅŸlemelerin hukuka uygunlukları bu durumdan etkilenmez. \"Veri GizliliÄŸi\" menüsünden diÄŸer bilgilere ulaÅŸabilirsiniz."</string> + <string name="submission_positive_other_warning_privacy_body">"\"Kabul Et\" seçeneÄŸine dokunduÄŸunuzda, Uygulamanın pozitif test sonucunuzu son 14 güne ait rastgele kimliklerinizle birlikte uygulamanın sunucu sistemine göndermesine izin vermiÅŸ olursunuz, bu sayede risk belirleme özelliÄŸi etkinleÅŸtirmiÅŸ olan diÄŸer Uygulama kullanıcıları otomatik ÅŸekilde bilgilendirilebilir. Belirtilerinizin baÅŸlangıcına iliÅŸkin isteÄŸe baÄŸlı bu bilgileri verirseniz rastgele kimlikler, bilgilerinizden elde edilen risk deÄŸeri ile birlikte iletilerek ilgili rastgele kimliÄŸin geçerli olduÄŸu gün itibarıyla baÅŸkalarını enfekte etmiÅŸ olma riskinizi belirtir. Bu amaçla iletilen rastgele kimlikler, kimliÄŸiniz ya da kiÅŸiliÄŸinize iliÅŸkin sonuç çıkartacak hiçbir bilgi içermez.\n\nTest sonucunuzun Uygulama aracılığıyla iletilmesi, isteÄŸe baÄŸlıdır. Test sonucunuzu iletmezseniz size hiçbir dezavantajı olmaz. Uygulamayı kullanıp kullanmadığınızı ve nasıl kullandığınızı anlayamadığımız ve kontrol edemediÄŸimiz için enfeksiyonu bulaÅŸtırıp bulaÅŸtırmadığınızı sizden baÅŸka kimse öğrenemez.\n\nUygulamayı silerek, onayınızı dilediÄŸinizde geri alabilirsiniz. Onayın geri alınmasıyla, geri almaya kadar yapılmış veri iÅŸlemelerin hukuka uygunlukları bu durumdan etkilenmez. Bu konuya iliÅŸkin diÄŸer bilgileri \"Uygulama Bilgileri\" > \"Veri GizliliÄŸi\" bölümünde bulabilirsiniz."</string> <!-- XBUT: other warning continue button --> <string name="submission_positive_other_warning_button">"Kabul Et"</string> <!-- XACT: other warning - illustration description, explanation image --> - <string name="submission_positive_other_illustration_description">"Bir cihaz ÅŸifrelenmiÅŸ pozitif test tanısını sisteme aktarır."</string> + <string name="submission_positive_other_illustration_description">"Bir akıllı telefon ÅŸifrelenmiÅŸ pozitif test tanısını sisteme aktarır."</string> <!-- Submission Country Selector --> <!-- XHED: Page title for the submission country selection page --> @@ -994,8 +996,10 @@ <!-- Submission Symptoms --> <!-- XHED: Page title for symptom screens --> <string name="submission_symptom_title">"Belirtiler"</string> - <!-- YTXT: headline text for initial symptom screen --> - <string name="submission_symptom_initial_headline">"Son birkaç günde aÅŸağıdaki belirtilerden birini veya daha fazlasını yaÅŸadınız mı?"</string> + <!-- XTXT: headline text for initial symptom screen --> + <string name="submission_symptom_initial_headline">"AÅŸağıdaki belirtilerden birini veya daha fazlasını yaÅŸadınız mı?"</string> + <!-- YTXT: explanation text for initial symptom screen --> + <string name="submission_symptom_initial_explanation">"Uygulamanın, diÄŸer kullanıcılar açısından enfeksiyon riskini daha doÄŸru bir biçimde hesaplayabilmesi için herhangi bir korona belirtisi fark edip etmediÄŸinizi ve ne zaman fark ettiÄŸinizi belirtebilirsiniz. Bu bilgileri saÄŸlamak istemiyorsanız \"bilgi yok\" seçeneÄŸini belirlemeniz yeterlidir."</string> <!-- YTXT: Bullet points for symptoms --> <string-array name="submission_symptom_symptom_bullets"> <item>"Artan vücut sıcaklığı veya ateÅŸ"</item> @@ -1012,7 +1016,7 @@ <!-- XBUT: symptom initial screen no button --> <string name="submission_symptom_negative_button">"Hayır"</string> <!-- XBUT: symptom initial screen no information button --> - <string name="submission_symptom_no_information_button">"Yorum yok"</string> + <string name="submission_symptom_no_information_button">"Bilgi yok"</string> <!-- XBUT: symptom initial screen continue button --> <string name="submission_symptom_further_button">"Sonraki"</string> @@ -1060,7 +1064,7 @@ <!-- XBUT: symptom calendar screen more than 2 weeks button --> <string name="submission_symptom_more_two_weeks">"2 haftadan uzun süre önce"</string> <!-- XBUT: symptom calendar screen verify button --> - <string name="submission_symptom_verify">"Yorum yok"</string> + <string name="submission_symptom_verify">"Bilgi yok"</string> <!-- Submission Status Card --> <!-- XHED: Page title for the various submission status: fetching --> @@ -1173,6 +1177,10 @@ <string name="errors_generic_button_negative">"Ayrıntılar"</string> <!-- XTXT: error dialog - text when no error description is available --> <string name="errors_generic_text_unknown_error_cause">"Bilinmeyen bir hata oluÅŸtu."</string> + <!-- XTXT: error dialog - text when a catastrophic error occured from which the app recovered automatically via data reset --> + <string name="errors_generic_text_catastrophic_error_recovery_via_reset">"Uygulamanız teknik bir problem nedeniyle sıfırlandı. Bunun, uygulamanın iÅŸlevi üzerinde hiçbir etkisi yoktur. Maruz kalmalar hakkında bildirim almaya ve COVID-19 testiniz pozitif çıkarsa diÄŸer kullanıcıları uyarmaya devam edebileceksiniz."</string> + <!-- XTXT: error dialog - link for the details button in the catastrophic error recovery dialog --> + <string name="errors_generic_text_catastrophic_error_encryption_failure">"https://www.coronawarn.app/en/faq/#cause9002"</string> <!-- #################################### Just for Development diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index 305ed2efed7037c941b612fca38a05e42937b795..fa951978f45006326f040d9292c0fe018709c07a 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -253,7 +253,7 @@ <!-- XHED: App overview subtitle for tracing explanation--> <string name="main_overview_subtitle_tracing">"Exposure Logging"</string> <!-- YTXT: App overview body text about tracing --> - <string name="main_overview_body_tracing">"Exposure logging is one of the three central features of the app. When you activate it, encounters with people\'s devices are logged. You don\'t have to do anything else."</string> + <string name="main_overview_body_tracing">"Exposure logging is one of three central features of the app. Once you activate it, encounters with people\'s smartphones are logged. You don\'t have to do anything else."</string> <!-- XHED: App overview subtitle for risk explanation --> <string name="main_overview_subtitle_risk">"Risk of Infection"</string> <!-- YTXT: App overview body text about risk levels --> @@ -352,7 +352,7 @@ <!-- YTXT: risk details - low risk explanation text --> <string name="risk_details_information_body_low_risk">"You have a low risk of infection because no exposure to people later diagnosed with COVID-19 was logged, or because your encounters were only for a short time and at a greater distance."</string> <!-- YTXT: risk details - low risk explanation text with encounter with low risk --> - <string name="risk_details_information_body_low_risk_with_encounter">"The risk of infection is calculated locally on your device, using exposure logging data. The calculation also takes into account distance and duration of any exposure to persons diagnosed with COVID-19, as well as their potential infectiousness. Your risk of infection cannot be seen by or passed on to anyone else."</string> + <string name="risk_details_information_body_low_risk_with_encounter">"The risk of infection is calculated locally on your smartphone, using exposure logging data. The calculation also takes into account distance and duration of any exposure to persons diagnosed with COVID-19, as well as their potential infectiousness. Your risk of infection cannot be seen by or passed on to anyone else."</string> <!-- YTXT: risk details - increased risk explanation text with variable for day(s) since last contact --> <plurals name="risk_details_information_body_increased_risk"> <item quantity="one">"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."</item> @@ -365,9 +365,9 @@ <!-- YTXT: risk details - risk calculation explanation --> <string name="risk_details_information_body_notice">"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."</string> <!-- YTXT: risk details - risk calculation explanation for low risk --> - <string name="risk_details_information_body_notice_low">"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."</string> + <string name="risk_details_information_body_notice_low">"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 smartphone. Your risk of infection cannot be seen by, or passed on to, anyone else."</string> <!-- YTXT: risk details - risk calculation explanation for increased risk --> - <string name="risk_details_information_body_notice_increased">"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> + <string name="risk_details_information_body_notice_increased">"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 smartphone. 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> <!-- NOTR --> <string name="risk_details_button_update">@string/risk_card_button_update</string> <!-- NOTR --> @@ -379,6 +379,8 @@ <string name="risk_details_explanation_dialog_title">"Information about exposure logging functionality"</string> <!-- YTXT: one time risk explanation dialog - pointing to the faq page for more information--> <string name="risk_details_explanation_dialog_faq_body">"For further information, please see our FAQ page."</string> + <!-- XLNK: risk explanations and informations - pointing to the faq page for more information and contains hyperlink--> + <string name="risk_details_explanation_faq_body_with_link"><a href="https://www.coronawarn.app/en/faq/#encounter_but_green">"For further information, please see our FAQ page."</a></string> <!-- #################################### Onboarding @@ -403,9 +405,9 @@ <!-- XHED: onboarding(together) - two/three line headline under an illustration --> <string name="onboarding_subtitle">"More protection for you and for us all. By using the Corona-Warn-App we can break infection chains much quicker."</string> <!-- YTXT: onboarding(together) - inform about the app --> - <string name="onboarding_body">"Turn your device into a coronavirus warning system. Get an overview of your risk status and find out whether you\'ve had close contact with anyone diagnosed with COVID-19 in the last 14 days."</string> + <string name="onboarding_body">"Turn your smartphone into a coronavirus warning system. Get an overview of your risk status and find out whether you\'ve had close contact with anyone diagnosed with COVID-19 in the last 14 days."</string> <!-- YTXT: onboarding(together) - explain application --> - <string name="onboarding_body_emphasized">"The app logs encounters between individuals by exchanging encrypted, random IDs between their devices, whereby no personal data whatsoever is accessed."</string> + <string name="onboarding_body_emphasized">"The app logs encounters between individuals by exchanging encrypted, random IDs between their smartphones, whereby no personal data whatsoever is accessed."</string> <!-- XACT: onboarding(together) - illustraction description, header image --> <string name="onboarding_illustration_description">"A group of persons use their smartphones around town."</string> <!-- XACT: Onboarding (privacy) page title --> @@ -422,7 +424,7 @@ <!-- XHED: onboarding(tracing) - two/three line headline under an illustration --> <string name="onboarding_tracing_subtitle">"To identify whether you are at risk of infection, you must activate the exposure logging feature."</string> <!-- YTXT: onboarding(tracing) - explain tracing --> - <string name="onboarding_tracing_body">"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."</string> + <string name="onboarding_tracing_body">"Exposure logging works by your smartphone receiving, via Bluetooth, encrypted random IDs of other users and passing your own random ID to their smartphones. This feature can be deactivated at any time."</string> <!-- YTXT: onboarding(tracing) - explain tracing --> <string name="onboarding_tracing_body_emphasized">"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."</string> <!-- YTXT: onboarding(tracing) - easy language explain tracing link--> @@ -432,7 +434,7 @@ <!-- XHED: onboarding(tracing) - headline for consent information --> <string name="onboarding_tracing_headline_consent">"Declaration of Consent"</string> <!-- YTXT: onboarding(tracing) - body for consent information --> - <string name="onboarding_tracing_body_consent">"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 the “Enable†button, you agree to the enabling of the App’s exposure logging feature and the associated data processing."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"In order to use the App’s exposure logging feature, you will have to enable the \"Exposure Notifications\" functionality provided by Google on your smartphone and grant the Corona-Warn-App permission to use this."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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)."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"The Bluetooth signal strength is used to derive the physical distance (the stronger the signal, the smaller the distance). The App then analyzes 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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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â€."</string> + <string name="onboarding_tracing_body_consent">"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 the \"Enable\" button, you agree to the enabling of the App’s exposure logging feature and the associated data processing."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"In order to use the App’s exposure logging feature, you will have to enable the \"Exposure Notifications\" functionality provided by Google on your smartphone and grant the Corona-Warn-App permission to use this."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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)."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"The Bluetooth signal strength is used to derive the physical distance (the stronger the signal, the smaller the distance). The App then analyzes 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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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 smartphone 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."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"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\"."</string> <!-- XBUT: onboarding(tracing) - button enable tracing --> <string name="onboarding_tracing_button_next">"Activate Exposure Logging"</string> <!-- XTXT: onboarding(tracing) - dialog about tracing permission declined --> @@ -466,7 +468,7 @@ <!-- XBUT: onboarding(tracing) - dialog about manual checking button --> <string name="onboarding_manual_required_dialog_button">"OK"</string> <!-- XACT: onboarding(tracing) - illustraction description, header image --> - <string name="onboarding_tracing_illustration_description">"Three people have activated exposure logging on their devices, which will log their encounters with each other."</string> + <string name="onboarding_tracing_illustration_description">"Three persons have activated exposure logging on their smartphones, which will log their encounters with each other."</string> <!-- XHED: onboarding(tracing) - location explanation for bluetooth headline --> <string name="onboarding_tracing_location_headline">"Allow location access"</string> <!-- XTXT: onboarding(tracing) - location explanation for bluetooth body text --> @@ -480,7 +482,7 @@ <!-- XHED: onboarding(test) - two/three line headline under an illustration --> <string name="onboarding_test_subtitle">"… please report this in the Corona-Warn-App. Sharing your test results is voluntary and secure. Please do this for the sake of everyone\'s health."</string> <!-- YTXT: onboarding(test) - explain test --> - <string name="onboarding_test_body">"Your notification is encrypted securely and processed on a secure server. People whose encrypted random IDs your device has collected will now receive a warning along with information about what they should now do."</string> + <string name="onboarding_test_body">"Your notification is encrypted securely and processed on a secure server. Persons whose encrypted random IDs your smartphone has collected will now receive a warning along with information about what they should now do."</string> <!-- XACT: onboarding(test) - illustraction description, header image --> <string name="onboarding_test_illustration_description">"An encrypted positive test diagnosis is transmitted to the system, which will now warn other users."</string> <!-- XACT: Onboarding (datashare) page title --> @@ -528,7 +530,7 @@ <!-- XTXT: settings(tracing) - shows status under header in home, inactive location --> <string name="settings_tracing_body_inactive_location">"Location services deactivated"</string> <!-- YTXT: settings(tracing) - explains tracings --> - <string name="settings_tracing_body_text">"You have to activate the exposure logging feature to identify whether you are at risk of infection. Risk identification works by your device receiving, via Bluetooth, encrypted random IDs of other users and passing your random ID to their devices. You can disable this feature any time."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Encrypted random IDs only pass information about date, duration, and proximity to other persons (calculated by signal strength). Personal data such as name, address, and location is never recorded. Individuals cannot be identified."</string> + <string name="settings_tracing_body_text">"You have to activate the exposure logging feature to identify whether you are at risk of infection. Risk identification works by your smartphone receiving, via Bluetooth, encrypted random IDs of other users and passing your random ID to their smartphones. You can disable this feature any time."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Encrypted random IDs only pass information about date, duration, and proximity to other persons (calculated by signal strength). Personal data such as name, address, and location is never recorded. Individuals cannot be identified."</string> <!-- XTXT: settings(tracing) - status next to switch under title --> <string name="settings_tracing_status_active">"Active"</string> <!-- XTXT: settings(tracing) - status next to switch under title --> @@ -569,7 +571,7 @@ <item quantity="many">"Exposure logging has been active for %1$s days.\nAn exposure check can only be reliable if exposure logging is permanently activated."</item> </plurals> <!-- XACT: settings(tracing) - describes illustration --> - <string name="settings_tracing_illustration_description_active">"Three people have activated exposure logging on their devices, which will log their encounters with each other."</string> + <string name="settings_tracing_illustration_description_active">"Three persons have activated exposure logging on their smartphones, which will log their encounters with each other."</string> <!-- XACT: settings(tracing) - describes illustration --> <string name="settings_tracing_illustration_description_inactive">"A person has deactivated exposure logging on their smartphone, so an encounter with two other persons is not logged."</string> <!-- XACT: settings(tracing) - describes illustration --> @@ -663,7 +665,7 @@ <!-- YTXT: Body text for about information page --> <string name="information_about_body_emphasized">"Robert Koch Institute (RKI) is Germany’s federal public health body. The RKI publishes the Corona-Warn-App on behalf of the Federal Government. The app is intended as a digital complement to public health measures already introduced: social distancing, hygiene, and face masks."</string> <!-- YTXT: Body text for about information page --> - <string name="information_about_body">"Whoever uses the app helps to trace and break chains of infection. The app saves encounters with other people locally on your device. You are notified if you have encountered people who were later diagnosed with COVID-19. Your identity and privacy are always protected."</string> + <string name="information_about_body">"Whoever uses the app helps to trace and break chains of infection. The app saves encounters with other persons locally on your smartphone. You are notified if you have encountered persons who were later diagnosed with COVID-19. Your identity and privacy are always protected."</string> <!-- XACT: describes illustration --> <string name="information_about_illustration_description">"A group of persons use their smartphones around town."</string> <!-- XHED: Page title for privacy information page, also menu item / button text --> @@ -934,7 +936,7 @@ <!-- XHED: Dialog headline for dispatcher QR prviacy dialog --> <string name="submission_dispatcher_qr_privacy_dialog_headline">"Declaration of Consent"</string> <!-- YTXT: Dialog Body text for dispatcher QR privacy dialog --> - <string name="submission_dispatcher_qr_privacy_dialog_body">"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â€."</string> + <string name="submission_dispatcher_qr_privacy_dialog_body">"By tapping \"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\"."</string> <!-- XBUT: submission(dispatcher QR Dialog) - positive button (right) --> <string name="submission_dispatcher_qr_privacy_dialog_button_positive">"Accept"</string> <!-- XBUT: submission(dispatcher QR Dialog) - negative button (left) --> @@ -954,17 +956,17 @@ <!-- XHED: Page title for the positive result additional warning page--> <string name="submission_positive_other_warning_title">"Warning Others"</string> <!-- XHED: Page headline for the positive result additional warning page--> - <string name="submission_positive_other_warning_headline">"Please help all of us!"</string> + <string name="submission_positive_other_warning_headline">"You can help!"</string> <!-- YTXT: Body text for the positive result additional warning page--> - <string name="submission_positive_other_warning_body">"Next, you can make sure that the Corona-Warn-App shares your random IDs of the last 14 days with others. By doing this, you can warn other people and help to break the infection chain.\n\nSince only impersonal random IDs are transmitted, your identity will remain anonymous."</string> + <string name="submission_positive_other_warning_body">"If you wish, you can now allow the App system to transmit your locally stored random IDs from the last 14 days to others. In this way, you can warn fellow users and help to break the chain of infection.\n\nThe App will only transmit random IDs and information you provided about the onset of symptoms. Your identity will not be disclosed."</string> <!-- XHED: Title for the privacy card--> <string name="submission_positive_other_warning_privacy_title">"Data Privacy"</string> <!-- YTXT: Body text for the privacy card--> - <string name="submission_positive_other_warning_privacy_body">"By tapping “Acceptâ€, you consent to the App sending your positive test result to the App’s server system along with your random IDs from the last 14 days, so that other App users who have enabled the exposure logging feature can be automatically notified that they may have been exposed to a risk of infection. The random IDs transmitted for this purpose do not contain any information that would allow conclusions to be drawn about your identity or your person. \n\nTransmitting your test result via the App is voluntary. You will not be penalized if you do not transmit your test result. Since it is not possible to trace or check whether and how you use the App, nobody but you will know whether you have transmitted the information that you are infected.\n\nYou can withdraw your consent at any time by deleting the App. This withdrawal of your consent will not affect the lawfulness of the processing carried out based on the consent prior to the withdrawal. Further information can be found in the menu under “Data Privacyâ€."</string> + <string name="submission_positive_other_warning_privacy_body">"By tapping “Acceptâ€, you consent to the App sending your positive test result to the App’s server system along with your random IDs from the last 14 days, so that other App users who have enabled the risk identification feature can be automatically notified that they may have been exposed to a risk of infection. If you provided optional information about the onset of your symptoms, the random IDs will be transmitted with a risk value derived from your information, indicating your risk of having infected others on the day the random ID is valid. The random IDs transmitted for this purpose do not contain any information that would allow conclusions to be drawn about your identity or your person.\n\nTransmitting your test result via the App is voluntary. You will not be penalized if you do not transmit your test result. Since it is not possible to trace or check whether and how you use the App, nobody but you will know whether you have transmitted the information that you are infected. \n\nYou can withdraw your consent at any time by deleting the App. This withdrawal of your consent will not affect the lawfulness of the processing carried out on the basis of the consent prior to the withdrawal. Further information can be found under “App Informationâ€> “Data Privacyâ€."</string> <!-- XBUT: other warning continue button --> <string name="submission_positive_other_warning_button">"Accept"</string> <!-- XACT: other warning - illustration description, explanation image --> - <string name="submission_positive_other_illustration_description">"A device transmits an encrypted positive test diagnosis to the system."</string> + <string name="submission_positive_other_illustration_description">"A smartphone transmits an encrypted positive test diagnosis to the system."</string> <!-- XHED: Title for the interop country list--> <string name="submission_interoperability_list_title" /> @@ -1011,7 +1013,9 @@ <!-- XHED: Page title for symptom screens --> <string name="submission_symptom_title">"Symptoms"</string> <!-- YTXT: headline text for initial symptom screen --> - <string name="submission_symptom_initial_headline">"Have you experienced one or more of the following symptoms in the past few days?"</string> + <string name="submission_symptom_initial_headline">"Have you experienced one or more of the following symptoms?"</string> + <!-- YTXT: explanation text for initial symptom screen --> + <string name="submission_symptom_initial_explanation">"You can indicate whether and when you noticed any corona symptoms, to allow the App to calculate more accurately the risk of infection to other app users. If you do not want to provide that information, just select “no answerâ€."</string> <!-- YTXT: Bullet points for symptoms --> <string-array name="submission_symptom_symptom_bullets"> <item>"Increased temperature or fever"</item> @@ -1028,7 +1032,7 @@ <!-- XBUT: symptom initial screen no button --> <string name="submission_symptom_negative_button">"No"</string> <!-- XBUT: symptom initial screen no information button --> - <string name="submission_symptom_no_information_button">"No comment"</string> + <string name="submission_symptom_no_information_button">"No answer"</string> <!-- XBUT: symptom initial screen continue button --> <string name="submission_symptom_further_button">"Next"</string> @@ -1076,7 +1080,7 @@ <!-- XBUT: symptom calendar screen more than 2 weeks button --> <string name="submission_symptom_more_two_weeks">"More than 2 weeks ago"</string> <!-- XBUT: symptom calendar screen verify button --> - <string name="submission_symptom_verify">"No comment"</string> + <string name="submission_symptom_verify">"No answer"</string> <!-- Submission Status Card --> <!-- XHED: Page title for the various submission status: fetching --> @@ -1189,6 +1193,10 @@ <string name="errors_generic_button_negative">"Details"</string> <!-- XTXT: error dialog - text when no error description is available --> <string name="errors_generic_text_unknown_error_cause">"An unknown error occurred."</string> + <!-- XTXT: error dialog - text when a catastrophic error occured from which the app recovered automatically via data reset --> + <string name="errors_generic_text_catastrophic_error_recovery_via_reset">"Your app was reset due to a technical problem. This has no effect on the app\'s functionality. You will continue to be notified about exposures and still be able to warn others, should you be tested positive for COVID-19."</string> + <!-- XTXT: error dialog - link for the details button in the catastrophic error recovery dialog --> + <string name="errors_generic_text_catastrophic_error_encryption_failure">"https://www.coronawarn.app/en/faq/#cause9002"</string> <!-- #################################### Just for Development diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/RetryMechanismTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/RetryMechanismTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..c0697e18d92b3fc8b9ca33f0b5be90f73db5b857 --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/RetryMechanismTest.kt @@ -0,0 +1,92 @@ +package de.rki.coronawarnapp.util + +import de.rki.coronawarnapp.util.RetryMechanism.createDelayCalculator +import io.kotest.assertions.throwables.shouldThrow +import io.kotest.matchers.longs.beInRange +import io.kotest.matchers.should +import io.kotest.matchers.shouldBe +import io.kotest.matchers.shouldNotBe +import io.kotest.matchers.types.instanceOf +import io.mockk.MockKAnnotations +import io.mockk.clearAllMocks +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.verify +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import testhelpers.BaseTest +import java.util.UUID + +class RetryMechanismTest : BaseTest() { + @MockK lateinit var mockFunction: () -> String + + @BeforeEach + fun setup() { + MockKAnnotations.init(this) + every { mockFunction.invoke() } answers { + throw RuntimeException(UUID.randomUUID().toString()) + } + } + + @AfterEach + fun teardown() { + clearAllMocks() + } + + @Test + fun `simple retry`() { + val attempts = mutableListOf<RetryMechanism.Attempt>() + shouldThrow<RuntimeException> { + RetryMechanism.retryWithBackOff( + delayCalculator = createDelayCalculator(), + delayOperation = { Thread.sleep(it) }, + retryCondition = { + attempts.add(it) + it.count < 3 + }, + action = mockFunction + ) + } + verify(exactly = 3) { mockFunction() } + + attempts[0].apply { + count shouldBe 1 + totalDelay shouldBe 0L + lastDelay shouldBe 0L + exception should instanceOf(RuntimeException::class) + } + attempts[1].apply { + count shouldBe 2 + totalDelay shouldBe lastDelay + lastDelay shouldBe totalDelay + exception should instanceOf(RuntimeException::class) + } + attempts[2].apply { + count shouldBe 3 + totalDelay shouldBe attempts[1].totalDelay + lastDelay + lastDelay shouldBe totalDelay - attempts[1].totalDelay + exception should instanceOf(RuntimeException::class) + } + attempts[0].exception shouldNotBe attempts[1].exception + attempts[1].exception shouldNotBe attempts[2].exception + } + + @Test + fun `test clamping`() { + val calculator = createDelayCalculator() + RetryMechanism.Attempt(count = -5, lastDelay = 20).let { + calculator(it) shouldBe 25 // -X .. 20 -> clamp to min (25) + } + RetryMechanism.Attempt(count = 100, lastDelay = 3 * 1000L).let { + calculator(it) shouldBe 3 * 1000L // lastDelay .. HugeNewDelay -> clamp to max (3k) + } + + RetryMechanism.Attempt(count = 10, lastDelay = 16 * 1000L).let { + calculator(it) shouldBe beInRange(1536L..3000L) + } + RetryMechanism.Attempt(count = 100, lastDelay = 1).let { + calculator(it) shouldBe 3 * 1000L + } + } +} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/errors/ExceptionExtensionsTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/errors/ExceptionExtensionsTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..9af659ed6cfb1a590d248c5d58a30fb102db7946 --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/errors/ExceptionExtensionsTest.kt @@ -0,0 +1,46 @@ +package de.rki.coronawarnapp.util.errors + +import io.kotest.matchers.shouldBe +import org.junit.Test +import testhelpers.BaseTest +import java.io.IOException + +class ExceptionExtensionsTest : BaseTest() { + + @Test + fun `exception without child cause`() { + val testException: Throwable = IndexOutOfBoundsException() + testException.causes().toList().size shouldBe 1 + testException.causes().toList() shouldBe listOf(IndexOutOfBoundsException()) + } + + @Test + fun `exception with multiple nested causes`() { + val inner: Throwable = + IllegalArgumentException(IOException(NullPointerException())) + val outer: Throwable = IllegalStateException(inner) + + outer.causes().toList().size shouldBe 4 + outer.causes().toList() shouldBe listOf( + IllegalStateException(IllegalArgumentException(IOException(NullPointerException()))), + IllegalArgumentException(IOException(NullPointerException())), + IOException(NullPointerException()), + NullPointerException() + ) + } + + @Test + fun `find specific exception in causes`() { + val inner: Throwable = + IllegalArgumentException(IOException(NullPointerException())) + val outer: Throwable = IllegalStateException(inner) + + outer.causes().toList().size shouldBe 4 + outer.causes().toList() shouldBe listOf( + IllegalStateException(IllegalArgumentException(IOException(NullPointerException()))), + IllegalArgumentException(IOException(NullPointerException())), + IOException(NullPointerException()), + NullPointerException() + ) + } +} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/security/EncryptedPreferencesFactoryTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/security/EncryptedPreferencesFactoryTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..a2c7fd375dada6f1af5880ae0b114d0373a4ea77 --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/security/EncryptedPreferencesFactoryTest.kt @@ -0,0 +1,35 @@ +package de.rki.coronawarnapp.util.security + +import android.content.Context +import io.kotest.assertions.throwables.shouldNotThrowAny +import io.mockk.Called +import io.mockk.MockKAnnotations +import io.mockk.clearAllMocks +import io.mockk.impl.annotations.MockK +import io.mockk.verify +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import testhelpers.BaseTest + +class EncryptedPreferencesFactoryTest : BaseTest() { + @MockK lateinit var context: Context + + @BeforeEach + fun setup() { + MockKAnnotations.init(this) + } + + @AfterEach + fun teardown() { + clearAllMocks() + } + + @Test + fun `sideeffect free init`() { + shouldNotThrowAny { + EncryptedPreferencesFactory(context) + } + verify { context.getSharedPreferences(any(), any()) wasNot Called } + } +} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/security/EncryptionResetToolTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/security/EncryptionResetToolTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..f229c4edb3737c719cdcd7360666014610f64c81 --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/security/EncryptionResetToolTest.kt @@ -0,0 +1,272 @@ +package de.rki.coronawarnapp.util.security + +import android.content.Context +import de.rki.coronawarnapp.exception.CwaSecurityException +import io.kotest.matchers.shouldBe +import io.kotest.matchers.shouldNotBe +import io.mockk.MockKAnnotations +import io.mockk.clearAllMocks +import io.mockk.every +import io.mockk.impl.annotations.MockK +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import testhelpers.BaseIOTest +import testhelpers.preferences.MockSharedPreferences +import java.io.File +import java.security.GeneralSecurityException +import java.security.KeyStoreException + +class EncryptionResetToolTest : BaseIOTest() { + + @MockK + lateinit var context: Context + private lateinit var mockPreferences: MockSharedPreferences + + private val testDir = File(IO_TEST_BASEDIR, this::class.simpleName!!) + private val privateFilesDir = File(testDir, "files") + private val encryptedPrefsFile = File(testDir, "shared_prefs/shared_preferences_cwa.xml") + private val encryptedDatabaseFile = File(testDir, "databases/coronawarnapp-db") + + @BeforeEach + fun setup() { + MockKAnnotations.init(this) + + every { context.filesDir } returns privateFilesDir + every { context.getDatabasePath("coronawarnapp-db") } returns encryptedDatabaseFile + + mockPreferences = MockSharedPreferences() + every { + context.getSharedPreferences( + "encryption_error_reset_tool", + Context.MODE_PRIVATE + ) + } returns mockPreferences + } + + @AfterEach + fun teardown() { + clearAllMocks() + + testDir.deleteRecursively() + } + + private fun createInstance() = EncryptionErrorResetTool( + context = context + ) + + private fun createMockFiles() { + encryptedPrefsFile.apply { + parentFile!!.mkdirs() + createNewFile() + exists() shouldBe true + } + encryptedDatabaseFile.apply { + parentFile!!.mkdirs() + createNewFile() + exists() shouldBe true + } + } + + @Test + fun `initialiation is sideeffect free`() { + createMockFiles() + + createInstance() + + encryptedPrefsFile.exists() shouldBe true + encryptedDatabaseFile.exists() shouldBe true + mockPreferences.dataMapPeek shouldBe emptyMap() + } + + @Test + fun `reset dialog show flag is writable and persisted`() { + val instance = createInstance() + mockPreferences.dataMapPeek["ea1851.reset.shownotice"] shouldBe null + instance.isResetNoticeToBeShown shouldBe false + + instance.isResetNoticeToBeShown = true + mockPreferences.dataMapPeek["ea1851.reset.shownotice"] shouldBe true + instance.isResetNoticeToBeShown shouldBe true + + createInstance().isResetNoticeToBeShown shouldBe true + + instance.isResetNoticeToBeShown = false + mockPreferences.dataMapPeek["ea1851.reset.shownotice"] shouldBe false + instance.isResetNoticeToBeShown shouldBe false + + } + + @Test + fun `reset is not warranted by default`() { + createMockFiles() + + createInstance().tryResetIfNecessary(Exception()) + + encryptedPrefsFile.exists() shouldBe true + encryptedDatabaseFile.exists() shouldBe true + } + + /** + Based on https://github.com/corona-warn-app/cwa-app-android/issues/642#issuecomment-650199424 + 06-23 21:52:51.681 10311 17331 17331 E AndroidRuntime: java.lang.SecurityException: Could not decrypt value. decryption failed + 06-23 21:52:51.681 10311 17331 17331 E AndroidRuntime: at androidx.security.crypto.EncryptedSharedPreferences.getDecryptedObject(EncryptedSharedPreferences.java:33) + 06-23 21:52:51.681 10311 17331 17331 E AndroidRuntime: at androidx.security.crypto.EncryptedSharedPreferences.getBoolean(EncryptedSharedPreferences.java:1) + 06-23 21:52:51.681 10311 17331 17331 E AndroidRuntime: at de.rki.coronawarnapp.update.UpdateChecker.checkForUpdate(UpdateChecker.kt:23) + 06-23 21:52:51.681 10311 17331 17331 E AndroidRuntime: at de.rki.coronawarnapp.update.UpdateChecker$checkForUpdate$1.invokeSuspend(Unknown Source:11) + 06-23 21:52:51.681 10311 17331 17331 E AndroidRuntime: at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:2) + 06-23 21:52:51.681 10311 17331 17331 E AndroidRuntime: at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:18) + 06-23 21:52:51.681 10311 17331 17331 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:809) + 06-23 21:52:51.681 10311 17331 17331 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102) + 06-23 21:52:51.681 10311 17331 17331 E AndroidRuntime: at android.os.Looper.loop(Looper.java:166) + 06-23 21:52:51.681 10311 17331 17331 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:7377) + 06-23 21:52:51.681 10311 17331 17331 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) + 06-23 21:52:51.681 10311 17331 17331 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:469) + 06-23 21:52:51.681 10311 17331 17331 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:963) + 06-23 21:52:51.681 10311 17331 17331 E AndroidRuntime: Caused by: java.security.GeneralSecurityException: decryption failed + 06-23 21:52:51.681 10311 17331 17331 E AndroidRuntime: at com.google.crypto.tink.aead.AeadWrapper$WrappedAead.decrypt(AeadWrapper.java:15) + 06-23 21:52:51.681 10311 17331 17331 E AndroidRuntime: at androidx.security.crypto.EncryptedSharedPreferences.getDecryptedObject(EncryptedSharedPreferences.java:5) + 06-23 21:52:51.681 10311 17331 17331 E AndroidRuntime: ... 12 more + */ + @Test + fun `reset is warranted if the first exception after upgrade was a GeneralSecurityException`() { + // We only perform the reset for users who encounter it the first time after the upgrade + createMockFiles() + + createInstance().tryResetIfNecessary( + GeneralSecurityException("decryption failed") + ) shouldBe true + + createInstance().tryResetIfNecessary( + GeneralSecurityException("decryption failed") + ) shouldBe false + + encryptedPrefsFile.exists() shouldBe false + encryptedDatabaseFile.exists() shouldBe false + + mockPreferences.dataMapPeek.apply { + this["ea1851.reset.performedAt"] shouldNotBe null + this["ea1851.reset.windowconsumed"] shouldBe true + this["ea1851.reset.shownotice"] shouldBe true + } + } + + @Test + fun `reset is also warranted if the exception has our desired exception as cause`() { + // We only perform the reset for users who encounter it the first time after the upgrade + createMockFiles() + + createInstance().tryResetIfNecessary( + CwaSecurityException(RuntimeException(GeneralSecurityException("decryption failed"))) + ) shouldBe true + + encryptedPrefsFile.exists() shouldBe false + encryptedDatabaseFile.exists() shouldBe false + + mockPreferences.dataMapPeek.apply { + this["ea1851.reset.performedAt"] shouldNotBe null + this["ea1851.reset.windowconsumed"] shouldBe true + this["ea1851.reset.shownotice"] shouldBe true + } + } + + @Test + fun `we want only a specific type of GeneralSecurityException`() { + createMockFiles() + + createInstance().tryResetIfNecessary( + GeneralSecurityException("2020 failed") + ) shouldBe false + + encryptedPrefsFile.exists() shouldBe true + encryptedDatabaseFile.exists() shouldBe true + + mockPreferences.dataMapPeek.apply { + this["ea1851.reset.performedAt"] shouldBe null + this["ea1851.reset.windowconsumed"] shouldBe true + this["ea1851.reset.shownotice"] shouldBe null + } + } + + @Test + fun `reset is not warranted for GeneralSecurityException that happened later`() { + createMockFiles() + + createInstance().tryResetIfNecessary(KeyStoreException()) shouldBe false + + createInstance().tryResetIfNecessary( + GeneralSecurityException("decryption failed") + ) shouldBe false + + encryptedPrefsFile.exists() shouldBe true + encryptedDatabaseFile.exists() shouldBe true + + + mockPreferences.dataMapPeek.apply { + this["ea1851.reset.performedAt"] shouldBe null + this["ea1851.reset.windowconsumed"] shouldBe true + this["ea1851.reset.shownotice"] shouldBe null + } + } + + @Test + fun `reset is not warranted if the error fits, but there is no existing preference file`() { + encryptedPrefsFile.exists() shouldBe false + + createInstance().tryResetIfNecessary( + GeneralSecurityException("decryption failed") + ) shouldBe false + + encryptedPrefsFile.exists() shouldBe false + encryptedDatabaseFile.exists() shouldBe false + + mockPreferences.dataMapPeek.apply { + this["ea1851.reset.performedAt"] shouldBe null + this["ea1851.reset.windowconsumed"] shouldBe true + this["ea1851.reset.shownotice"] shouldBe null + } + } + + @Test + fun `the reset is considered failed if the preferences can not be deleted`() { + createMockFiles() + encryptedPrefsFile.delete() + encryptedPrefsFile.mkdir() // Can't delete directories with children via `delete()` + File(encryptedPrefsFile, "prevent deletion").createNewFile() + + createInstance().tryResetIfNecessary( + GeneralSecurityException("decryption failed") + ) shouldBe false + + encryptedPrefsFile.exists() shouldBe true + encryptedDatabaseFile.exists() shouldBe true + + mockPreferences.dataMapPeek.apply { + this["ea1851.reset.performedAt"] shouldBe null + this["ea1851.reset.windowconsumed"] shouldBe true + this["ea1851.reset.shownotice"] shouldBe null + } + } + + @Test + fun `the reset is considered failed if the database exists and can not be deleted`() { + createMockFiles() + encryptedDatabaseFile.delete() + encryptedDatabaseFile.mkdir() // Can't delete directories with children via `delete()` + File(encryptedDatabaseFile, "prevent deletion").createNewFile() + + createInstance().tryResetIfNecessary( + GeneralSecurityException("decryption failed") + ) shouldBe false + + encryptedPrefsFile.exists() shouldBe false + encryptedDatabaseFile.exists() shouldBe true + + mockPreferences.dataMapPeek.apply { + this["ea1851.reset.performedAt"] shouldBe null + this["ea1851.reset.windowconsumed"] shouldBe true + this["ea1851.reset.shownotice"] shouldBe null + } + } + +} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/security/SecurityHelperTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/security/SecurityHelperTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..1a3dbb9683df637d5595186b3718aad31c152a5b --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/security/SecurityHelperTest.kt @@ -0,0 +1,98 @@ +package de.rki.coronawarnapp.util.security + +import android.content.SharedPreferences +import de.rki.coronawarnapp.util.di.ApplicationComponent +import io.kotest.assertions.throwables.shouldThrow +import io.kotest.matchers.shouldBe +import io.mockk.MockKAnnotations +import io.mockk.clearAllMocks +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.mockk +import io.mockk.verify +import io.mockk.verifySequence +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import testhelpers.BaseTest + +class SecurityHelperTest : BaseTest() { + @MockK + lateinit var appComponent: ApplicationComponent + + @MockK + lateinit var errorResetTool: EncryptionErrorResetTool + + @MockK + lateinit var preferenceFactory: EncryptedPreferencesFactory + + @BeforeEach + fun setup() { + MockKAnnotations.init(this) + + every { appComponent.errorResetTool } returns errorResetTool + every { appComponent.encryptedPreferencesFactory } returns preferenceFactory + } + + @AfterEach + fun teardown() { + clearAllMocks() + } + + @Test + fun `error free case is sideeffect free`() { + val sharedPreferences: SharedPreferences = mockk() + every { preferenceFactory.create("shared_preferences_cwa") } returns sharedPreferences + + SecurityHelper.encryptedPreferencesProvider(appComponent) shouldBe sharedPreferences + verify(exactly = 0) { errorResetTool.tryResetIfNecessary(any()) } + } + + @Test + fun `positive reset tool results cause a retry`() { + val ourPreferences: SharedPreferences = mockk() + var ourException: Exception? = null + every { preferenceFactory.create("shared_preferences_cwa") } answers { + if (ourException == null) { + ourException = Exception("99 bugs") + throw ourException!! + } else { + ourPreferences + } + } + every { errorResetTool.tryResetIfNecessary(any()) } returns true + + SecurityHelper.encryptedPreferencesProvider(appComponent) shouldBe ourPreferences + + verifySequence { + preferenceFactory.create(any()) + errorResetTool.tryResetIfNecessary(ourException!!) + preferenceFactory.create(any()) + } + } + + @Test + fun `negative reset tool results rethrow the exception`() { + val ourPreferences: SharedPreferences = mockk() + var ourException: Exception? = null + every { preferenceFactory.create("shared_preferences_cwa") } answers { + if (ourException == null) { + ourException = Exception("99 bugs") + throw ourException!! + } else { + ourPreferences + } + } + every { errorResetTool.tryResetIfNecessary(any()) } returns false + + shouldThrow<Exception> { + SecurityHelper.encryptedPreferencesProvider(appComponent) shouldBe ourPreferences + }.cause shouldBe ourException + + verifySequence { + preferenceFactory.create(any()) + errorResetTool.tryResetIfNecessary(ourException!!) + } + } + +} diff --git a/Corona-Warn-App/src/test/java/testhelpers/preferences/MockSharedPreferences.kt b/Corona-Warn-App/src/test/java/testhelpers/preferences/MockSharedPreferences.kt index 84574d307a97e859f9bc8cfb91b94a7f5e1be548..a6294b00f54bcdbc96ab6bd18195389fc1a79e51 100644 --- a/Corona-Warn-App/src/test/java/testhelpers/preferences/MockSharedPreferences.kt +++ b/Corona-Warn-App/src/test/java/testhelpers/preferences/MockSharedPreferences.kt @@ -4,6 +4,8 @@ import android.content.SharedPreferences class MockSharedPreferences : SharedPreferences { private val dataMap = mutableMapOf<String, Any>() + val dataMapPeek: Map<String, Any> + get() = dataMap.toMap() override fun getAll(): MutableMap<String, *> = dataMap diff --git a/Corona-Warn-App/src/test/java/testhelpers/preferences/MockSharedPreferencesTest.kt b/Corona-Warn-App/src/test/java/testhelpers/preferences/MockSharedPreferencesTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..d6909726ebf3b20978271c0c03762cce6d135ff7 --- /dev/null +++ b/Corona-Warn-App/src/test/java/testhelpers/preferences/MockSharedPreferencesTest.kt @@ -0,0 +1,21 @@ +package testhelpers.preferences + +import androidx.core.content.edit +import io.kotest.matchers.shouldBe +import org.junit.jupiter.api.Test +import testhelpers.BaseTest + +class MockSharedPreferencesTest : BaseTest() { + + private fun createInstance() = MockSharedPreferences() + + @Test + fun `test boolean insertion`() { + val prefs = createInstance() + prefs.dataMapPeek shouldBe emptyMap() + prefs.getBoolean("key", true) shouldBe true + prefs.edit { putBoolean("key", false) } + prefs.getBoolean("key", true) shouldBe false + prefs.dataMapPeek["key"] shouldBe false + } +}