diff --git a/.env b/.env index c4b64bf6..d0285ad7 100644 --- a/.env +++ b/.env @@ -1,7 +1,11 @@ -APP_ID=app.covidshield +APP_ID_IOS=app.covidshield +APP_ID_ANDROID=app.covidshield APP_VERSION_CODE=1 APP_VERSION_NAME=1.0 -TEST_MODE=true + SUBMIT_URL=https://submission.covidshield.app RETRIEVE_URL=https://retrieval.covidshield.app HMAC_KEY=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +TEST_MODE=true +MOCK_SERVER=false diff --git a/.env.production b/.env.production index 774049c4..4f806aa2 100644 --- a/.env.production +++ b/.env.production @@ -1,7 +1,11 @@ -APP_ID=app.covidshield +APP_ID_IOS=app.covidshield +APP_ID_ANDROID=app.covidshield APP_VERSION_CODE=1 APP_VERSION_NAME=1.0 -TEST_MODE=false -SUBMIT_URL=https://submit.covidshield.app -RETRIEVE_URL=https://retrieve.covidshield.app + +SUBMIT_URL=https://submission.covidshield.app +RETRIEVE_URL=https://retrieval.covidshield.app HMAC_KEY=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +TEST_MODE=false +MOCK_SERVER=false diff --git a/android/app/build.gradle b/android/app/build.gradle index 8e1b09f6..79643afb 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -137,7 +137,7 @@ android { } defaultConfig { - applicationId project.env.get("APP_ID") + applicationId project.env.get("APP_ID_ANDROID") minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode project.env.get("APP_VERSION_CODE") as Integer diff --git a/android/app/src/main/java/app/covidshield/extensions/ConfigurationExtensions.kt b/android/app/src/main/java/app/covidshield/extensions/ConfigurationExtensions.kt new file mode 100644 index 00000000..811a2f43 --- /dev/null +++ b/android/app/src/main/java/app/covidshield/extensions/ConfigurationExtensions.kt @@ -0,0 +1,18 @@ +package app.covidshield.extensions + +import app.covidshield.models.Configuration +import com.google.android.gms.nearby.exposurenotification.ExposureConfiguration + +fun Configuration.toExposureConfiguration(): ExposureConfiguration { + return ExposureConfiguration.ExposureConfigurationBuilder() + .setMinimumRiskScore(minimumRiskScore) + .setAttenuationScores(*attenuationLevelValues.toIntArray()) + .setAttenuationWeight(attenuationWeight) + .setDaysSinceLastExposureScores(*daysSinceLastExposureLevelValues.toIntArray()) + .setDaysSinceLastExposureWeight(daysSinceLastExposureWeight) + .setDurationScores(*durationLevelValues.toIntArray()) + .setDurationWeight(durationWeight) + .setTransmissionRiskScores(*transmissionRiskLevelValues.toIntArray()) + .setTransmissionRiskWeight(transmissionRiskWeight) + .build() +} \ No newline at end of file diff --git a/android/app/src/main/java/app/covidshield/extensions/ExposureInformationExtensions.kt b/android/app/src/main/java/app/covidshield/extensions/ExposureInformationExtensions.kt new file mode 100644 index 00000000..133e0726 --- /dev/null +++ b/android/app/src/main/java/app/covidshield/extensions/ExposureInformationExtensions.kt @@ -0,0 +1,14 @@ +package app.covidshield.extensions + +import app.covidshield.models.Information +import com.google.android.gms.nearby.exposurenotification.ExposureInformation + +fun ExposureInformation.toInformation(): Information { + return Information( + attenuationValue = attenuationValue, + date = dateMillisSinceEpoch, + duration = durationMinutes, + totalRiskScore = totalRiskScore, + transmissionRiskLevel = transmissionRiskLevel + ) +} \ No newline at end of file diff --git a/android/app/src/main/java/app/covidshield/extensions/ExposureSummaryExtensions.kt b/android/app/src/main/java/app/covidshield/extensions/ExposureSummaryExtensions.kt new file mode 100644 index 00000000..eb052c16 --- /dev/null +++ b/android/app/src/main/java/app/covidshield/extensions/ExposureSummaryExtensions.kt @@ -0,0 +1,12 @@ +package app.covidshield.extensions + +import app.covidshield.models.Summary +import com.google.android.gms.nearby.exposurenotification.ExposureSummary + +fun ExposureSummary.toSummary(): Summary { + return Summary( + daysSinceLastExposure = daysSinceLastExposure, + matchedKeyCount = matchedKeyCount, + maximumRiskScore = maximumRiskScore + ) +} \ No newline at end of file diff --git a/android/app/src/main/java/app/covidshield/extensions/GsonExtensions.kt b/android/app/src/main/java/app/covidshield/extensions/GsonExtensions.kt index e406eb96..af2c650e 100644 --- a/android/app/src/main/java/app/covidshield/extensions/GsonExtensions.kt +++ b/android/app/src/main/java/app/covidshield/extensions/GsonExtensions.kt @@ -2,21 +2,14 @@ package app.covidshield.extensions import com.google.gson.GsonBuilder -private val GSON = GsonBuilder() - .create() +private val GSON by lazy { + GsonBuilder().create() +} -fun String?.parse(classOfT: Class): T? { - return try { - GSON.fromJson(this, classOfT) - } catch (e: Exception) { - null - } +fun String.parse(classOfT: Class): T { + return GSON.fromJson(this, classOfT) } -fun Any?.toJson(): String? { - return try { - GSON.toJson(this) - } catch (e: Exception) { - null - } +fun Any.toJson(): String { + return GSON.toJson(this) } \ No newline at end of file diff --git a/android/app/src/main/java/app/covidshield/extensions/PromiseExtensions.kt b/android/app/src/main/java/app/covidshield/extensions/PromiseExtensions.kt new file mode 100644 index 00000000..9d6ed896 --- /dev/null +++ b/android/app/src/main/java/app/covidshield/extensions/PromiseExtensions.kt @@ -0,0 +1,11 @@ +package app.covidshield.extensions + +import com.facebook.react.bridge.Promise + +fun Promise.rejectOnException(block: () -> Unit) { + return try { + block.invoke() + } catch (e: Exception) { + reject(e) + } +} \ No newline at end of file diff --git a/android/app/src/main/java/app/covidshield/extensions/ReactNativeExtensions.kt b/android/app/src/main/java/app/covidshield/extensions/ReactNativeExtensions.kt index c0230408..291bd807 100644 --- a/android/app/src/main/java/app/covidshield/extensions/ReactNativeExtensions.kt +++ b/android/app/src/main/java/app/covidshield/extensions/ReactNativeExtensions.kt @@ -1,14 +1,132 @@ package app.covidshield.extensions -import com.facebook.react.bridge.Arguments +import com.facebook.react.bridge.ReadableArray +import com.facebook.react.bridge.ReadableMap +import com.facebook.react.bridge.ReadableType import com.facebook.react.bridge.WritableArray import com.facebook.react.bridge.WritableMap +import com.facebook.react.bridge.WritableNativeArray +import com.facebook.react.bridge.WritableNativeMap +import org.json.JSONArray +import org.json.JSONException +import org.json.JSONObject fun List.toWritableArray(): WritableArray { - return Arguments.fromList(this.toJson().parse(List::class.java)) + return convertJsonToArray(this.toJson().parse(JSONArray::class.java)) } fun Any.toWritableMap(): WritableMap { - // TODO: convert to map - return Arguments.createMap() + return convertJsonToMap(JSONObject(toJson())) +} + +fun ReadableMap.parse(classOfT: Class): T { + return convertMapToJson(this)!!.toJson().parse(classOfT) +} + +fun ReadableArray.parse(classOfT: Class): List { + return toArrayList().map { it.toJson().parse(classOfT) } +} + +@Throws(JSONException::class) +private fun convertJsonToMap(jsonObject: JSONObject): WritableMap { + val map: WritableMap = WritableNativeMap() + val iterator = jsonObject.keys() + while (iterator.hasNext()) { + val key = iterator.next() + when (val value = jsonObject[key]) { + is JSONObject -> { + map.putMap(key, convertJsonToMap(value)) + } + is JSONArray -> { + map.putArray(key, convertJsonToArray(value)) + } + is Boolean -> { + map.putBoolean(key, value) + } + is Int -> { + map.putInt(key, value) + } + is Double -> { + map.putDouble(key, value) + } + is String -> { + map.putString(key, value) + } + else -> { + map.putString(key, value.toString()) + } + } + } + return map +} + +@Throws(JSONException::class) +private fun convertJsonToArray(jsonArray: JSONArray): WritableArray { + val array: WritableArray = WritableNativeArray() + for (i in 0 until jsonArray.length()) { + when (val value = jsonArray[i]) { + is JSONObject -> { + array.pushMap(convertJsonToMap(value)) + } + is JSONArray -> { + array.pushArray(convertJsonToArray(value)) + } + is Boolean -> { + array.pushBoolean(value) + } + is Int -> { + array.pushInt(value) + } + is Double -> { + array.pushDouble(value) + } + is String -> { + array.pushString(value) + } + else -> { + array.pushString(value.toString()) + } + } + } + return array +} + +@Throws(JSONException::class) +private fun convertMapToJson(readableMap: ReadableMap?): JSONObject? { + if (readableMap == null) { + return null + } + val jsonObject = JSONObject() + val iterator = readableMap.keySetIterator() + while (iterator.hasNextKey()) { + val key = iterator.nextKey() + when (readableMap.getType(key)) { + ReadableType.Null -> jsonObject.put(key, JSONObject.NULL) + ReadableType.Boolean -> jsonObject.put(key, readableMap.getBoolean(key)) + ReadableType.Number -> jsonObject.put(key, readableMap.getDouble(key)) + ReadableType.String -> jsonObject.put(key, readableMap.getString(key)) + ReadableType.Map -> jsonObject.put(key, convertMapToJson(readableMap.getMap(key))) + ReadableType.Array -> jsonObject.put(key, convertArrayToJson(readableMap.getArray(key))) + } + } + return jsonObject +} + +@Throws(JSONException::class) +private fun convertArrayToJson(readableArray: ReadableArray?): JSONArray? { + if (readableArray == null) { + return null + } + val array = JSONArray() + for (i in 0 until readableArray.size()) { + when (readableArray.getType(i)) { + ReadableType.Null -> Unit + ReadableType.Boolean -> array.put(readableArray.getBoolean(i)) + ReadableType.Number -> array.put(readableArray.getDouble(i)) + ReadableType.String -> array.put(readableArray.getString(i)) + ReadableType.Map -> array.put(convertMapToJson(readableArray.getMap(i))) + ReadableType.Array -> array.put(convertArrayToJson(readableArray.getArray(i))) + } + } + return array } \ No newline at end of file diff --git a/android/app/src/main/java/app/covidshield/extensions/TaskExtensions.kt b/android/app/src/main/java/app/covidshield/extensions/TaskExtensions.kt new file mode 100644 index 00000000..ce343580 --- /dev/null +++ b/android/app/src/main/java/app/covidshield/extensions/TaskExtensions.kt @@ -0,0 +1,26 @@ +package app.covidshield.extensions + +import com.facebook.react.bridge.Promise +import com.google.android.gms.tasks.Task + +fun Task.bindPromise(promise: Promise, successBlock: Promise.(T) -> Unit) { + this.addOnFailureListener { promise.reject(it) } + .addOnSuccessListener { + try { + successBlock.invoke(promise, it) + } catch (exception: Exception) { + promise.reject(exception) + } + } +} + +fun Task.bindPromise(promise: Promise, failureValue: R, successBlock: Promise.(T) -> Unit) { + this.addOnFailureListener { promise.resolve(failureValue) } + .addOnSuccessListener { + try { + successBlock.invoke(promise, it) + } catch (exception: Exception) { + promise.reject(exception) + } + } +} \ No newline at end of file diff --git a/android/app/src/main/java/app/covidshield/extensions/TemporaryExposureKeyExtensions.kt b/android/app/src/main/java/app/covidshield/extensions/TemporaryExposureKeyExtensions.kt new file mode 100644 index 00000000..67d3d3e0 --- /dev/null +++ b/android/app/src/main/java/app/covidshield/extensions/TemporaryExposureKeyExtensions.kt @@ -0,0 +1,14 @@ +package app.covidshield.extensions + +import app.covidshield.models.ExposureKey +import com.google.android.gms.common.util.Hex +import com.google.android.gms.nearby.exposurenotification.TemporaryExposureKey + +fun TemporaryExposureKey.toExposureKey(): ExposureKey { + return ExposureKey( + transmissionRiskLevel = transmissionRiskLevel, + keyData = Hex.bytesToStringLowercase(keyData), + rollingStartNumber = rollingStartIntervalNumber, + rollingStartIntervalNumber = rollingStartIntervalNumber + ) +} \ No newline at end of file diff --git a/android/app/src/main/java/app/covidshield/models/Configuration.kt b/android/app/src/main/java/app/covidshield/models/Configuration.kt new file mode 100644 index 00000000..621bcea0 --- /dev/null +++ b/android/app/src/main/java/app/covidshield/models/Configuration.kt @@ -0,0 +1,15 @@ +package app.covidshield.models + +import com.google.gson.annotations.SerializedName + +data class Configuration( + @SerializedName("minimumRiskScore") val minimumRiskScore: Int, + @SerializedName("attenuationLevelValues") val attenuationLevelValues: List, + @SerializedName("attenuationWeight") val attenuationWeight: Int, + @SerializedName("daysSinceLastExposureLevelValues") val daysSinceLastExposureLevelValues: List, + @SerializedName("daysSinceLastExposureWeight") val daysSinceLastExposureWeight: Int, + @SerializedName("durationLevelValues") val durationLevelValues: List, + @SerializedName("durationWeight") val durationWeight: Int, + @SerializedName("transmissionRiskLevelValues") val transmissionRiskLevelValues: List, + @SerializedName("transmissionRiskWeight") val transmissionRiskWeight: Int +) diff --git a/android/app/src/main/java/app/covidshield/models/ExposureKey.kt b/android/app/src/main/java/app/covidshield/models/ExposureKey.kt new file mode 100644 index 00000000..5c275d37 --- /dev/null +++ b/android/app/src/main/java/app/covidshield/models/ExposureKey.kt @@ -0,0 +1,10 @@ +package app.covidshield.models + +import com.google.gson.annotations.SerializedName + +data class ExposureKey( + @SerializedName("transmissionRiskLevel") val transmissionRiskLevel: Int, + @SerializedName("keyData") val keyData: String, + @SerializedName("rollingStartNumber") val rollingStartNumber: Int, + @SerializedName("rollingStartIntervalNumber") val rollingStartIntervalNumber: Int +) \ No newline at end of file diff --git a/android/app/src/main/java/app/covidshield/models/Information.kt b/android/app/src/main/java/app/covidshield/models/Information.kt new file mode 100644 index 00000000..ba2e58d0 --- /dev/null +++ b/android/app/src/main/java/app/covidshield/models/Information.kt @@ -0,0 +1,11 @@ +package app.covidshield.models + +import com.google.gson.annotations.SerializedName + +data class Information( + @SerializedName("attenuationValue") val attenuationValue: Int, + @SerializedName("date") val date: Long, + @SerializedName("duration") val duration: Int, + @SerializedName("totalRiskScore") val totalRiskScore: Int, + @SerializedName("transmissionRiskLevel") val transmissionRiskLevel: Int +) diff --git a/android/app/src/main/java/app/covidshield/models/Summary.kt b/android/app/src/main/java/app/covidshield/models/Summary.kt new file mode 100644 index 00000000..1bcf65c7 --- /dev/null +++ b/android/app/src/main/java/app/covidshield/models/Summary.kt @@ -0,0 +1,9 @@ +package app.covidshield.models + +import com.google.gson.annotations.SerializedName + +data class Summary( + @SerializedName("daysSinceLastExposure") val daysSinceLastExposure: Int, + @SerializedName("matchedKeyCount") val matchedKeyCount: Int, + @SerializedName("maximumRiskScore") val maximumRiskScore: Int +) diff --git a/android/app/src/main/java/app/covidshield/module/CovidShieldModule.kt b/android/app/src/main/java/app/covidshield/module/CovidShieldModule.kt index 67ade0c6..9a9e2887 100644 --- a/android/app/src/main/java/app/covidshield/module/CovidShieldModule.kt +++ b/android/app/src/main/java/app/covidshield/module/CovidShieldModule.kt @@ -1,7 +1,8 @@ package app.covidshield.module import android.content.Context -import app.covidshield.extensions.toWritableArray +import android.util.Base64 +import app.covidshield.extensions.rejectOnException import com.facebook.react.bridge.Promise import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.ReactContextBaseJavaModule @@ -11,13 +12,10 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import okhttp3.OkHttpClient import okhttp3.Request -import okio.BufferedSource -import java.math.BigInteger import java.security.SecureRandom -import java.util.* +import java.util.UUID import kotlin.coroutines.CoroutineContext - class CovidShieldModule(context: ReactApplicationContext) : ReactContextBaseJavaModule(context), CoroutineScope { private val okHttpClient by lazy { OkHttpClient() } @@ -28,36 +26,34 @@ class CovidShieldModule(context: ReactApplicationContext) : ReactContextBaseJava @ReactMethod fun getRandomBytes(size: Int, promise: Promise) { - val bytes = SecureRandom().generateSeed(size) - val base64Encoded = Base64.getEncoder().encodeToString(bytes) - promise.resolve(base64Encoded) + promise.rejectOnException { + val bytes = SecureRandom().generateSeed(size) + val base64Encoded = Base64.encodeToString(bytes, Base64.DEFAULT) + promise.resolve(base64Encoded) + } } @ReactMethod fun downloadDiagnosisKeysFile(url: String, promise: Promise) { launch(Dispatchers.IO) { - try { + promise.rejectOnException { val request = Request.Builder().url(url).build() val response = okHttpClient.newCall(request).execute().takeIf { it.code() == 200 } ?: throw Error("Network error") val bytes = response.body()?.bytes() ?: throw Error("Network error") - val fileName = writeFile(bytes) promise.resolve(fileName) - } catch (exception: Exception) { - promise.reject(exception) } } } private fun writeFile(file: ByteArray): String { // TODO: consider using cache or cleaning up old files - - val filename = UUID.randomUUID().toString() - reactApplicationContext.openFileOutput(filename, Context.MODE_PRIVATE).use { - it.write(file) - } - return filename + val filename = UUID.randomUUID().toString() + reactApplicationContext.openFileOutput(filename, Context.MODE_PRIVATE).use { + it.write(file) + } + return filename } } diff --git a/android/app/src/main/java/app/covidshield/module/ExposureNotificationModule.kt b/android/app/src/main/java/app/covidshield/module/ExposureNotificationModule.kt index 2bcac9bd..21c6f833 100644 --- a/android/app/src/main/java/app/covidshield/module/ExposureNotificationModule.kt +++ b/android/app/src/main/java/app/covidshield/module/ExposureNotificationModule.kt @@ -1,7 +1,15 @@ package app.covidshield.module +import app.covidshield.extensions.bindPromise +import app.covidshield.extensions.parse +import app.covidshield.extensions.rejectOnException +import app.covidshield.extensions.toExposureConfiguration +import app.covidshield.extensions.toExposureKey +import app.covidshield.extensions.toInformation +import app.covidshield.extensions.toSummary import app.covidshield.extensions.toWritableArray import app.covidshield.extensions.toWritableMap +import app.covidshield.models.Configuration import com.facebook.react.bridge.Promise import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.ReactContextBaseJavaModule @@ -9,55 +17,87 @@ import com.facebook.react.bridge.ReactMethod import com.facebook.react.bridge.ReadableArray import com.facebook.react.bridge.ReadableMap import com.google.android.gms.nearby.Nearby +import java.io.File +import java.util.UUID + +private const val SUMMARY_HIDDEN_KEY = "_summaryIdx" class ExposureNotificationModule(context: ReactApplicationContext) : ReactContextBaseJavaModule(context) { - private val exposureNotificationClient = Nearby.getExposureNotificationClient(context.applicationContext) + private val exposureNotificationClient by lazy { + Nearby.getExposureNotificationClient(context.applicationContext) + } override fun getName(): String = "ExposureNotification" @ReactMethod fun start(promise: Promise) { - promise.resolve(null) + exposureNotificationClient.start().bindPromise(promise) { + resolve(Unit) + } } @ReactMethod fun stop(promise: Promise) { - exposureNotificationClient.stop() - .addOnCompleteListener { - promise.resolve(null) - } + exposureNotificationClient.stop().bindPromise(promise) { + resolve(Unit) + } } @ReactMethod fun resetAllData(promise: Promise) { + // This method does not exist in the android nearby SDK. promise.resolve(null) } @ReactMethod fun getStatus(promise: Promise) { - exposureNotificationClient.isEnabled - .addOnSuccessListener { - val status = if (it) Status.ACTIVE else Status.DISABLED - promise.resolve(status.value) - } - .addOnFailureListener { - promise.resolve(Status.DISABLED.value) - } + exposureNotificationClient.isEnabled.bindPromise(promise, Status.DISABLED.value) { isEnabled -> + val status = if (isEnabled) Status.ACTIVE else Status.DISABLED + resolve(status.value) + } } @ReactMethod fun detectExposure(configuration: ReadableMap, diagnosisKeysURLs: ReadableArray, promise: Promise) { - promise.resolve(emptyMap().toWritableMap()) + promise.rejectOnException { + val exposureConfiguration = configuration.parse(Configuration::class.java).toExposureConfiguration() + val files = diagnosisKeysURLs.parse(String::class.java).map { File(it) } + val token = UUID.randomUUID().toString() + exposureNotificationClient + .provideDiagnosisKeys(files, exposureConfiguration, token) + .continueWithTask { exposureNotificationClient.getExposureSummary(token) } + .bindPromise(promise) { exposureSummary -> + val summary = exposureSummary.toSummary().toWritableMap().apply { + putString(SUMMARY_HIDDEN_KEY, token) + } + resolve(summary) + } + } } @ReactMethod - fun getExposureInformation(keys: ReadableArray, promise: Promise) { - promise.resolve(emptyList().toWritableArray()) + fun getTemporaryExposureKeyHistory(promise: Promise) { + exposureNotificationClient.temporaryExposureKeyHistory.bindPromise(promise) { keys -> + val exposureKeys = keys.map { it.toExposureKey() }.toWritableArray() + resolve(exposureKeys) + } + } + + @ReactMethod + fun getExposureInformation(summary: ReadableMap, promise: Promise) { + promise.rejectOnException { + val token = summary.getString(SUMMARY_HIDDEN_KEY) + ?: throw IllegalArgumentException("Invalid summary token") + exposureNotificationClient.getExposureInformation(token).bindPromise(promise) { exposureInformationList -> + val informationList = exposureInformationList.map { it.toInformation() }.toWritableArray() + resolve(informationList) + } + } } } private enum class Status(val value: String) { ACTIVE("active"), DISABLED("disabled") -} \ No newline at end of file +} diff --git a/android/app/src/main/java/app/covidshield/module/PushNotificationModule.kt b/android/app/src/main/java/app/covidshield/module/PushNotificationModule.kt index 9e7ac22b..ec3265d8 100644 --- a/android/app/src/main/java/app/covidshield/module/PushNotificationModule.kt +++ b/android/app/src/main/java/app/covidshield/module/PushNotificationModule.kt @@ -11,6 +11,7 @@ import androidx.core.content.ContextCompat.getSystemService import app.covidshield.MainActivity import app.covidshield.R import app.covidshield.extensions.parse +import app.covidshield.extensions.rejectOnException import app.covidshield.extensions.toJson import com.facebook.react.bridge.Promise import com.facebook.react.bridge.ReactApplicationContext @@ -18,7 +19,7 @@ import com.facebook.react.bridge.ReactContextBaseJavaModule import com.facebook.react.bridge.ReactMethod import com.facebook.react.bridge.ReadableMap import com.google.gson.annotations.SerializedName -import java.util.* +import java.util.UUID private const val CHANNEL_ID = "CovidShield" private const val CHANNEL_NAME = "CovidShield" @@ -48,14 +49,17 @@ class PushNotificationModule(context: ReactApplicationContext) : ReactContextBas @ReactMethod fun requestPermissions(config: ReadableMap, promise: Promise) { - promise.resolve(null) + // Noop for Android + promise.resolve(Unit) } @ReactMethod fun presentLocalNotification(data: ReadableMap, promise: Promise) { - val config = data.toHashMap().toJson().parse(PushNotificationConfig::class.java)!! - showNotification(config) - promise.resolve(null) + promise.rejectOnException { + val config = data.toHashMap().toJson().parse(PushNotificationConfig::class.java) + showNotification(config) + promise.resolve(Unit) + } } private fun showNotification(config: PushNotificationConfig) { diff --git a/android/build.gradle b/android/build.gradle index c3d37681..c7439cad 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -14,7 +14,7 @@ buildscript { jcenter() } dependencies { - classpath("com.android.tools.build:gradle:3.5.2") + classpath('com.android.tools.build:gradle:3.6.3') classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/ios/CovidShield.xcodeproj/project.pbxproj b/ios/CovidShield.xcodeproj/project.pbxproj index 6695a9ae..b4b1a73b 100644 --- a/ios/CovidShield.xcodeproj/project.pbxproj +++ b/ios/CovidShield.xcodeproj/project.pbxproj @@ -262,8 +262,8 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "CovidShield" */; buildPhases = ( - 748240532477265C009F68EA /* Install env config */, 2CF09B024003DB90CDBA2FC5 /* [CP] Check Pods Manifest.lock */, + 748240532477265C009F68EA /* Install env config */, FD10A7F022414F080027D42C /* Start Packager */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, @@ -710,7 +710,7 @@ "-ObjC", "-lc++", ); - PRODUCT_BUNDLE_IDENTIFIER = "$(APP_ID)"; + PRODUCT_BUNDLE_IDENTIFIER = "$(APP_ID_IOS)"; PRODUCT_NAME = CovidShield; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -735,7 +735,7 @@ "-ObjC", "-lc++", ); - PRODUCT_BUNDLE_IDENTIFIER = "$(APP_ID)"; + PRODUCT_BUNDLE_IDENTIFIER = "$(APP_ID_IOS)"; PRODUCT_NAME = CovidShield; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; diff --git a/ios/CovidShield/CovidShield.entitlements b/ios/CovidShield/CovidShield.entitlements index 903def2a..6631ffa6 100644 --- a/ios/CovidShield/CovidShield.entitlements +++ b/ios/CovidShield/CovidShield.entitlements @@ -2,7 +2,5 @@ - aps-environment - development diff --git a/src/assets/privacypolicy-fr.js b/src/assets/privacypolicy-fr.js index 59919af6..32738b57 100644 --- a/src/assets/privacypolicy-fr.js +++ b/src/assets/privacypolicy-fr.js @@ -1,37 +1,37 @@ -const privacy = `# Privacy Policy +const privacy = `# Politique de confidentialité -COVID Shield has been designed with user privacy as the top priority. We must strike a balance between protecting public health and preserving personal privacy, and COVID Shield takes a privacy-first approach. The COVID Shield app is designed to make it as difficult as possible for COVID Shield or others to link the information you choose to provide to you or your device, and to use this information only to enable exposure notification in the midst of this unprecedented pandemic. +COVID Shield a été conçue avec comme priorité absolue la protection de la vie privée des utilisateurs. Nous devons trouver un équilibre entre la protection de la santé publique et la protection de la vie privée, et COVID Shield adopte une approche qui privilégie cette dernière. L’application COVID Shield est conçue pour qu’il soit le plus difficile possible pour COVID Shield ou d’autres entités d’associer les informations que vous choisissez de fournir à vous ou à votre appareil : elle utilise ces renseignements uniquement pour permettre la notification d’exposition au virus dans le cadre de cette pandémie sans précédent. -## What Information Do We Use? -In keeping with Google and Apple's [approach](https://www.apple.com/covid19/contacttracing), COVID Shield is designed to collect and use as little personal information as possible in order to enable exposure notification. COVID Shield does not collect or use any personally-identifying information except for: -- Random IDs (also known as Rolling Proximity Identifiers) - * These rotating identifiers are shared via Bluetooth between users who have installed the app on nearby devices. This process is managed by your device, not COVID Shield. - * These identifiers are generated by and stored on your device, not by COVID Shield, and are used only to allow COVID Shield and your device to check for exposure when you or someone else uploads a Temporary Exposure Key. -- Temporary Exposure Keys (also known as Diagnosis Keys) - * If you receive a positive test result, you will be given a Temporary Exposure Key for you to upload and share with all users of the app, only if you decide to do so. You completely control the decision whether to upload the Temporary Exposure Key or not. - * COVID Shield stores your Temporary Exposure Key for at most thirty days. - * Other users can then use COVID Shield to determine if any of the Random IDs their device has come into contact with are associated with a Temporary Exposure Key (and thus, whether they may have come into contact with an infected individual). -- App Usage Logs - * As with almost any app or internet service, COVID Shield automatically generates logs when you use the service. These logs include some information about your device. We use this information to troubleshoot issues with COVID Shield. - * These logs DO NOT include Random IDs or Temporary Exposure Keys, and cannot be used to tie either a Rolling Proximity Identifier or Temporary Exposure Key back to you or your device. - * These logs are automatically deleted 7 days after they are generated. -COVID Shield does not collect location data from your device, and does not collect or share information tying you or your device to either the Random IDs or Temporary Exposure Keys you generate. +## Quels renseignements utilisons-nous? +En accord avec l’[approche](https://www.apple.com/covid19/contacttracing) de Google et d’Apple, COVID Shield est conçue pour collecter et utiliser le moins de renseignements personnels possible afin de permettre la notification d’exposition au virus. COVID Shield ne recueille ni n’utilise aucune information permettant d’identifier une personne, à l’exception de ce qui suit : +- Identifiants aléatoires (également appelés « identificateurs de proximité en continu ») + * Ces identifiants rotatifs sont partagés par Bluetooth entre les utilisateurs qui ont installé l’application sur leurs appareils et qui se trouvent à proximité. Ce processus est géré par votre appareil, et non par COVID Shield. + * Ces identifiants sont générés et stockés sur votre appareil, et non par COVID Shield. Ils sont utilisés uniquement pour permettre à COVID Shield et à votre appareil de vérifier l’exposition au virus lorsque vous ou quelqu’un d’autre téléversez une clé d’exposition temporaire. +- Clés d’exposition temporaire (également appelées clés de diagnostic) + * Si vous recevez un résultat de test positif, vous recevez une clé d’exposition temporaire que vous pouvez téléverser et partager avec tous les utilisateurs de l’application, uniquement si vous décidez de le faire. Vous avez le contrôle total de la décision de téléverser ou non la clé d’exposition temporaire. + * COVID Shield conserve votre clé d’exposition temporaire pendant 30 jours ou moins. + * Les autres utilisateurs peuvent ensuite utiliser COVID Shield pour déterminer si les identifiants aléatoires avec lesquels leur appareil est entré en contact sont associés à une clé d’exposition temporaire (donc, s’ils ont pu entrer en contact avec une personne infectée). +- Journaux d’utilisation des applications + * Comme presque tous les services Internet ou applications, COVID Shield génère automatiquement des journaux lorsque vous utilisez le service. Ces journaux contiennent certaines informations sur votre appareil, que nous utilisons pour résoudre les problèmes survenant avec COVID Shield. + * Ces journaux ne comprennent PAS d’identifiants aléatoires ni de clés d’exposition temporaire et ne peuvent pas être utilisés pour associer un identifiant de proximité mobile ou une clé d’exposition temporaire à vous ou à votre appareil. + * Ces journaux sont automatiquement supprimés sept jours après leur création. +COVID Shield ne collecte pas les données de localisation de votre appareil. Elle ne recueille pas ni ne partage aucun renseignement permettant de vous associer, vous ou votre appareil, aux identifiants aléatoires ou aux clés d’exposition temporaire que vous générez. -## When Do We Share Your Information? -We will not voluntarily share any of your personal information with anyone, except: -- When you choose to upload a Temporary Exposure Key COVID Shield will share that information (which cannot be linked back to you by someone who does not have access to your device) with other devices that have been in contact with your device, as described in the Google and Apple [Exposure Notification Framework](https://www.apple.com/covid19/contacttracing). -- We store your personal information in an encrypted form using Amazon Web Services. Amazon Web Services may store this information outside of Canada, including in the United States. +## Quand partageons-nous vos renseignements? +Nous ne partageons volontairement aucun de vos renseignements personnels avec qui que ce soit, sauf dans les situations suivantes : +- Lorsque vous choisissez de téléverser une clé d’exposition temporaire, COVID Shield partage ces renseignements (qui ne peuvent pas être associés à vous par une personne n’ayant pas accès à votre appareil) avec d’autres appareils qui ont été en contact avec votre appareil, comme l’explique le [cadre de notification d’exposition](https://www.apple.com/covid19/contacttracing) de Google et d’Apple. +- Nous stockons vos renseignements personnels sous forme cryptée à l’aide d’Amazon Web Services. Amazon Web Services peut stocker ces renseignements à l’extérieur du Canada, y compris aux États-Unis. -## How Do We Protect Your Information? -COVID Shield protects Temporary Exposure Keys using Google and Apple’s [Exposure Notification Framework](https://www.apple.com/covid19/contacttracing), which includes very specific requirements as to how this information will be encrypted and transferred. COVID Shield does not store or generate your Random IDs—that is handled by your device. +## Comment protégeons-nous vos renseignements? +COVID Shield protège les clés d’exposition temporaire à l’aide du [cadre de notification d’exposition](https://www.apple.com/covid19/contacttracing) de Google et d’Apple, qui comprend des exigences très spécifiques quant à la manière dont ces informations doivent être cryptées et transférées. COVID Shield ne stocke pas ni ne génère vos identifiants aléatoires, qui sont gérés par votre appareil. -## Your Rights Over Your Information +## Vos droits sur vos renseignements -Because we have no way to tie a Temporary Exposure Key or our Access Logs to you without your device, we have no way to securely provide you with or delete this information upon request. That said, you have complete control over your use of this technology. Your device should allow you to turn off exposure notifications or delete the exposure logs stored on your device at any time. Additionally, you can uninstall COVID Shield at any time. If you do so, all Temporary Encryption Keys stored by COVID Shield will be deleted. +Comme nous n’avons aucun moyen d’associer une clé d’exposition temporaire ou nos journaux d’accès à vous sans votre appareil, nous n’avons aucun moyen de vous fournir ou de supprimer ces renseignements de façon sécuritaire et sur demande. Cela dit, vous avez un contrôle total sur l’utilisation que vous faites de cette technologie. Votre appareil devrait vous permettre de désactiver les notifications d’exposition ou de supprimer les journaux d’exposition stockés sur celui-ci à tout moment. De plus, vous pouvez désinstaller COVID Shield à tout moment. Si vous le faites, toutes les clés de cryptage temporaires stockées par COVID Shield seront supprimées. -If you have any questions or complaints about COVID Shield’s privacy practices, you can email us at [privacy email alias]. +Si vous avez des questions ou des plaintes concernant les pratiques de COVID Shield en matière de protection de la vie privée, vous pouvez nous envoyer un courriel à [privacy@covidshield.app](mailto:privacy@covidshield.app). -Last updated May 13, 2020 +Dernière mise à jour : 13 mai 2020 `; export default privacy; diff --git a/src/env/index.ts b/src/env/index.ts index 51f79c3a..42ad51b4 100644 --- a/src/env/index.ts +++ b/src/env/index.ts @@ -1,15 +1,21 @@ +import {Platform} from 'react-native'; import Config from 'react-native-config'; -export const APP_ID = Config.APP_ID; +export const APP_ID = Platform.select({ + android: Config.APP_ID_ANDROID, + ios: Config.APP_ID_IOS, +})!!; export const APP_VERSION_CODE = parseInt(Config.APP_VERSION_CODE, 10); export const APP_VERSION_NAME = Config.APP_VERSION_NAME; -export const TEST_MODE = Config.TEST_MODE === 'true' || false; - export const SUBMIT_URL = Config.SUBMIT_URL; export const RETRIEVE_URL = Config.RETRIEVE_URL; export const HMAC_KEY = Config.HMAC_KEY; + +export const TEST_MODE = Config.TEST_MODE === 'true' || false; + +export const MOCK_SERVER = Config.MOCK_SERVER === 'true' || false; diff --git a/src/locale/translations/en.json b/src/locale/translations/en.json index 2eb229a4..a8463fc3 100644 --- a/src/locale/translations/en.json +++ b/src/locale/translations/en.json @@ -76,8 +76,10 @@ "Title": "Language", "En": "English (Canada)", "Fr": "Français (Canada)", + "PtBR": "Portuguese (Brazil)", "EnShort": "English", "FrShort": "Français", + "PtBRShort": "Portuguese (Brazil)", "Close": "Back" }, "Tutorial": { diff --git a/src/locale/translations/fr.json b/src/locale/translations/fr.json index abe384fe..43511630 100644 --- a/src/locale/translations/fr.json +++ b/src/locale/translations/fr.json @@ -1,15 +1,15 @@ { "Home": { "NoExposureDetected": "Aucune exposition à la COVID-19 détectée", - "NoExposureDetectedDetailed": "Selon vos identifiants aléatoires, dans les 14 derniers jours, vous n'avez pas été à proximité d'une personne ayant reçu un résultat de test positif à la COVID-19.", + "NoExposureDetectedDetailed": "Selon vos identifiants aléatoires, au cours des 14 derniers jours, vous n'avez pas été à proximité d'une personne ayant reçu un résultat de test positif à la COVID-19.", "ExposureDetected": "Vous avez possiblement été exposé(e) à la COVID-19", - "ExposureDetectedDetailed": "Selon vos identifiants aléatoires, dans les 14 derniers jours, vous avez été à proximité d'une personne ayant reçu un résultat de test positif à la COVID-19.", + "ExposureDetectedDetailed": "Selon vos identifiants aléatoires, au cours des 14 derniers jours, vous avez été à proximité d'une personne ayant reçu un résultat de test positif à la COVID-19.", "SeeGuidance": "Lire les directives du Canada sur la COVID-19", "GuidanceUrl": "https://www.canada.ca/fr/sante-publique/services/publications/maladies-et-affections/covid-19-comment-isoler-chez-soi.html", - "SignalDataShared": "Merci d'aider à prévenir la transmission", + "SignalDataShared": "Merci d'aider à ralentir la transmission", "SignalDataSharedDetailed": { - "One": "Vous allez recevoir chaque jour, pour les {number} prochains jour, une notification vous demandant de partager vos identifiants aléatoires.", - "Other": "Vous allez recevoir chaque jour, pour les {number} prochains jours, une notification vous demandant de partager vos identifiants aléatoires." + "One": "Vous recevrez chaque jour, au cours des {number} prochains jours, une notification vous demandant de partager vos identifiants aléatoires.", + "Other": "Vous recevrez chaque jour, au cours des {number} prochains jours, une notification vous demandant de partager vos identifiants aléatoires." }, "SignalDataSharedCTA": "Suivez vos symptômes", "SymptomTrackerUrl": "https://ca.thrive.health/covid19app/action/88a5e9a7-db9e-487b-bc87-ce35035f8e5c?from=/home&navigateTo=/tracker/complete", @@ -27,16 +27,16 @@ "AppName": "COVID Shield", "ExternalLinkHint": "Ouvre dans une nouvelle fenêtre", "LastCheckedMinutes": { - "One": "Mis à jour il y a {number} minute", - "Other": "Mis à jour il y a {number} minutes" + "One": "Dernière vérification il y a {number} minute", + "Other": "Dernière vérification il y a {number} minutes" }, "LastCheckedHours": { - "One": "Mis à jour il y a {number} heure", - "Other": "Mis à jour il y a {number} heures" + "One": "Dernière vérification il y a {number} heure", + "Other": "Dernière vérification il y a {number} heures" }, "LastCheckedDays": { - "One": "Mis à jour il y a {number} jour", - "Other": "Mis à jour il y a {number} jours" + "One": "Dernière vérification il y a {number} jour", + "Other": "Dernière vérification il y a {number} jours" } }, "OverlayClosed": { @@ -57,7 +57,7 @@ "EnterCodeCardAction": "Entrez le code", "NotificationCardStatus": "Les notifications poussées sont ", "NotificationCardStatusOff": "DÉSACTIVÉES", - "NotificationCardBody": "Vous ne recevrez pas de notifications poussées si vous avez possiblement été exposé(e) à la COVID-19. Les notifications spontanées sont importantes pour aider à prévenir la transmission de la COVID-19.", + "NotificationCardBody": "Vous ne recevrez pas de notifications poussées si vous avez possiblement été exposé(e) à la COVID-19. Les notifications spontanées sont importantes pour aider à ralentir la transmission de la COVID-19.", "NotificationCardAction": "Activez les notifications poussées", "ExposureNotificationCardStatus": "Les notifications d'exposition à la COVID-19 sont ", "ExposureNotificationCardStatusOff": "DÉSACTIVÉES", @@ -76,17 +76,19 @@ "Title": "Langue", "En": "English (Canada)", "Fr": "Français (Canada)", + "PtBR": "Portugais (Brésil)", "EnShort": "English", "FrShort": "Français", + "PtBRShort": "Portugais (Brésil)", "Close": "Retour" }, "Tutorial": { "step-1Title": "Comment fonctionne COVID Shield", "step-1": "Votre téléphone utilise la fonction Bluetooth pour collecter et partager des identifiants aléatoires avec d'autres téléphones à proximité qui ont l'application COVID Shield. Ces identifiants sont conservés en toute sécurité sur chaque téléphone.", "step-2Title": "Si vous avez potentiellement été exposé(e) à la COVID-19", - "step-2": "Vous recevrez une notification si, dans les 14 derniers jours, vous avez été à proximité d'une personne ayant reçu un résultat de test positif à la COVID-19.", + "step-2": "Vous recevrez une notification si, au cours des 14 derniers jours, vous avez été à proximité d'une personne ayant reçu un résultat de test positif à la COVID-19.", "step-3Title": "Si vous recevez un résultat de test positif à la COVID-19", - "step-3": "Avisez anonymement ceux qui ont été à proximité de vous dans les 14 derniers jours qu'ils ont possiblement été exposés à la COVID-19.", + "step-3": "Avisez anonymement ceux qui ont été à proximité de vous au cours des 14 derniers jours qu'ils ont possiblement été exposés à la COVID-19.", "ActionBack": "Précédent", "ActionNext": "Suivant", "ActionEnd": "Terminé", @@ -94,11 +96,11 @@ }, "Sharing": { "Title": "Partager l'application", - "SubTitle": "Chaque personne utilisant COVID Shield aide à prévenir la transmission de la COVID-19. Partager cette application ne partage aucune donnée privée.", + "SubTitle": "Chaque personne utilisant COVID Shield aide à ralentir la transmission de la COVID-19. Partager cette application ne partage aucune donnée privée.", "Platform-messages": "Partager avec Messages", "Platform-instagram": "Partager avec Instagram", "More": "Plus d'applications", - "Message": "Joignez-vous à moi pour aider à prévenir la transmission de la COVID-19. Téléchargez l'application COVID Shield : https://covidshield.app", + "Message": "Joignez-vous à moi pour aider à ralentir la transmission de la COVID-19. Téléchargez l'application COVID Shield : https://covidshield.app", "Close": "Fermer" }, "Onboarding": { @@ -110,7 +112,7 @@ "Title": "Vos données sont privées", "Body": "COVID Shield priorise la confidentialité lors d'envois de notifications d'exposition à la COVID-19.", "Body2": "Vos identifiants aléatoires sont conservés sur votre téléphone exclusivement, à moins que vous décidiez de les partager.", - "Body3": "L'utilisation de COVID Shield est volontaire. Vous pouvez supprimer vos identifiants aléatoires à tout moment." + "Body3": "L'utilisation de COVID Shield se fait sur une base volontaire. Vous pouvez supprimer vos identifiants aléatoires à tout moment." }, "OnboardingStart": { "Title": "Protégez-vous, protégez les autres", @@ -134,10 +136,10 @@ "InfoSmall": "Vos identifiants aléatoires ne seront pas partagés, à moins que vous donniez votre permission à l'étape suivante.", "ConsentTitle": "Partagez vos identifiants aléatoires", "ConsentBody": "Un professionnel de la santé vous a autorisé à partager les identifiants aléatoires conservés sur votre téléphone.", - "ConsentBody2": "Si vous partagez vos identifiants aléatoires, ceux qui ont été à proximité de vous dans les 14 derniers jours avec l'application COVID Shield recevront une notification les avisant qu'ils ont possiblement été exposés à la COVID-19. Cette notification ne contiendra aucune information vous concernant.", - "ConsentBody3": "Vous recevrez une notification par jour lorsque de nouveaux identifiants aléatoires pourront être partagés. Vous devrez accorder la permission chaque fois pour que les identifiants aléatoires soient partagés. Le partage est volontaire.", + "ConsentBody2": "Si vous partagez vos identifiants aléatoires, ceux qui ont été à proximité de vous au cours des 14 derniers jours avec l'application COVID Shield recevront une notification les avisant qu'ils ont possiblement été exposés à la COVID-19. Cette notification ne contiendra aucune information vous concernant.", + "ConsentBody3": "Vous recevrez une notification par jour lorsque de nouveaux identifiants aléatoires pourront être partagés. Vous devrez chaque fois donner votre autorisation pour que les identifiants aléatoires soient partagés. Le partage est volontaire.", "PrivacyPolicyLink": "Voir la politique de confidentialité", - "ConsentAction": "Accepter", + "ConsentAction": "J'accepte", "ShareToast": "Identifiants aléatoires partagés avec succès", "ErrorTitle": "Code non reconnu", "ErrorBody": "Votre code COVID Shield n'a pas pu être reconnu. Essayez de nouveau.", @@ -145,14 +147,14 @@ }, "Notification": { "ExposedMessageTitle": "Vous avez possiblement été exposé(e)", - "ExposedMessageBody": "Selon vos identifiants aléatoires, dans les 14 derniers jours, vous avez été à proximité d'une personne ayant reçu un résultat de test positif à la COVID-19.", + "ExposedMessageBody": "Selon vos identifiants aléatoires, au cours des 14 derniers jours, vous avez été à proximité d'une personne ayant reçu un résultat de test positif à la COVID-19.", "OffMessageTitle": "COVID Shield est désactivé", "OffMessageBody": "Activez COVID Shield pour recevoir une notification si vous avez potentiellement été exposé(e) à la COVID-19.", "DailyUploadNotificationTitle": "Partagez vos nouveaux identifiants aléatoires", "DailyUploadNotificationBody": "Partager vos données aide les autres à savoir s'ils ont possiblement été exposés à la COVID-19." }, "Partners": { - "Label": "Développé en partenariat avec" + "Label": "Conçu en partenariat avec" }, "BottomSheet": { "Collapse": "Fermer" diff --git a/src/locale/translations/index.js b/src/locale/translations/index.js index 840a28fe..e40cb7fd 100644 --- a/src/locale/translations/index.js +++ b/src/locale/translations/index.js @@ -1 +1 @@ -export default JSON.parse("{\"en\":{\"Home\":{\"NoExposureDetected\":\"No exposure detected\",\"NoExposureDetectedDetailed\":\"Based on your random IDs, you have not been near someone in the past 14 days who has tested positive for COVID-19.\",\"ExposureDetected\":\"You have possibly been exposed to COVID-19\",\"ExposureDetectedDetailed\":\"Based on your random IDs, you have been near someone in the past 14 days who tested positive for COVID-19.\",\"SeeGuidance\":\"Read Canada COVID-19 guidance\",\"GuidanceUrl\":\"https://www.canada.ca/en/public-health/services/publications/diseases-conditions/covid-19-how-to-isolate-at-home.html\",\"SignalDataShared\":\"Thank you for helping to slow the spread\",\"SignalDataSharedDetailed\":{\"One\":\"You will receive a notification asking you to share your random IDs each day for the next {number} day.\",\"Other\":\"You will receive a notification asking you to share your random IDs each day for the next {number} days.\"},\"SignalDataSharedCTA\":\"Track your symptoms\",\"SymptomTrackerUrl\":\"https://ca.thrive.health/covid19app/action/88a5e9a7-db9e-487b-bc87-ce35035f8e5c?from=/home&navigateTo=/tracker/complete\",\"DailyShare\":\"Share your new random IDs\",\"DailyShareDetailed\":\"Sharing your data helps others to know if they have possibly been exposed to COVID-19.\",\"ShareRandomIDsCTA\":\"Share your random IDs\",\"BluetoothDisabled\":\"Bluetooth is off\",\"EnableBluetoothCTA\":\"Bluetooth is used to collect and share random IDs needed for COVID Shield to work.\",\"TurnOnBluetooth\":\"Turn on Bluetooth\",\"ExposureNotificationsDisabled\":\"Exposure notifications are off\",\"ExposureNotificationsDisabledDetailed\":\"Exposure notifications are needed for COVID Shield to work.\",\"EnableExposureNotificationsCTA\":\"Turn on exposure notifications\",\"NoConnectivity\":\"No internet connection\",\"NoConnectivityDetailed\":\"COVID Shield needs internet access to continue checking for potential exposure.\",\"AppName\":\"COVID Shield\",\"ExternalLinkHint\":\"Opens in a new window\",\"LastCheckedMinutes\":{\"One\":\"Last checked {number} minute ago\",\"Other\":\"Last checked {number} minutes ago\"},\"LastCheckedHours\":{\"One\":\"Last checked {number} hour ago\",\"Other\":\"Last checked {number} hours ago\"},\"LastCheckedDays\":{\"One\":\"Last checked {number} day ago\",\"Other\":\"Last checked {number} days ago\"}},\"OverlayClosed\":{\"SystemStatus\":\"COVID Shield is \",\"SystemStatusOn\":\"ON\",\"SystemStatusOff\":\"OFF\",\"NotificationStatus\":\"Push notifications are \",\"NotificationStatusOff\":\"OFF\",\"TapPrompt\":\"Tap for more information\"},\"OverlayOpen\":{\"BluetoothCardStatus\":\"Bluetooth is \",\"BluetoothCardStatusOff\":\"OFF\",\"BluetoothCardBody\":\"Bluetooth is used to collect and share random IDs needed for COVID Shield to work.\",\"BluetoothCardAction\":\"Turn on Bluetooth\",\"EnterCodeCardTitle\":\"COVID Shield code\",\"EnterCodeCardBody\":\"Has a health care professional asked you to enter a COVID Shield code?\",\"EnterCodeCardAction\":\"Enter code\",\"NotificationCardStatus\":\"Push notifications are \",\"NotificationCardStatusOff\":\"OFF\",\"NotificationCardBody\":\"You will not receive push notifications if you have possibly been exposed to COVID-19. Timely notification of potential exposure is important in helping to slow the spread of COVID-19.\",\"NotificationCardAction\":\"Turn on push notifications\",\"ExposureNotificationCardStatus\":\"Exposure notifications are \",\"ExposureNotificationCardStatusOff\":\"OFF\",\"ExposureNotificationCardBody\":\"Exposure notifications are needed for COVID Shield to work.\",\"ExposureNotificationCardAction\":\"Turn on exposure notifications\"},\"Info\":{\"CheckSymptoms\":\"Check symptoms\",\"SymptomsUrl\":\"https://ca.thrive.health/covid19/en\",\"TellAFriend\":\"Share app\",\"LearnMore\":\"How COVID Shield works\",\"ChangeLanguage\":\"Change language\",\"Privacy\":\"Read privacy policy\"},\"LanguageSelect\":{\"Title\":\"Language\",\"En\":\"English (Canada)\",\"Fr\":\"Français (Canada)\",\"EnShort\":\"English\",\"FrShort\":\"Français\",\"Close\":\"Back\"},\"Tutorial\":{\"step-1Title\":\"How COVID Shield works\",\"step-1\":\"Your phone uses Bluetooth to collect and share random IDs with phones near you with COVID Shield installed. These IDs are stored securely on each phone.\",\"step-2Title\":\"If you have potentially been exposed to COVID-19\",\"step-2\":\"You will receive a notification if you have been near someone in the past 14 days who has tested positive for COVID-19.\",\"step-3Title\":\"If you test positive for COVID-19\",\"step-3\":\"Anonymously notify others who have been near you in the past 14 days that they have possibly been exposed.\",\"ActionBack\":\"Back\",\"ActionNext\":\"Next\",\"ActionEnd\":\"Done\",\"Close\":\"Close\"},\"Sharing\":{\"Title\":\"Share app\",\"SubTitle\":\"Every person using COVID Shield helps to slow the spread of COVID-19. Sharing this app will not share any personal data.\",\"Platform-messages\":\"Share to Messages\",\"Platform-instagram\":\"Share to Instagram\",\"More\":\"More apps\",\"Message\":\"Join me in helping to slow the spread of COVID-19. Download the COVID Shield app: https://covidshield.app\",\"Close\":\"Close\"},\"Onboarding\":{\"ActionNext\":\"Next\",\"ActionEnd\":\"Done\",\"ActionBack\":\"Back\"},\"OnboardingPermissions\":{\"Title\":\"Your data is private\",\"Body\":\"COVID Shield takes a privacy-first approach to exposure notification.\",\"Body2\":\"Your random IDs are stored exclusively on your phone unless you choose to share them.\",\"Body3\":\"Use of COVID Shield is voluntary. You can delete your random IDs at any time.\"},\"OnboardingStart\":{\"Title\":\"Keep yourself and others safe\",\"Body1\":\"Get notified if you have potentially been exposed to COVID-19.\",\"Body2\":\"If you test positive for COVID-19, you can choose to anonymously share your data so others can be notified of possible exposure.\",\"TutorialAction\":\"Learn how COVID Shield works\"},\"Privacy\":{\"Title\":\"Privacy policy\",\"Close\":\"Close\"},\"ThankYou\":{\"Title\":\"Thank you for helping\",\"Body\":\"Exposure notifications are on. You will receive a notification if COVID Shield detects that you have possibly been exposed to COVID-19.\",\"Dismiss\":\"Dismiss\"},\"DataUpload\":{\"Cancel\":\"Cancel\",\"FormIntro\":\"Please enter your 8 digit COVID Shield code.\",\"Action\":\"Submit code\",\"InfoSmall\":\"Your random IDs will not be shared unless you give permission in the next step.\",\"ConsentTitle\":\"Share your random IDs\",\"ConsentBody\":\"You have been granted access by a health care professional to share the random IDs stored on your phone.\",\"ConsentBody2\":\"If you share your random IDs, others with COVID Shield who have been near you in the past 14 days will receive a notification that they have possibly been exposed. This notification will not include any information about you.\",\"ConsentBody3\":\"You will be notified once per day when new random IDs are available to be shared. You must grant permission each time for the random IDs to be shared. Sharing is voluntary.\",\"PrivacyPolicyLink\":\"View privacy policy\",\"ConsentAction\":\"I agree\",\"ShareToast\":\"Random IDs shared successfully\",\"ErrorTitle\":\"Code not recognized\",\"ErrorBody\":\"Your COVID Shield code could not be recognized. Please try again.\",\"ErrorAction\":\"OK\"},\"Notification\":{\"ExposedMessageTitle\":\"You have possibly been exposed to COVID-19\",\"ExposedMessageBody\":\"Based on your random IDs, you have been near someone in the past 14 days who tested positive for COVID-19.\",\"OffMessageTitle\":\"COVID Shield is off\",\"OffMessageBody\":\"Turn on COVID Shield to get notified if you have potentially been exposed to COVID-19.\",\"DailyUploadNotificationTitle\":\"Share your new random IDs\",\"DailyUploadNotificationBody\":\"Sharing your data helps others to know if they have possibly been exposed to COVID-19.\"},\"Partners\":{\"Label\":\"Developed in partnership with\"},\"BottomSheet\":{\"Collapse\":\"Close\"}},\"fr\":{\"Home\":{\"NoExposureDetected\":\"Aucune exposition à la COVID-19 détectée\",\"NoExposureDetectedDetailed\":\"Selon vos identifiants aléatoires, dans les 14 derniers jours, vous n'avez pas été à proximité d'une personne ayant reçu un résultat de test positif à la COVID-19.\",\"ExposureDetected\":\"Vous avez possiblement été exposé(e) à la COVID-19\",\"ExposureDetectedDetailed\":\"Selon vos identifiants aléatoires, dans les 14 derniers jours, vous avez été à proximité d'une personne ayant reçu un résultat de test positif à la COVID-19.\",\"SeeGuidance\":\"Lire les directives du Canada sur la COVID-19\",\"GuidanceUrl\":\"https://www.canada.ca/fr/sante-publique/services/publications/maladies-et-affections/covid-19-comment-isoler-chez-soi.html\",\"SignalDataShared\":\"Merci d'aider à prévenir la transmission\",\"SignalDataSharedDetailed\":{\"One\":\"Vous allez recevoir chaque jour, pour les {number} prochains jour, une notification vous demandant de partager vos identifiants aléatoires.\",\"Other\":\"Vous allez recevoir chaque jour, pour les {number} prochains jours, une notification vous demandant de partager vos identifiants aléatoires.\"},\"SignalDataSharedCTA\":\"Suivez vos symptômes\",\"SymptomTrackerUrl\":\"https://ca.thrive.health/covid19app/action/88a5e9a7-db9e-487b-bc87-ce35035f8e5c?from=/home&navigateTo=/tracker/complete\",\"DailyShare\":\"Partagez vos nouveaux identifiants aléatoires\",\"DailyShareDetailed\":\"Partager vos données aide les autres à savoir s'ils ont possiblement été exposés à la COVID-19.\",\"ShareRandomIDsCTA\":\"Partagez vos identifiants aléatoires\",\"BluetoothDisabled\":\"Le Bluetooth est désactivé\",\"EnableBluetoothCTA\":\"Le Bluetooth est utilisé pour collecter et partager des identifiants aléatoires nécessaires au fonctionnement de COVID Shield.\",\"TurnOnBluetooth\":\"Activez le Bluetooth\",\"ExposureNotificationsDisabled\":\"Les notifications d'exposition à la COVID-19 sont désactivées\",\"ExposureNotificationsDisabledDetailed\":\"Les notifications d'exposition à la COVID-19 sont nécessaires au fonctionnement de COVID Shield.\",\"EnableExposureNotificationsCTA\":\"Activez les notifications d'exposition à la COVID-19\",\"NoConnectivity\":\"Aucune connexion Internet\",\"NoConnectivityDetailed\":\"COVID Shield a besoin d'un accès Internet pour continuer de vérifier les expositions potentielles à la COVID-19.\",\"AppName\":\"COVID Shield\",\"ExternalLinkHint\":\"Ouvre dans une nouvelle fenêtre\",\"LastCheckedMinutes\":{\"One\":\"Mis à jour il y a {number} minute\",\"Other\":\"Mis à jour il y a {number} minutes\"},\"LastCheckedHours\":{\"One\":\"Mis à jour il y a {number} heure\",\"Other\":\"Mis à jour il y a {number} heures\"},\"LastCheckedDays\":{\"One\":\"Mis à jour il y a {number} jour\",\"Other\":\"Mis à jour il y a {number} jours\"}},\"OverlayClosed\":{\"SystemStatus\":\"COVID Shield est \",\"SystemStatusOn\":\"ACTIVÉ\",\"SystemStatusOff\":\"DÉSACTIVÉ\",\"NotificationStatus\":\"Les notifications poussées sont \",\"NotificationStatusOff\":\"DÉSACTIVÉES\",\"TapPrompt\":\"Appuyez pour plus d'information\"},\"OverlayOpen\":{\"BluetoothCardStatus\":\"Le Bluetooth est \",\"BluetoothCardStatusOff\":\"DÉSACTIVÉ\",\"BluetoothCardBody\":\"Le Bluetooth est utilisé pour collecter et partager des identifiants aléatoires nécessaires au fonctionnement de COVID Shield.\",\"BluetoothCardAction\":\"Activez le Bluetooth\",\"EnterCodeCardTitle\":\"Code COVID Shield\",\"EnterCodeCardBody\":\"Un professionel de la santé vous a-t-il demandé d'entrer un code COVID Shield?\",\"EnterCodeCardAction\":\"Entrez le code\",\"NotificationCardStatus\":\"Les notifications poussées sont \",\"NotificationCardStatusOff\":\"DÉSACTIVÉES\",\"NotificationCardBody\":\"Vous ne recevrez pas de notifications poussées si vous avez possiblement été exposé(e) à la COVID-19. Les notifications spontanées sont importantes pour aider à prévenir la transmission de la COVID-19.\",\"NotificationCardAction\":\"Activez les notifications poussées\",\"ExposureNotificationCardStatus\":\"Les notifications d'exposition à la COVID-19 sont \",\"ExposureNotificationCardStatusOff\":\"DÉSACTIVÉES\",\"ExposureNotificationCardBody\":\"Les notifications d'exposition à la COVID-19 sont nécessaires au fonctionnement de COVID Shield.\",\"ExposureNotificationCardAction\":\"Activez les notifications d'exposition\"},\"Info\":{\"CheckSymptoms\":\"Vérifier vos symptômes\",\"SymptomsUrl\":\"https://ca.thrive.health/covid19/fr\",\"TellAFriend\":\"Partager l'application\",\"LearnMore\":\"Comment fonctionne COVID Shield\",\"ChangeLanguage\":\"Changer de langue\",\"Privacy\":\"Lire la politique de confidentialité\"},\"LanguageSelect\":{\"Title\":\"Langue\",\"En\":\"English (Canada)\",\"Fr\":\"Français (Canada)\",\"EnShort\":\"English\",\"FrShort\":\"Français\",\"Close\":\"Retour\"},\"Tutorial\":{\"step-1Title\":\"Comment fonctionne COVID Shield\",\"step-1\":\"Votre téléphone utilise la fonction Bluetooth pour collecter et partager des identifiants aléatoires avec d'autres téléphones à proximité qui ont l'application COVID Shield. Ces identifiants sont conservés en toute sécurité sur chaque téléphone.\",\"step-2Title\":\"Si vous avez potentiellement été exposé(e) à la COVID-19\",\"step-2\":\"Vous recevrez une notification si, dans les 14 derniers jours, vous avez été à proximité d'une personne ayant reçu un résultat de test positif à la COVID-19.\",\"step-3Title\":\"Si vous recevez un résultat de test positif à la COVID-19\",\"step-3\":\"Avisez anonymement ceux qui ont été à proximité de vous dans les 14 derniers jours qu'ils ont possiblement été exposés à la COVID-19.\",\"ActionBack\":\"Précédent\",\"ActionNext\":\"Suivant\",\"ActionEnd\":\"Terminé\",\"Close\":\"Fermer\"},\"Sharing\":{\"Title\":\"Partager l'application\",\"SubTitle\":\"Chaque personne utilisant COVID Shield aide à prévenir la transmission de la COVID-19. Partager cette application ne partage aucune donnée privée.\",\"Platform-messages\":\"Partager avec Messages\",\"Platform-instagram\":\"Partager avec Instagram\",\"More\":\"Plus d'applications\",\"Message\":\"Joignez-vous à moi pour aider à prévenir la transmission de la COVID-19. Téléchargez l'application COVID Shield : https://covidshield.app\",\"Close\":\"Fermer\"},\"Onboarding\":{\"ActionNext\":\"Suivant\",\"ActionEnd\":\"Terminé\",\"ActionBack\":\"Précédent\"},\"OnboardingPermissions\":{\"Title\":\"Vos données sont privées\",\"Body\":\"COVID Shield priorise la confidentialité lors d'envois de notifications d'exposition à la COVID-19.\",\"Body2\":\"Vos identifiants aléatoires sont conservés sur votre téléphone exclusivement, à moins que vous décidiez de les partager.\",\"Body3\":\"L'utilisation de COVID Shield est volontaire. Vous pouvez supprimer vos identifiants aléatoires à tout moment.\"},\"OnboardingStart\":{\"Title\":\"Protégez-vous, protégez les autres\",\"Body1\":\"Recevez une notification si vous avez potentiellement été exposé(e) à la COVID-19.\",\"Body2\":\"Si vous recevez un résultat de test positif à la COVID-19, vous pouvez choisir de partager vos données de façon anonyme pour aviser ceux qui ont possiblement été exposés.\",\"TutorialAction\":\"Découvrez comment COVID Shield fonctionne\"},\"Privacy\":{\"Title\":\"Politique de confidentialité\",\"Close\":\"Fermer\"},\"ThankYou\":{\"Title\":\"Merci d'aider\",\"Body\":\"Les notifications d’exposition sont activées. Si COVID Shield détecte que vous avez possiblement été exposé(e) à la COVID-19, vous recevrez une notification.\",\"Dismiss\":\"OK\"},\"DataUpload\":{\"Cancel\":\"Annuler\",\"FormIntro\":\"Entrez votre code COVID Shield à 8 chiffres.\",\"Action\":\"Soumettre le code\",\"InfoSmall\":\"Vos identifiants aléatoires ne seront pas partagés, à moins que vous donniez votre permission à l'étape suivante.\",\"ConsentTitle\":\"Partagez vos identifiants aléatoires\",\"ConsentBody\":\"Un professionnel de la santé vous a autorisé à partager les identifiants aléatoires conservés sur votre téléphone.\",\"ConsentBody2\":\"Si vous partagez vos identifiants aléatoires, ceux qui ont été à proximité de vous dans les 14 derniers jours avec l'application COVID Shield recevront une notification les avisant qu'ils ont possiblement été exposés à la COVID-19. Cette notification ne contiendra aucune information vous concernant.\",\"ConsentBody3\":\"Vous recevrez une notification par jour lorsque de nouveaux identifiants aléatoires pourront être partagés. Vous devrez accorder la permission chaque fois pour que les identifiants aléatoires soient partagés. Le partage est volontaire.\",\"PrivacyPolicyLink\":\"Voir la politique de confidentialité\",\"ConsentAction\":\"Accepter\",\"ShareToast\":\"Identifiants aléatoires partagés avec succès\",\"ErrorTitle\":\"Code non reconnu\",\"ErrorBody\":\"Votre code COVID Shield n'a pas pu être reconnu. Essayez de nouveau.\",\"ErrorAction\":\"OK\"},\"Notification\":{\"ExposedMessageTitle\":\"Vous avez possiblement été exposé(e)\",\"ExposedMessageBody\":\"Selon vos identifiants aléatoires, dans les 14 derniers jours, vous avez été à proximité d'une personne ayant reçu un résultat de test positif à la COVID-19.\",\"OffMessageTitle\":\"COVID Shield est désactivé\",\"OffMessageBody\":\"Activez COVID Shield pour recevoir une notification si vous avez potentiellement été exposé(e) à la COVID-19.\",\"DailyUploadNotificationTitle\":\"Partagez vos nouveaux identifiants aléatoires\",\"DailyUploadNotificationBody\":\"Partager vos données aide les autres à savoir s'ils ont possiblement été exposés à la COVID-19.\"},\"Partners\":{\"Label\":\"Développé en partenariat avec\"},\"BottomSheet\":{\"Collapse\":\"Fermer\"}}}") \ No newline at end of file +export default JSON.parse("{\"en\":{\"Home\":{\"NoExposureDetected\":\"No exposure detected\",\"NoExposureDetectedDetailed\":\"Based on your random IDs, you have not been near someone in the past 14 days who has tested positive for COVID-19.\",\"ExposureDetected\":\"You have possibly been exposed to COVID-19\",\"ExposureDetectedDetailed\":\"Based on your random IDs, you have been near someone in the past 14 days who tested positive for COVID-19.\",\"SeeGuidance\":\"Read Canada COVID-19 guidance\",\"GuidanceUrl\":\"https://www.canada.ca/en/public-health/services/publications/diseases-conditions/covid-19-how-to-isolate-at-home.html\",\"SignalDataShared\":\"Thank you for helping to slow the spread\",\"SignalDataSharedDetailed\":{\"One\":\"You will receive a notification asking you to share your random IDs each day for the next {number} day.\",\"Other\":\"You will receive a notification asking you to share your random IDs each day for the next {number} days.\"},\"SignalDataSharedCTA\":\"Track your symptoms\",\"SymptomTrackerUrl\":\"https://ca.thrive.health/covid19app/action/88a5e9a7-db9e-487b-bc87-ce35035f8e5c?from=/home&navigateTo=/tracker/complete\",\"DailyShare\":\"Share your new random IDs\",\"DailyShareDetailed\":\"Sharing your data helps others to know if they have possibly been exposed to COVID-19.\",\"ShareRandomIDsCTA\":\"Share your random IDs\",\"BluetoothDisabled\":\"Bluetooth is off\",\"EnableBluetoothCTA\":\"Bluetooth is used to collect and share random IDs needed for COVID Shield to work.\",\"TurnOnBluetooth\":\"Turn on Bluetooth\",\"ExposureNotificationsDisabled\":\"Exposure notifications are off\",\"ExposureNotificationsDisabledDetailed\":\"Exposure notifications are needed for COVID Shield to work.\",\"EnableExposureNotificationsCTA\":\"Turn on exposure notifications\",\"NoConnectivity\":\"No internet connection\",\"NoConnectivityDetailed\":\"COVID Shield needs internet access to continue checking for potential exposure.\",\"AppName\":\"COVID Shield\",\"ExternalLinkHint\":\"Opens in a new window\",\"LastCheckedMinutes\":{\"One\":\"Last checked {number} minute ago\",\"Other\":\"Last checked {number} minutes ago\"},\"LastCheckedHours\":{\"One\":\"Last checked {number} hour ago\",\"Other\":\"Last checked {number} hours ago\"},\"LastCheckedDays\":{\"One\":\"Last checked {number} day ago\",\"Other\":\"Last checked {number} days ago\"}},\"OverlayClosed\":{\"SystemStatus\":\"COVID Shield is \",\"SystemStatusOn\":\"ON\",\"SystemStatusOff\":\"OFF\",\"NotificationStatus\":\"Push notifications are \",\"NotificationStatusOff\":\"OFF\",\"TapPrompt\":\"Tap for more information\"},\"OverlayOpen\":{\"BluetoothCardStatus\":\"Bluetooth is \",\"BluetoothCardStatusOff\":\"OFF\",\"BluetoothCardBody\":\"Bluetooth is used to collect and share random IDs needed for COVID Shield to work.\",\"BluetoothCardAction\":\"Turn on Bluetooth\",\"EnterCodeCardTitle\":\"COVID Shield code\",\"EnterCodeCardBody\":\"Has a health care professional asked you to enter a COVID Shield code?\",\"EnterCodeCardAction\":\"Enter code\",\"NotificationCardStatus\":\"Push notifications are \",\"NotificationCardStatusOff\":\"OFF\",\"NotificationCardBody\":\"You will not receive push notifications if you have possibly been exposed to COVID-19. Timely notification of potential exposure is important in helping to slow the spread of COVID-19.\",\"NotificationCardAction\":\"Turn on push notifications\",\"ExposureNotificationCardStatus\":\"Exposure notifications are \",\"ExposureNotificationCardStatusOff\":\"OFF\",\"ExposureNotificationCardBody\":\"Exposure notifications are needed for COVID Shield to work.\",\"ExposureNotificationCardAction\":\"Turn on exposure notifications\"},\"Info\":{\"CheckSymptoms\":\"Check symptoms\",\"SymptomsUrl\":\"https://ca.thrive.health/covid19/en\",\"TellAFriend\":\"Share app\",\"LearnMore\":\"How COVID Shield works\",\"ChangeLanguage\":\"Change language\",\"Privacy\":\"Read privacy policy\"},\"LanguageSelect\":{\"Title\":\"Language\",\"En\":\"English (Canada)\",\"Fr\":\"Français (Canada)\",\"PtBR\":\"Portuguese (Brazil)\",\"EnShort\":\"English\",\"FrShort\":\"Français\",\"PtBRShort\":\"Portuguese (Brazil)\",\"Close\":\"Back\"},\"Tutorial\":{\"step-1Title\":\"How COVID Shield works\",\"step-1\":\"Your phone uses Bluetooth to collect and share random IDs with phones near you with COVID Shield installed. These IDs are stored securely on each phone.\",\"step-2Title\":\"If you have potentially been exposed to COVID-19\",\"step-2\":\"You will receive a notification if you have been near someone in the past 14 days who has tested positive for COVID-19.\",\"step-3Title\":\"If you test positive for COVID-19\",\"step-3\":\"Anonymously notify others who have been near you in the past 14 days that they have possibly been exposed.\",\"ActionBack\":\"Back\",\"ActionNext\":\"Next\",\"ActionEnd\":\"Done\",\"Close\":\"Close\"},\"Sharing\":{\"Title\":\"Share app\",\"SubTitle\":\"Every person using COVID Shield helps to slow the spread of COVID-19. Sharing this app will not share any personal data.\",\"Platform-messages\":\"Share to Messages\",\"Platform-instagram\":\"Share to Instagram\",\"More\":\"More apps\",\"Message\":\"Join me in helping to slow the spread of COVID-19. Download the COVID Shield app: https://covidshield.app\",\"Close\":\"Close\"},\"Onboarding\":{\"ActionNext\":\"Next\",\"ActionEnd\":\"Done\",\"ActionBack\":\"Back\"},\"OnboardingPermissions\":{\"Title\":\"Your data is private\",\"Body\":\"COVID Shield takes a privacy-first approach to exposure notification.\",\"Body2\":\"Your random IDs are stored exclusively on your phone unless you choose to share them.\",\"Body3\":\"Use of COVID Shield is voluntary. You can delete your random IDs at any time.\"},\"OnboardingStart\":{\"Title\":\"Keep yourself and others safe\",\"Body1\":\"Get notified if you have potentially been exposed to COVID-19.\",\"Body2\":\"If you test positive for COVID-19, you can choose to anonymously share your data so others can be notified of possible exposure.\",\"TutorialAction\":\"Learn how COVID Shield works\"},\"Privacy\":{\"Title\":\"Privacy policy\",\"Close\":\"Close\"},\"ThankYou\":{\"Title\":\"Thank you for helping\",\"Body\":\"Exposure notifications are on. You will receive a notification if COVID Shield detects that you have possibly been exposed to COVID-19.\",\"Dismiss\":\"Dismiss\"},\"DataUpload\":{\"Cancel\":\"Cancel\",\"FormIntro\":\"Please enter your 8 digit COVID Shield code.\",\"Action\":\"Submit code\",\"InfoSmall\":\"Your random IDs will not be shared unless you give permission in the next step.\",\"ConsentTitle\":\"Share your random IDs\",\"ConsentBody\":\"You have been granted access by a health care professional to share the random IDs stored on your phone.\",\"ConsentBody2\":\"If you share your random IDs, others with COVID Shield who have been near you in the past 14 days will receive a notification that they have possibly been exposed. This notification will not include any information about you.\",\"ConsentBody3\":\"You will be notified once per day when new random IDs are available to be shared. You must grant permission each time for the random IDs to be shared. Sharing is voluntary.\",\"PrivacyPolicyLink\":\"View privacy policy\",\"ConsentAction\":\"I agree\",\"ShareToast\":\"Random IDs shared successfully\",\"ErrorTitle\":\"Code not recognized\",\"ErrorBody\":\"Your COVID Shield code could not be recognized. Please try again.\",\"ErrorAction\":\"OK\"},\"Notification\":{\"ExposedMessageTitle\":\"You have possibly been exposed to COVID-19\",\"ExposedMessageBody\":\"Based on your random IDs, you have been near someone in the past 14 days who tested positive for COVID-19.\",\"OffMessageTitle\":\"COVID Shield is off\",\"OffMessageBody\":\"Turn on COVID Shield to get notified if you have potentially been exposed to COVID-19.\",\"DailyUploadNotificationTitle\":\"Share your new random IDs\",\"DailyUploadNotificationBody\":\"Sharing your data helps others to know if they have possibly been exposed to COVID-19.\"},\"Partners\":{\"Label\":\"Developed in partnership with\"},\"BottomSheet\":{\"Collapse\":\"Close\"}},\"fr\":{\"Home\":{\"NoExposureDetected\":\"Aucune exposition à la COVID-19 détectée\",\"NoExposureDetectedDetailed\":\"Selon vos identifiants aléatoires, au cours des 14 derniers jours, vous n'avez pas été à proximité d'une personne ayant reçu un résultat de test positif à la COVID-19.\",\"ExposureDetected\":\"Vous avez possiblement été exposé(e) à la COVID-19\",\"ExposureDetectedDetailed\":\"Selon vos identifiants aléatoires, au cours des 14 derniers jours, vous avez été à proximité d'une personne ayant reçu un résultat de test positif à la COVID-19.\",\"SeeGuidance\":\"Lire les directives du Canada sur la COVID-19\",\"GuidanceUrl\":\"https://www.canada.ca/fr/sante-publique/services/publications/maladies-et-affections/covid-19-comment-isoler-chez-soi.html\",\"SignalDataShared\":\"Merci d'aider à ralentir la transmission\",\"SignalDataSharedDetailed\":{\"One\":\"Vous recevrez chaque jour, au cours des {number} prochains jours, une notification vous demandant de partager vos identifiants aléatoires.\",\"Other\":\"Vous recevrez chaque jour, au cours des {number} prochains jours, une notification vous demandant de partager vos identifiants aléatoires.\"},\"SignalDataSharedCTA\":\"Suivez vos symptômes\",\"SymptomTrackerUrl\":\"https://ca.thrive.health/covid19app/action/88a5e9a7-db9e-487b-bc87-ce35035f8e5c?from=/home&navigateTo=/tracker/complete\",\"DailyShare\":\"Partagez vos nouveaux identifiants aléatoires\",\"DailyShareDetailed\":\"Partager vos données aide les autres à savoir s'ils ont possiblement été exposés à la COVID-19.\",\"ShareRandomIDsCTA\":\"Partagez vos identifiants aléatoires\",\"BluetoothDisabled\":\"Le Bluetooth est désactivé\",\"EnableBluetoothCTA\":\"Le Bluetooth est utilisé pour collecter et partager des identifiants aléatoires nécessaires au fonctionnement de COVID Shield.\",\"TurnOnBluetooth\":\"Activez le Bluetooth\",\"ExposureNotificationsDisabled\":\"Les notifications d'exposition à la COVID-19 sont désactivées\",\"ExposureNotificationsDisabledDetailed\":\"Les notifications d'exposition à la COVID-19 sont nécessaires au fonctionnement de COVID Shield.\",\"EnableExposureNotificationsCTA\":\"Activez les notifications d'exposition à la COVID-19\",\"NoConnectivity\":\"Aucune connexion Internet\",\"NoConnectivityDetailed\":\"COVID Shield a besoin d'un accès Internet pour continuer de vérifier les expositions potentielles à la COVID-19.\",\"AppName\":\"COVID Shield\",\"ExternalLinkHint\":\"Ouvre dans une nouvelle fenêtre\",\"LastCheckedMinutes\":{\"One\":\"Dernière vérification il y a {number} minute\",\"Other\":\"Dernière vérification il y a {number} minutes\"},\"LastCheckedHours\":{\"One\":\"Dernière vérification il y a {number} heure\",\"Other\":\"Dernière vérification il y a {number} heures\"},\"LastCheckedDays\":{\"One\":\"Dernière vérification il y a {number} jour\",\"Other\":\"Dernière vérification il y a {number} jours\"}},\"OverlayClosed\":{\"SystemStatus\":\"COVID Shield est \",\"SystemStatusOn\":\"ACTIVÉ\",\"SystemStatusOff\":\"DÉSACTIVÉ\",\"NotificationStatus\":\"Les notifications poussées sont \",\"NotificationStatusOff\":\"DÉSACTIVÉES\",\"TapPrompt\":\"Appuyez pour plus d'information\"},\"OverlayOpen\":{\"BluetoothCardStatus\":\"Le Bluetooth est \",\"BluetoothCardStatusOff\":\"DÉSACTIVÉ\",\"BluetoothCardBody\":\"Le Bluetooth est utilisé pour collecter et partager des identifiants aléatoires nécessaires au fonctionnement de COVID Shield.\",\"BluetoothCardAction\":\"Activez le Bluetooth\",\"EnterCodeCardTitle\":\"Code COVID Shield\",\"EnterCodeCardBody\":\"Un professionel de la santé vous a-t-il demandé d'entrer un code COVID Shield?\",\"EnterCodeCardAction\":\"Entrez le code\",\"NotificationCardStatus\":\"Les notifications poussées sont \",\"NotificationCardStatusOff\":\"DÉSACTIVÉES\",\"NotificationCardBody\":\"Vous ne recevrez pas de notifications poussées si vous avez possiblement été exposé(e) à la COVID-19. Les notifications spontanées sont importantes pour aider à ralentir la transmission de la COVID-19.\",\"NotificationCardAction\":\"Activez les notifications poussées\",\"ExposureNotificationCardStatus\":\"Les notifications d'exposition à la COVID-19 sont \",\"ExposureNotificationCardStatusOff\":\"DÉSACTIVÉES\",\"ExposureNotificationCardBody\":\"Les notifications d'exposition à la COVID-19 sont nécessaires au fonctionnement de COVID Shield.\",\"ExposureNotificationCardAction\":\"Activez les notifications d'exposition\"},\"Info\":{\"CheckSymptoms\":\"Vérifier vos symptômes\",\"SymptomsUrl\":\"https://ca.thrive.health/covid19/fr\",\"TellAFriend\":\"Partager l'application\",\"LearnMore\":\"Comment fonctionne COVID Shield\",\"ChangeLanguage\":\"Changer de langue\",\"Privacy\":\"Lire la politique de confidentialité\"},\"LanguageSelect\":{\"Title\":\"Langue\",\"En\":\"English (Canada)\",\"Fr\":\"Français (Canada)\",\"PtBR\":\"Portugais (Brésil)\",\"EnShort\":\"English\",\"FrShort\":\"Français\",\"PtBRShort\":\"Portugais (Brésil)\",\"Close\":\"Retour\"},\"Tutorial\":{\"step-1Title\":\"Comment fonctionne COVID Shield\",\"step-1\":\"Votre téléphone utilise la fonction Bluetooth pour collecter et partager des identifiants aléatoires avec d'autres téléphones à proximité qui ont l'application COVID Shield. Ces identifiants sont conservés en toute sécurité sur chaque téléphone.\",\"step-2Title\":\"Si vous avez potentiellement été exposé(e) à la COVID-19\",\"step-2\":\"Vous recevrez une notification si, au cours des 14 derniers jours, vous avez été à proximité d'une personne ayant reçu un résultat de test positif à la COVID-19.\",\"step-3Title\":\"Si vous recevez un résultat de test positif à la COVID-19\",\"step-3\":\"Avisez anonymement ceux qui ont été à proximité de vous au cours des 14 derniers jours qu'ils ont possiblement été exposés à la COVID-19.\",\"ActionBack\":\"Précédent\",\"ActionNext\":\"Suivant\",\"ActionEnd\":\"Terminé\",\"Close\":\"Fermer\"},\"Sharing\":{\"Title\":\"Partager l'application\",\"SubTitle\":\"Chaque personne utilisant COVID Shield aide à ralentir la transmission de la COVID-19. Partager cette application ne partage aucune donnée privée.\",\"Platform-messages\":\"Partager avec Messages\",\"Platform-instagram\":\"Partager avec Instagram\",\"More\":\"Plus d'applications\",\"Message\":\"Joignez-vous à moi pour aider à ralentir la transmission de la COVID-19. Téléchargez l'application COVID Shield : https://covidshield.app\",\"Close\":\"Fermer\"},\"Onboarding\":{\"ActionNext\":\"Suivant\",\"ActionEnd\":\"Terminé\",\"ActionBack\":\"Précédent\"},\"OnboardingPermissions\":{\"Title\":\"Vos données sont privées\",\"Body\":\"COVID Shield priorise la confidentialité lors d'envois de notifications d'exposition à la COVID-19.\",\"Body2\":\"Vos identifiants aléatoires sont conservés sur votre téléphone exclusivement, à moins que vous décidiez de les partager.\",\"Body3\":\"L'utilisation de COVID Shield se fait sur une base volontaire. Vous pouvez supprimer vos identifiants aléatoires à tout moment.\"},\"OnboardingStart\":{\"Title\":\"Protégez-vous, protégez les autres\",\"Body1\":\"Recevez une notification si vous avez potentiellement été exposé(e) à la COVID-19.\",\"Body2\":\"Si vous recevez un résultat de test positif à la COVID-19, vous pouvez choisir de partager vos données de façon anonyme pour aviser ceux qui ont possiblement été exposés.\",\"TutorialAction\":\"Découvrez comment COVID Shield fonctionne\"},\"Privacy\":{\"Title\":\"Politique de confidentialité\",\"Close\":\"Fermer\"},\"ThankYou\":{\"Title\":\"Merci d'aider\",\"Body\":\"Les notifications d’exposition sont activées. Si COVID Shield détecte que vous avez possiblement été exposé(e) à la COVID-19, vous recevrez une notification.\",\"Dismiss\":\"OK\"},\"DataUpload\":{\"Cancel\":\"Annuler\",\"FormIntro\":\"Entrez votre code COVID Shield à 8 chiffres.\",\"Action\":\"Soumettre le code\",\"InfoSmall\":\"Vos identifiants aléatoires ne seront pas partagés, à moins que vous donniez votre permission à l'étape suivante.\",\"ConsentTitle\":\"Partagez vos identifiants aléatoires\",\"ConsentBody\":\"Un professionnel de la santé vous a autorisé à partager les identifiants aléatoires conservés sur votre téléphone.\",\"ConsentBody2\":\"Si vous partagez vos identifiants aléatoires, ceux qui ont été à proximité de vous au cours des 14 derniers jours avec l'application COVID Shield recevront une notification les avisant qu'ils ont possiblement été exposés à la COVID-19. Cette notification ne contiendra aucune information vous concernant.\",\"ConsentBody3\":\"Vous recevrez une notification par jour lorsque de nouveaux identifiants aléatoires pourront être partagés. Vous devrez chaque fois donner votre autorisation pour que les identifiants aléatoires soient partagés. Le partage est volontaire.\",\"PrivacyPolicyLink\":\"Voir la politique de confidentialité\",\"ConsentAction\":\"J'accepte\",\"ShareToast\":\"Identifiants aléatoires partagés avec succès\",\"ErrorTitle\":\"Code non reconnu\",\"ErrorBody\":\"Votre code COVID Shield n'a pas pu être reconnu. Essayez de nouveau.\",\"ErrorAction\":\"OK\"},\"Notification\":{\"ExposedMessageTitle\":\"Vous avez possiblement été exposé(e)\",\"ExposedMessageBody\":\"Selon vos identifiants aléatoires, au cours des 14 derniers jours, vous avez été à proximité d'une personne ayant reçu un résultat de test positif à la COVID-19.\",\"OffMessageTitle\":\"COVID Shield est désactivé\",\"OffMessageBody\":\"Activez COVID Shield pour recevoir une notification si vous avez potentiellement été exposé(e) à la COVID-19.\",\"DailyUploadNotificationTitle\":\"Partagez vos nouveaux identifiants aléatoires\",\"DailyUploadNotificationBody\":\"Partager vos données aide les autres à savoir s'ils ont possiblement été exposés à la COVID-19.\"},\"Partners\":{\"Label\":\"Conçu en partenariat avec\"},\"BottomSheet\":{\"Collapse\":\"Fermer\"}},\"pt-BR\":{\"Home\":{\"NoExposureDetected\":\"Nenhuma exposição detectada\",\"NoExposureDetectedDetailed\":\"Com base em seus IDs aleatórios, você não esteve perto de alguém nos últimos 14 dias que testou positivo para COVID-19.\",\"ExposureDetected\":\"Você possivelmente foi exposto ao COVID-19\",\"ExposureDetectedDetailed\":\"Com base nos seus IDs aleatórios, você esteve perto de alguém nos últimos 14 dias que testou positivo para COVID-19.\",\"SeeGuidance\":\"Leia a orientação do Canadá sobre COVID-19\",\"GuidanceUrl\":\"https://www.canada.ca/en/public-health/services/publications/diseases-conditions/covid-19-how-to-isolate-at-home.html\",\"SignalDataShared\":\"Obrigado por ajudar a diminuir a propagação\",\"SignalDataSharedDetailed\":{\"One\":\"Você receberá uma notificação solicitando que compartilhe seus IDs aleatórios todos os dias pelo próximo {number} dia.\",\"Other\":\"Você receberá uma notificação solicitando que compartilhe seus IDs aleatórios todos os dias pelos próximos {number} dias.\"},\"SignalDataSharedCTA\":\"Acompanhe seus sintomas\",\"SymptomTrackerUrl\":\"https://ca.thrive.health/covid19app/action/88a5e9a7-db9e-487b-bc87-ce35035f8e5c?from=/home&navigateTo=/tracker/complete\",\"DailyShare\":\"Compartilhe seus novos IDs aleatórios\",\"DailyShareDetailed\":\"Compartilhar seus dados ajuda outras pessoas a saber se elas foram expostas ao COVID-19.\",\"ShareRandomIDsCTA\":\"Compartilhe seus IDs aleatórios\",\"BluetoothDisabled\":\"Bluetooth desligado\",\"EnableBluetoothCTA\":\"O Bluetooth é usado para coletar e compartilhar IDs aleatórios necessários para o COVID Shield funcionar.\",\"TurnOnBluetooth\":\"Ligar o Bluetooth\",\"ExposureNotificationsDisabled\":\"As notificações de exposição estão desligadas\",\"ExposureNotificationsDisabledDetailed\":\"São necessárias notificações de exposição para que o COVID Shield funcione.\",\"EnableExposureNotificationsCTA\":\"Ligar notificações de exposição\",\"NoConnectivity\":\"Sem conexão à internet\",\"NoConnectivityDetailed\":\"O COVID Shield precisa de acesso à Internet para continuar verificando à potenciais exposições.\",\"AppName\":\"COVID Shield\",\"ExternalLinkHint\":\"Opens in a new window\",\"LastCheckedMinutes\":{\"One\":\"Última verificação há {number} minuto\",\"Other\":\"Última verificação há {number} minutos\"},\"LastCheckedHours\":{\"One\":\"Última verificação há {number} hora\",\"Other\":\"Última verificação há {number} horas\"},\"LastCheckedDays\":{\"One\":\"Última verificação há {number} dia\",\"Other\":\"Última verificação há {number} dias\"}},\"OverlayClosed\":{\"SystemStatus\":\"COVID Shield está \",\"SystemStatusOn\":\"LIGADO\",\"SystemStatusOff\":\"DESLIGADO\",\"NotificationStatus\":\"As notificações estão \",\"NotificationStatusOff\":\"DESLIGADAS\",\"TapPrompt\":\"Toque para mais informações\"},\"OverlayOpen\":{\"BluetoothCardStatus\":\"Bluetooth está \",\"BluetoothCardStatusOff\":\"DESLIGADO\",\"BluetoothCardBody\":\"O Bluetooth é usado para coletar e compartilhar IDs aleatórios necessários para o COVID Shield funcionar.\",\"BluetoothCardAction\":\"Ligar o Bluetooth\",\"EnterCodeCardTitle\":\"Código do COVID Shield\",\"EnterCodeCardBody\":\"Um profissional de saúde pediu para você inserir um código COVID Shield?\",\"EnterCodeCardAction\":\"Insira o código\",\"NotificationCardStatus\":\"As notificações estão \",\"NotificationCardStatusOff\":\"DESLIGADAS\",\"NotificationCardBody\":\"Você não receberá notificações se tiver sido exposto ao COVID-19. A notificação de potencial exposição é importante para ajudar a diminuir a propagação do COVID-19.\",\"NotificationCardAction\":\"Ligar notificações\",\"ExposureNotificationCardStatus\":\"As notificações de exposição estão \",\"ExposureNotificationCardStatusOff\":\"DESLIGADAS\",\"ExposureNotificationCardBody\":\"São necessárias notificações de exposição para que o COVID Shield funcione.\",\"ExposureNotificationCardAction\":\"Ligar notificações de exposição\"},\"Info\":{\"CheckSymptoms\":\"Verifique os sintomas\",\"SymptomsUrl\":\"https://ca.thrive.health/covid19/en\",\"TellAFriend\":\"Compartilhe o aplicativo\",\"LearnMore\":\"Como o COVID Shield funciona\",\"ChangeLanguage\":\"Mudar idioma\",\"Privacy\":\"Leia a política de privacidade\"},\"LanguageSelect\":{\"Title\":\"Idioma\",\"En\":\"Inglês (Canadá)\",\"Fr\":\"Francês (Canadá)\",\"PtBR\":\"Português (Brasil)\",\"EnShort\":\"Inglês\",\"FrShort\":\"Francês\",\"PtBRShort\":\"Português (Brasil)\",\"Close\":\"Voltar\"},\"Tutorial\":{\"step-1Title\":\"Como o COVID Shield funciona\",\"step-1\":\"Seu telefone usa o Bluetooth para coletar e compartilhar IDs aleatórios com telefones próximos a você com o COVID Shield instalado. Esses IDs são armazenados com segurança em cada telefone.\",\"step-2Title\":\"Se você foi potencialmente exposto ao COVID-19\",\"step-2\":\"Você receberá uma notificação se esteve próximo de alguém nos últimos 14 dias que testou positivo para COVID-19.\",\"step-3Title\":\"Se você testar positivo para COVID-19\",\"step-3\":\"Notifique anonimamente as pessoas que estiveram perto de você nos últimos 14 dias de que elas possivelmente foram expostas.\",\"ActionBack\":\"Voltar\",\"ActionNext\":\"Próximo\",\"ActionEnd\":\"Concluir\",\"Close\":\"Fechar\"},\"Sharing\":{\"Title\":\"Compartilhe o aplicativo\",\"SubTitle\":\"Todas as pessoas que usam o COVID Shield ajudam a diminuir a propagação do COVID-19. Compartilhando este aplicativo não compartilhará dados pessoais.\",\"Platform-messages\":\"Compartilhar em Mensagens\",\"Platform-instagram\":\"Compartilhar no Instagram\",\"More\":\"Mais aplicativos\",\"Message\":\"Junte-se a mim e ajude a diminuir a propagação do COVID-19. Baixe o aplicativo COVID Shield: https://covidshield.app\",\"Close\":\"Fechar\"},\"Onboarding\":{\"ActionNext\":\"Próximo\",\"ActionEnd\":\"Concluir\",\"ActionBack\":\"Voltar\"},\"OnboardingPermissions\":{\"Title\":\"Seus dados são privados\",\"Body\":\"O COVID Shield adota uma abordagem de privacidade em primeiro lugar na notificação de exposição.\",\"Body2\":\"Seus IDs aleatórios são armazenados exclusivamente em seu telefone, a menos que você os compartilhe.\",\"Body3\":\"O uso do COVID Shield é voluntário. Você pode excluir seus IDs aleatórios a qualquer momento.\"},\"OnboardingStart\":{\"Title\":\"Mantenha você e os outros seguros\",\"Body1\":\"Seja notificado se você foi potencialmente exposto ao COVID-19.\",\"Body2\":\"Se você testar positivo para COVID-19, poderá compartilhar seus dados anonimamente para que outras pessoas possam ser notificadas sobre uma possível exposição.\",\"TutorialAction\":\"Saiba como o COVID Shield funciona\"},\"Privacy\":{\"Title\":\"Política de privacidade\",\"Close\":\"Fechar\"},\"ThankYou\":{\"Title\":\"Obrigado por ajudar\",\"Body\":\"As notificações de exposição estão ativadas. Você receberá uma notificação se o COVID Shield detectar que você foi exposto ao COVID-19.\",\"Dismiss\":\"Dispensar\"},\"DataUpload\":{\"Cancel\":\"Cancelar\",\"FormIntro\":\"Digite seu código COVID Shield de 8 dígitos.\",\"Action\":\"Enviar código\",\"InfoSmall\":\"Seus IDs aleatórios não serão compartilhados, a menos que você permita na próxima etapa.\",\"ConsentTitle\":\"Compartilhe seus IDs aleatórios\",\"ConsentBody\":\"Você recebeu acesso de um profissional de saúde para compartilhar os IDs aleatórios armazenados no seu telefone.\",\"ConsentBody2\":\"Se você compartilhar seus IDs aleatórios, outras pessoas com a COVID Shield que estiveram perto de você nos últimos 14 dias receberão uma notificação de que elas possivelmente foram expostas. Esta notificação não incluirá nenhuma informação sobre você.\",\"ConsentBody3\":\"Você será notificado uma vez por dia quando novos IDs aleatórios estiverem disponíveis para serem compartilhados. Você deve conceder permissão cada vez para que os IDs aleatórios sejam compartilhados. Compartilhar é voluntário.\",\"PrivacyPolicyLink\":\"Ver política de privacidade\",\"ConsentAction\":\"Concordo\",\"ShareToast\":\"IDs aleatórios compartilhados com sucesso\",\"ErrorTitle\":\"Código não reconhecido\",\"ErrorBody\":\"Não foi possível reconhecer seu código COVID Shield. Por favor, tente novamente.\",\"ErrorAction\":\"OK\"},\"Notification\":{\"ExposedMessageTitle\":\"Você possivelmente foi exposto ao COVID-19\",\"ExposedMessageBody\":\"Com base nos seus IDs aleatórios, você esteve perto de alguém nos últimos 14 dias que testou positivo para COVID-19.\",\"OffMessageTitle\":\"O COVID Shield está desligado\",\"OffMessageBody\":\"Ligue o COVID Shield para ser notificado se você tiver sido potencialmente exposto ao COVID-19.\",\"DailyUploadNotificationTitle\":\"Compartilhe seus novos IDs aleatórios\",\"DailyUploadNotificationBody\":\"Compartilhar seus dados ajuda outras pessoas a saber se elas foram expostas ao COVID-19.\"},\"Partners\":{\"Label\":\"Desenvolvido em parceria com\"},\"BottomSheet\":{\"Collapse\":\"Ocultar\"}}}") \ No newline at end of file diff --git a/src/locale/translations/pt-BR.json b/src/locale/translations/pt-BR.json new file mode 100644 index 00000000..f8cf57f0 --- /dev/null +++ b/src/locale/translations/pt-BR.json @@ -0,0 +1,161 @@ +{ + "Home": { + "NoExposureDetected": "Nenhuma exposição detectada", + "NoExposureDetectedDetailed": "Com base em seus IDs aleatórios, você não esteve perto de alguém nos últimos 14 dias que testou positivo para COVID-19.", + "ExposureDetected": "Você possivelmente foi exposto ao COVID-19", + "ExposureDetectedDetailed": "Com base nos seus IDs aleatórios, você esteve perto de alguém nos últimos 14 dias que testou positivo para COVID-19.", + "SeeGuidance": "Leia a orientação do Canadá sobre COVID-19", + "GuidanceUrl": "https://www.canada.ca/en/public-health/services/publications/diseases-conditions/covid-19-how-to-isolate-at-home.html", + "SignalDataShared": "Obrigado por ajudar a diminuir a propagação", + "SignalDataSharedDetailed": { + "One": "Você receberá uma notificação solicitando que compartilhe seus IDs aleatórios todos os dias pelo próximo {number} dia.", + "Other": "Você receberá uma notificação solicitando que compartilhe seus IDs aleatórios todos os dias pelos próximos {number} dias." + }, + "SignalDataSharedCTA": "Acompanhe seus sintomas", + "SymptomTrackerUrl": "https://ca.thrive.health/covid19app/action/88a5e9a7-db9e-487b-bc87-ce35035f8e5c?from=/home&navigateTo=/tracker/complete", + "DailyShare": "Compartilhe seus novos IDs aleatórios", + "DailyShareDetailed": "Compartilhar seus dados ajuda outras pessoas a saber se elas foram expostas ao COVID-19.", + "ShareRandomIDsCTA": "Compartilhe seus IDs aleatórios", + "BluetoothDisabled": "Bluetooth desligado", + "EnableBluetoothCTA": "O Bluetooth é usado para coletar e compartilhar IDs aleatórios necessários para o COVID Shield funcionar.", + "TurnOnBluetooth": "Ligar o Bluetooth", + "ExposureNotificationsDisabled": "As notificações de exposição estão desligadas", + "ExposureNotificationsDisabledDetailed": "São necessárias notificações de exposição para que o COVID Shield funcione.", + "EnableExposureNotificationsCTA": "Ligar notificações de exposição", + "NoConnectivity": "Sem conexão à internet", + "NoConnectivityDetailed": "O COVID Shield precisa de acesso à Internet para continuar verificando à potenciais exposições.", + "AppName": "COVID Shield", + "LastCheckedMinutes": { + "One": "Última verificação há {number} minuto", + "Other": "Última verificação há {number} minutos" + }, + "LastCheckedHours": { + "One": "Última verificação há {number} hora", + "Other": "Última verificação há {number} horas" + }, + "LastCheckedDays": { + "One": "Última verificação há {number} dia", + "Other": "Última verificação há {number} dias" + } + }, + "OverlayClosed": { + "SystemStatus": "COVID Shield está ", + "SystemStatusOn": "LIGADO", + "SystemStatusOff": "DESLIGADO", + "NotificationStatus": "As notificações estão ", + "NotificationStatusOff": "DESLIGADAS", + "TapPrompt": "Toque para mais informações" + }, + "OverlayOpen": { + "BluetoothCardStatus": "Bluetooth está ", + "BluetoothCardStatusOff": "DESLIGADO", + "BluetoothCardBody": "O Bluetooth é usado para coletar e compartilhar IDs aleatórios necessários para o COVID Shield funcionar.", + "BluetoothCardAction": "Ligar o Bluetooth", + "EnterCodeCardTitle": "Código do COVID Shield", + "EnterCodeCardBody": "Um profissional de saúde pediu para você inserir um código COVID Shield?", + "EnterCodeCardAction": "Insira o código", + "NotificationCardStatus": "As notificações estão ", + "NotificationCardStatusOff": "DESLIGADAS", + "NotificationCardBody": "Você não receberá notificações se tiver sido exposto ao COVID-19. A notificação de potencial exposição é importante para ajudar a diminuir a propagação do COVID-19.", + "NotificationCardAction": "Ligar notificações", + "ExposureNotificationCardStatus": "As notificações de exposição estão ", + "ExposureNotificationCardStatusOff": "DESLIGADAS", + "ExposureNotificationCardBody": "São necessárias notificações de exposição para que o COVID Shield funcione.", + "ExposureNotificationCardAction": "Ligar notificações de exposição" + }, + "Info": { + "CheckSymptoms": "Verifique os sintomas", + "SymptomsUrl": "https://ca.thrive.health/covid19/en", + "TellAFriend": "Compartilhe o aplicativo", + "LearnMore": "Como o COVID Shield funciona", + "ChangeLanguage": "Mudar idioma", + "Privacy": "Leia a política de privacidade" + }, + "LanguageSelect": { + "Title": "Idioma", + "En": "Inglês (Canadá)", + "Fr": "Francês (Canadá)", + "PtBR": "Português (Brasil)", + "EnShort": "Inglês", + "FrShort": "Francês", + "PtBRShort": "Português (Brasil)", + "Close": "Voltar" + }, + "Tutorial": { + "step-1Title": "Como o COVID Shield funciona", + "step-1": "Seu telefone usa o Bluetooth para coletar e compartilhar IDs aleatórios com telefones próximos a você com o COVID Shield instalado. Esses IDs são armazenados com segurança em cada telefone.", + "step-2Title": "Se você foi potencialmente exposto ao COVID-19", + "step-2": "Você receberá uma notificação se esteve próximo de alguém nos últimos 14 dias que testou positivo para COVID-19.", + "step-3Title": "Se você testar positivo para COVID-19", + "step-3": "Notifique anonimamente as pessoas que estiveram perto de você nos últimos 14 dias de que elas possivelmente foram expostas.", + "ActionBack": "Voltar", + "ActionNext": "Próximo", + "ActionEnd": "Concluir", + "Close": "Fechar" + }, + "Sharing": { + "Title": "Compartilhe o aplicativo", + "SubTitle": "Todas as pessoas que usam o COVID Shield ajudam a diminuir a propagação do COVID-19. Compartilhando este aplicativo não compartilhará dados pessoais.", + "Platform-messages": "Compartilhar em Mensagens", + "Platform-instagram": "Compartilhar no Instagram", + "More": "Mais aplicativos", + "Message": "Junte-se a mim e ajude a diminuir a propagação do COVID-19. Baixe o aplicativo COVID Shield: https://covidshield.app", + "Close": "Fechar" + }, + "Onboarding": { + "ActionNext": "Próximo", + "ActionEnd": "Concluir", + "ActionBack": "Voltar" + }, + "OnboardingPermissions": { + "Title": "Seus dados são privados", + "Body": "O COVID Shield adota uma abordagem de privacidade em primeiro lugar na notificação de exposição.", + "Body2": "Seus IDs aleatórios são armazenados exclusivamente em seu telefone, a menos que você os compartilhe.", + "Body3": "O uso do COVID Shield é voluntário. Você pode excluir seus IDs aleatórios a qualquer momento." + }, + "OnboardingStart": { + "Title": "Mantenha você e os outros seguros", + "Body1": "Seja notificado se você foi potencialmente exposto ao COVID-19.", + "Body2": "Se você testar positivo para COVID-19, poderá compartilhar seus dados anonimamente para que outras pessoas possam ser notificadas sobre uma possível exposição.", + "TutorialAction": "Saiba como o COVID Shield funciona" + }, + "Privacy": { + "Title": "Política de privacidade", + "Close": "Fechar" + }, + "ThankYou": { + "Title": "Obrigado por ajudar", + "Body": "As notificações de exposição estão ativadas. Você receberá uma notificação se o COVID Shield detectar que você foi exposto ao COVID-19.", + "Dismiss": "Dispensar" + }, + "DataUpload": { + "Cancel": "Cancelar", + "FormIntro": "Digite seu código COVID Shield de 8 dígitos.", + "Action": "Enviar código", + "InfoSmall": "Seus IDs aleatórios não serão compartilhados, a menos que você permita na próxima etapa.", + "ConsentTitle": "Compartilhe seus IDs aleatórios", + "ConsentBody": "Você recebeu acesso de um profissional de saúde para compartilhar os IDs aleatórios armazenados no seu telefone.", + "ConsentBody2": "Se você compartilhar seus IDs aleatórios, outras pessoas com a COVID Shield que estiveram perto de você nos últimos 14 dias receberão uma notificação de que elas possivelmente foram expostas. Esta notificação não incluirá nenhuma informação sobre você.", + "ConsentBody3": "Você será notificado uma vez por dia quando novos IDs aleatórios estiverem disponíveis para serem compartilhados. Você deve conceder permissão cada vez para que os IDs aleatórios sejam compartilhados. Compartilhar é voluntário.", + "PrivacyPolicyLink": "Ver política de privacidade", + "ConsentAction": "Concordo", + "ShareToast": "IDs aleatórios compartilhados com sucesso", + "ErrorTitle": "Código não reconhecido", + "ErrorBody": "Não foi possível reconhecer seu código COVID Shield. Por favor, tente novamente.", + "ErrorAction": "OK" + }, + "Notification": { + "ExposedMessageTitle": "Você possivelmente foi exposto ao COVID-19", + "ExposedMessageBody": "Com base nos seus IDs aleatórios, você esteve perto de alguém nos últimos 14 dias que testou positivo para COVID-19.", + "OffMessageTitle": "O COVID Shield está desligado", + "OffMessageBody": "Ligue o COVID Shield para ser notificado se você tiver sido potencialmente exposto ao COVID-19.", + "DailyUploadNotificationTitle": "Compartilhe seus novos IDs aleatórios", + "DailyUploadNotificationBody": "Compartilhar seus dados ajuda outras pessoas a saber se elas foram expostas ao COVID-19." + }, + "Partners": { + "Label": "Desenvolvido em parceria com" + }, + "BottomSheet": { + "Collapse": "Ocultar" + } +} diff --git a/src/testMode/MockProvider.tsx b/src/testMode/MockProvider.tsx index f138aaeb..cb82fd48 100644 --- a/src/testMode/MockProvider.tsx +++ b/src/testMode/MockProvider.tsx @@ -1,5 +1,6 @@ import React, {useContext, useMemo, useState} from 'react'; import {ExposureNotificationServiceProvider} from 'services/ExposureNotificationService'; +import {MOCK_SERVER} from 'env'; import {MockExposureNotification} from './MockExposureNotification'; import MockBackend from './MockBackend'; @@ -18,8 +19,7 @@ export interface MockProviderProps { } export const MockProvider = ({children}: MockProviderProps) => { - // Note: set this to false if doesn't want to turn on mock server by default - const [enabled, setEnabled] = useState(true); + const [enabled, setEnabled] = useState(MOCK_SERVER); const mockBackend = useMemo(() => new MockBackend(), []); const mockExposureNotification = useMemo(() => new MockExposureNotification(), []); diff --git a/src/testMode/views/Item.tsx b/src/testMode/views/Item.tsx index b124c9d6..87726fd4 100644 --- a/src/testMode/views/Item.tsx +++ b/src/testMode/views/Item.tsx @@ -20,21 +20,26 @@ export const Item = ({title, subtitle, onPress, connectedRight}: ItemProps) => { ) : ( connectedRight ); - return ( - - - - - {title} + + const content = ( + + + + {title} + + {subtitle && ( + + {subtitle} - {subtitle && ( - - {subtitle} - - )} - - {connectedRightElement} + )} - + {connectedRightElement} + ); + + if (!onPress) { + return content; + } + + return {content}; }; diff --git a/translations.js b/translations.js index f7a11681..af178ee6 100644 --- a/translations.js +++ b/translations.js @@ -1,4 +1,4 @@ // generate-translations.js const {generateTranslationDictionaries} = require('@shopify/react-i18n/generate-dictionaries'); -generateTranslationDictionaries(['en', 'fr']); +generateTranslationDictionaries(['en', 'fr', 'pt-BR']);