Attention une mise à jour du service Gitlab va être effectuée le mardi 18 janvier (et non lundi 17 comme annoncé précédemment) entre 18h00 et 18h30. Cette mise à jour va générer une interruption du service dont nous ne maîtrisons pas complètement la durée mais qui ne devrait pas excéder quelques minutes.

Commit 50e7b4a9 authored by stopcovid@lunabee.com's avatar stopcovid@lunabee.com
Browse files

Update to 2.1.7

- Feature flag on attestations
- Key figures explanation screen
- Prevent using Proximity after reporting sick
- Cosmetic improvement
- Inverse attestation sorting
- Attestation "sport_animaux" is only valid for one hour
parent ae5456be
......@@ -553,6 +553,25 @@ class SecureKeystoreDataSource(context: Context, private val cryptoManager: Loca
}
}
override var displayAttestation: Boolean?
get() {
val encryptedText = sharedPreferences.getString(SHARED_PREF_KEY_DISPLAY_ATTESTATION, null)
return if (encryptedText != null) {
cryptoManager.decryptToString(encryptedText).toBoolean()
} else {
null
}
}
set(value) {
if (value != null) {
sharedPreferences.edit()
.putString(SHARED_PREF_KEY_DISPLAY_ATTESTATION, cryptoManager.encryptToString(value.toString()))
.apply()
} else {
sharedPreferences.edit().remove(SHARED_PREF_KEY_DISPLAY_ATTESTATION).apply()
}
}
override var qrCodeDeletionHours: Float?
get() {
val encryptedText = sharedPreferences.getString(SHARED_PREF_KEY_QR_CODE_DELETION_HOURS, null)
......@@ -747,6 +766,18 @@ class SecureKeystoreDataSource(context: Context, private val cryptoManager: Loca
}
}
override var reportDate: Long?
get() = sharedPreferences.getLong(SHARED_PREF_KEY_REPORT_DATE, Long.MIN_VALUE).takeIf { it != Long.MIN_VALUE }
set(value) {
if (value != null) {
sharedPreferences.edit()
.putLong(SHARED_PREF_KEY_REPORT_DATE, value)
.apply()
} else {
sharedPreferences.edit().remove(SHARED_PREF_KEY_REPORT_DATE).apply()
}
}
companion object {
private const val SHARED_PREF_NAME = "robert_prefs"
private const val SHARED_PREF_KEY_SHOULD_RELOAD_BLE_SETTINGS = "shared.pref.should_reload_ble_settings"
......@@ -776,6 +807,7 @@ class SecureKeystoreDataSource(context: Context, private val cryptoManager: Loca
private const val SHARED_PREF_KEY_POSITIVE_SAMPLE_SPAN = "shared.pref.positive_sample_span"
private const val SHARED_PREF_KEY_APP_AVAILABILITY = "shared.pref.app_availability"
private const val SHARED_PREF_KEY_API_VERSION = "shared.pref.api_version"
private const val SHARED_PREF_KEY_DISPLAY_ATTESTATION = "shared.pref.display_attestation"
private const val SHARED_PREF_KEY_QR_CODE_DELETION_HOURS = "shared.pref.qr_code_deletion_hours"
private const val SHARED_PREF_KEY_QR_CODE_EXPIRED_HOURS = "shared.pref.qr_code_expired_hours"
private const val SHARED_PREF_KEY_QR_CODE_FORMATTED_STRING = "shared.pref.qr_code_formatted_string"
......@@ -787,5 +819,6 @@ class SecureKeystoreDataSource(context: Context, private val cryptoManager: Loca
private const val SHARED_PREF_KEY_ATTESTATIONS = "shared.pref.attestations"
private const val SHARED_PREF_KEY_CONFIG_VERSION = "shared.pref.config_version"
private const val SHARED_PREF_KEY_DISPLAY_DEPARTMENT_LEVEL = "shared.pref.display_department_level"
private const val SHARED_PREF_KEY_REPORT_DATE = "shared.pref.report_date"
}
}
......@@ -37,10 +37,12 @@ object RobertConstant {
const val QR_CODE_FORMATTED_STRING: String = "Cree le: <creationDate> a <creationHour>;\nNom: <lastname>;\nPrenom: <firstname>;\nNaissance: <dob> a <cityofbirth>;\nAdresse: <address> <zip> <city>;\nSortie: <datetime-day> a <datetime-hour>;\nMotif: <reason-code>"
const val QR_CODE_FORMATTED_STRING_DISPLAYED: String = "Créé le <creationDate> à <creationHour>\nNom : <lastname>\nPrénom : <firstname>\nNaissance : <dob> à <cityofbirth>\nAdresse : <address> <zip> <city>\nSortie : <datetime-day> à <datetime-hour>\nMotif: <reason-code>"
const val QR_CODE_FOOTER_STRING: String = "<firstname> - <datetime-day>, <datetime-hour>\n<reason-shortlabel>"
const val REGISTER_DELAY_MONTH: Int = 2
object CONFIG {
const val CONFIG_VERSION: String = "version"
const val API_VERSION: String = "app.apiVersion"
const val DISPLAY_ATTESTATION: String = "app.displayAttestation"
const val DATA_RETENTION_PERIOD: String = "app.dataRetentionPeriod"
const val QUARANTINE_PERIOD: String = "app.quarantinePeriod"
const val CHECK_STATUS_FREQUENCY: String = "app.checkStatusFrequency"
......
......@@ -23,6 +23,8 @@ import com.lunabeestudio.robert.utils.Event
interface RobertManager {
var shouldReloadBleSettings: Boolean
val canActivateProximity: Boolean
val isRegistered: Boolean
val isProximityActive: Boolean
......@@ -63,6 +65,8 @@ interface RobertManager {
val apiVersion: String
val displayAttestation: Boolean
val qrCodeDeletionHours: Float
val qrCodeExpiredHours: Float
......
......@@ -42,6 +42,7 @@ import com.lunabeestudio.robert.model.AtRiskStatus
import com.lunabeestudio.robert.model.NoEphemeralBluetoothIdentifierFound
import com.lunabeestudio.robert.model.NoEphemeralBluetoothIdentifierFoundForEpoch
import com.lunabeestudio.robert.model.NoKeyException
import com.lunabeestudio.robert.model.ReportDelayException
import com.lunabeestudio.robert.model.RobertException
import com.lunabeestudio.robert.model.RobertResult
import com.lunabeestudio.robert.model.RobertResultData
......@@ -58,6 +59,7 @@ import kotlinx.coroutines.sync.Semaphore
import kotlinx.coroutines.sync.withPermit
import kotlinx.coroutines.withContext
import timber.log.Timber
import java.util.Calendar
import java.util.concurrent.TimeUnit
import kotlin.math.abs
import kotlin.math.min
......@@ -102,6 +104,15 @@ class RobertManagerImpl(
keystoreRepository.shouldReloadBleSettings = value
}
override val canActivateProximity: Boolean
get() = keystoreRepository.reportDate?.let { reportDate ->
val reportCalendar = Calendar.getInstance().apply {
timeInMillis = reportDate
add(Calendar.MONTH, RobertConstant.REGISTER_DELAY_MONTH)
}
System.currentTimeMillis() > reportCalendar.timeInMillis
} ?: true
override val isRegistered: Boolean
get() = keystoreRepository.kA != null && keystoreRepository.kEA != null
......@@ -165,6 +176,9 @@ class RobertManagerImpl(
override val apiVersion: String
get() = keystoreRepository.apiVersion ?: RobertConstant.API_VERSION
override val displayAttestation: Boolean
get() = keystoreRepository.displayAttestation ?: false
override val qrCodeDeletionHours: Float
get() = keystoreRepository.qrCodeDeletionHours ?: RobertConstant.QR_CODE_DELETION_HOURS
......@@ -215,11 +229,15 @@ class RobertManagerImpl(
override suspend fun generateCaptcha(type: String, local: String): RobertResultData<String> =
remoteServiceRepository.generateCaptcha(apiVersion, type, local)
override suspend fun getCaptchaImage(captchaId: String,
path: String): RobertResult = remoteServiceRepository.getCaptchaImage(apiVersion, captchaId, path)
override suspend fun getCaptchaImage(
captchaId: String,
path: String,
): RobertResult = remoteServiceRepository.getCaptchaImage(apiVersion, captchaId, path)
override suspend fun getCaptchaAudio(captchaId: String,
path: String): RobertResult = remoteServiceRepository.getCaptchaAudio(apiVersion, captchaId, path)
override suspend fun getCaptchaAudio(
captchaId: String,
path: String,
): RobertResult = remoteServiceRepository.getCaptchaAudio(apiVersion, captchaId, path)
override suspend fun registerV2(application: RobertApplication, captcha: String, captchaId: String): RobertResult {
val registerResult = remoteServiceRepository.registerV2(apiVersion, captcha, captchaId)
......@@ -346,6 +364,11 @@ class RobertManagerImpl(
}?.value as? String)?.let { apiVersion ->
keystoreRepository.apiVersion = apiVersion
}
(configuration?.firstOrNull {
it.name == RobertConstant.CONFIG.DISPLAY_ATTESTATION
}?.value as? Boolean)?.let { displayAttestation ->
keystoreRepository.displayAttestation = displayAttestation
}
(configuration?.firstOrNull {
it.name == RobertConstant.CONFIG.QR_CODE_DELETION_HOURS
}?.value as? Number)?.let { deletionHours ->
......@@ -386,23 +409,27 @@ class RobertManagerImpl(
}
override suspend fun activateProximity(application: RobertApplication, statusTried: Boolean): RobertResult {
val isHelloAvailable = ephemeralBluetoothIdentifierRepository.getForTime() != null
return when {
isHelloAvailable -> {
keystoreRepository.proximityActive = true
application.refreshProximityService()
RobertResult.Success()
}
statusTried -> {
RobertResult.Failure(NoEphemeralBluetoothIdentifierFoundForEpoch())
}
else -> {
when (val status = updateStatus(application)) {
is RobertResult.Success -> {
activateProximity(application, true)
}
is RobertResult.Failure -> {
RobertResult.Failure(status.error)
return if (!canActivateProximity) {
RobertResult.Failure(ReportDelayException())
} else {
val isHelloAvailable = ephemeralBluetoothIdentifierRepository.getForTime() != null
when {
isHelloAvailable -> {
keystoreRepository.proximityActive = true
application.refreshProximityService()
RobertResult.Success()
}
statusTried -> {
RobertResult.Failure(NoEphemeralBluetoothIdentifierFoundForEpoch())
}
else -> {
when (val status = updateStatus(application)) {
is RobertResult.Success -> {
activateProximity(application, true)
}
is RobertResult.Failure -> {
RobertResult.Failure(status.error)
}
}
}
}
......@@ -533,6 +560,11 @@ class RobertManagerImpl(
return when (result) {
is RobertResult.Success -> {
keystoreRepository.isSick = true
val reportCalendar = Calendar.getInstance().apply {
add(Calendar.DAY_OF_YEAR, -(firstSymptoms ?: positiveTest ?: 0))
}
keystoreRepository.reportDate = reportCalendar.timeInMillis
deactivateProximity(application)
result
}
else -> result
......@@ -630,6 +662,7 @@ class RobertManagerImpl(
keystoreRepository.lastExposureTimeframe = null
keystoreRepository.proximityActive = null
keystoreRepository.isSick = null
keystoreRepository.reportDate = null
}
private fun startStatusWorker(context: Context) {
......
......@@ -41,6 +41,7 @@ interface LocalKeystoreDataSource {
var positiveSampleSpan: Int?
var appAvailability: Boolean?
var apiVersion: String?
var displayAttestation: Boolean?
var configVersion: Int?
var lastRiskReceivedDate: Long?
var qrCodeDeletionHours: Float?
......@@ -54,4 +55,5 @@ interface LocalKeystoreDataSource {
var attestations: List<Map<String, FormEntry>>?
var savedAttestationData: Map<String, FormEntry>?
var saveAttestationData: Boolean?
var reportDate: Long?
}
......@@ -30,7 +30,8 @@ enum class ErrorCode {
BLE_SCANNER,
BLE_PROXIMITY_NOTIFICATION,
BLE_GATT,
TIME_NOT_ALIGNED
TIME_NOT_ALIGNED,
REPORT_DELAY
}
class UnknownException(message: String = "Unknown error occurred") :
......@@ -78,3 +79,6 @@ class BLEGattException(message: String = "An error occurs in BLE gatt") :
class TimeNotAlignedException(message: String = "Phone time not aligned with server time") :
RobertException(ErrorCode.TIME_NOT_ALIGNED, message)
class ReportDelayException(message: String = "You need to wait before you can use proximity again") :
RobertException(ErrorCode.REPORT_DELAY, message)
\ No newline at end of file
......@@ -16,7 +16,8 @@ import com.lunabeestudio.robert.datasource.LocalKeystoreDataSource
internal class KeystoreRepository(
private val keystoreDataSource: LocalKeystoreDataSource,
private val robertManager: RobertManager) {
private val robertManager: RobertManager,
) {
var shouldReloadBleSettings: Boolean
get() = keystoreDataSource.shouldReloadBleSettings ?: false
......@@ -185,6 +186,12 @@ internal class KeystoreRepository(
keystoreDataSource.apiVersion = value
}
var displayAttestation: Boolean?
get() = keystoreDataSource.displayAttestation
set(value) {
keystoreDataSource.displayAttestation = value
}
var qrCodeDeletionHours: Float?
get() = keystoreDataSource.qrCodeDeletionHours
set(value) {
......@@ -232,4 +239,10 @@ internal class KeystoreRepository(
set(value) {
keystoreDataSource.proximityReactivationReminderHours = value
}
var reportDate: Long?
get() = keystoreDataSource.reportDate
set(value) {
keystoreDataSource.reportDate = value
}
}
\ No newline at end of file
......@@ -44,8 +44,8 @@ android {
applicationId "fr.gouv.android.stopcovid"
minSdkVersion 21
targetSdkVersion 30
versionCode 94
versionName "2.1.5"
versionCode 102
versionName "2.1.7"
testInstrumentationRunner = 'com.lunabeestudio.stopcovid.TestRunner'
......@@ -54,6 +54,7 @@ android {
buildConfigField 'String', 'APP_MAINTENANCE_CERTIFICATE_SHA256', '"sha256/sXQojvwsiyblrpMQIVRXGC5u7AgknzTJm+VIK1kQmD8="'
buildConfigField 'String', 'APP_MAINTENANCE_URL', '"https://app.stopcovid.gouv.fr/maintenance/info-maintenance-v2.json"'
buildConfigField 'String', 'INFO_CENTER_FOLDER', '"InfoCenter/"'
buildConfigField 'String', 'MORE_KEY_FIGURES_FOLDER', '"MoreKeyFigures/"'
buildConfigField 'String', 'KEY_FIGURES_PATH', '"/infos/key-figures.json"'
buildConfigField 'String', 'FORM_PATH', '"/Attestations/form.json"'
buildConfigField 'String', 'APP_STORE_URL', '"https://play.google.com/store/apps/details?id=fr.gouv.android.stopcovid"'
......
[
{
"section": "Comment interpréter",
"description": "Les indicateurs doivent être interprétés avec précaution et à la lumière des activités de dépistage, du contexte sanitaire et des caractéristiques de la population (âge, densité de population, facteurs de risque...) mais aussi de la qualité des données et de leur fréquence de remontée, analysés dans leur globalité.\n\nPour plus d’information sur l’analyse de la situation sanitaire, veuillez consulter le point épidémiologique hebdomadaire de Santé publique France (SpF) disponible sur santepubliquefrance.fr",
"links": [
{
"label": "Santé publique France",
"url": "https://www.santepubliquefrance.fr/revues/beh/bulletin-epidemiologique-hebdomadaire"
}
]
},
{
"section": "La mise à jour",
"description": "Le R Effectif est calculé sur une fenêtre de 7 jours allant de J-9 à J-3. Les données sont arrêtées le mardi et publiées une fois par semaine (le jeudi). Le R Effectif est disponible au niveau national (France métropolitaine) et au niveau régional (régions métropolitaines et ultra-marines).\n\nTous les autres indicateurs sont mis à jour quotidiennement, après consolidation par SpF et le Ministère des Solidarités et de la Santé. Au niveau national, le taux d’incidence et le taux de positivité sont arrêtés à J-3 et calculés sur la moyenne des 7 derniers jours [J-9 ; J-3] afin de mieux prendre en compte leur fluctuation.\n\nLe nombre de nouveaux cas est un indicateur arrêté à J-1, donc sans le recul et la contextualisation nécessaires pour affirmer qu’il représente complètement la situation sanitaire."
}
]
[
{
"section": "Comment interpréter",
"description": "Les indicateurs doivent être interprétés avec précaution et à la lumière des activités de dépistage, du contexte sanitaire et des caractéristiques de la population (âge, densité de population, facteurs de risque...) mais aussi de la qualité des données et de leur fréquence de remontée, analysés dans leur globalité.\n\nPour plus d’information sur l’analyse de la situation sanitaire, veuillez consulter le point épidémiologique hebdomadaire de Santé publique France (SpF) disponible sur santepubliquefrance.fr",
"links": [
{
"label": "Santé publique France",
"url": "https://www.santepubliquefrance.fr/revues/beh/bulletin-epidemiologique-hebdomadaire"
}
]
},
{
"section": "La mise à jour",
"description": "Le R Effectif est calculé sur une fenêtre de 7 jours allant de J-9 à J-3. Les données sont arrêtées le mardi et publiées une fois par semaine (le jeudi). Le R Effectif est disponible au niveau national (France métropolitaine) et au niveau régional (régions métropolitaines et ultra-marines).\n\nTous les autres indicateurs sont mis à jour quotidiennement, après consolidation par SpF et le Ministère des Solidarités et de la Santé. Au niveau national, le taux d’incidence et le taux de positivité sont arrêtés à J-3 et calculés sur la moyenne des 7 derniers jours [J-9 ; J-3] afin de mieux prendre en compte leur fluctuation.\n\nLe nombre de nouveaux cas est un indicateur arrêté à J-1, donc sans le recul et la contextualisation nécessaires pour affirmer qu’il représente complètement la situation sanitaire."
}
]
......@@ -331,67 +331,61 @@
"home.healthSection.noContact.cellSubtitle": "إضغط للتعرف على المزيد",
"home.healthSection.contact.cellTitle": "تم الكشف عن التعرض لخطر",
"home.healthSection.contact.cellSubtitle": "مراجعة توصياتنا",
"keyfigure.registered.label": "صافي التسجيلات",
"keyfigure.registered.description": "عدد الأشخاص الذين قاموا بتحميل التطبيق وتفعيله منذ تاريخ 2 حزيران/يونيو 2020.",
"keyfigure.notification.label": "التبليغات التي قام بها التطبيق",
"keyfigure.notification.description": "عدد الأشخاص الذين تلقوا من التطبيق إشعارًا بتعرضهم لمرض كوفيد-19، منذ تاريخ 2 حزيران/يونيو 2020.",
"keyfigure.qrcodes.label": "عدد مرضى كوفيد-19 الذين صرحوا بأنفسهم",
"keyfigure.qrcodes.description": "عدد المستخدمين الذي صرحوا بإصابتهم بمرض كوفيد-19 في التطبيق بواسطة رمز QR المعطى مع نتائج المختبر (منذ 2 حزيران/يونيو 2020).",
"keyfigure.reffectif.label": "معدل تكاثر الفيروس",
"keyfigure.reffectif.shortLabel": "معدل تكاثر الفيروس",
"keyfigure.reffectif.description": "معدل تكاثر الفيروس: هو متوسط ​​عدد الأشخاص الذين يمكن لمريض أن يصيبهم بالعدوى. يتم تحديث هذا المؤشر بانتظام، وهو يقيس شدة انتقال الفيروس. إذا كان معدل تكاثر الفيروس أكبر من 1 فالوباء في طور النمو، وإذا كان أقل من 1 فالوباء قيد الانحصار.",
"keyfigure.tauxincidence.label": "معدل الإصابة",
"keyfigure.tauxincidence.shortLabel": "الإصابة",
"keyfigure.tauxincidence.description": "معدل الإصابة هو عدد الأشخاص الذين ثبتت إصابتهم بفيروس SARS-CoV-2 مقارنة بحجم السكان. يعبر عنه لكل 100.000 نسمة ويجعل مقارنة المناطق الجغرافية مع بعضها البعض ممكنة.",
"keyfigure.tauxpositivite.label": "معدل الإيجابية",
"keyfigure.tauxpositivite.shortLabel": "الإيجابية",
"keyfigure.tauxpositivite.description": "معدل الإيجابية هو عدد الأشخاص الذين تم اختبارهم إيجابيًا مقارنة بالعدد الإجمالي للأشخاص الذين اختبروا إيجابيًا أو سلبيًا خلال فترة معينة.",
"keyfigure.tauxoccupation.label": "معدل الإشغال",
"keyfigure.tauxoccupation.shortLabel": "الإشغال",
"keyfigure.tauxoccupation.description": "هي نسبة أسرة العناية الفائقة التي يشغلها مرضى كوفيد مقارنة بإجمالي الأسرة في السعة الأولية، أي قبل زيادة سعة أسرة العناية الفائقة في أحد المستشفيات. يقيس هذا المؤشر الضغط على قدرات المستشفى في العناية الفائقة.",
"keyfigure.nombrecas.label": "الحالات الجديدة",
"keyfigure.nombrecas.shortLabel": "الحالات الجديدة",
"keyfigure.nombrecas.description": "هو عدد الحالات الجديدة المؤكدة بفحص إيجابي خلال الساعات الـ24 الأخيرة. تكون بيانات فترة نهاية الأسبوع أقل نسبيًا بسبب تراجع الأنشطة المرتبطة بفحص الإصابات في نهاية الأسبوع.",
"keyfigure.nouveauxpatientsrea.label":"Nouveaux patients en réanimation",
"keyfigure.registered.label":"Enregistrements nets",
"keyfigure.registered.description":"Le nombre de personnes qui ont téléchargé et activé l’application depuis le 2 juin 2020.",
"keyfigure.notification.label":"Notifiés par l’application",
"keyfigure.notification.description":"Le nombre de personnes notifiées par l’application suite à une exposition à la COVID-19, depuis le 2 juin 2020.",
"keyfigure.qrcodes.label":"Cas de COVID-19 déclarés",
"keyfigure.qrcodes.description":"Le nombre d’utilisateurs qui se sont déclarés comme des cas de COVID-19 dans l’application (depuis le 2 juin 2020).",
"keyfigure.reffectif.label":"R effectif",
"keyfigure.reffectif.shortLabel":"R effectif",
"keyfigure.reffectif.description":"Le nombre de reproduction du virus : c’est le nombre moyen qu’une personne infectée peut contaminer. Actualisé régulièrement, cet indicateur mesure l’intensité de la circulation du virus. Si le R effectif est supérieur à 1, l’épidémie se développe ; s’il est inférieur à 1, l’épidémie régresse. Pour évaluer son impact sur la dynamique de l’épidémie, ce R (Reff SI-DEP) calculé à partir du nombre de cas doit être associé avec le R calculé à partir du nombre de passages aux urgences (Reff OSCOUR®), le nombre d’hospitalisation (Reff SI-VIC).",
"keyfigure.tauxincidence.label":"Taux d’incidence",
"keyfigure.tauxincidence.shortLabel":"Incidence",
"keyfigure.tauxincidence.description":"Cet indicateur correspond au nombre de nouvelles personnes testées positives (RT-PCR) rapporté à la taille de la population. Il est exprimé pour 100 000 habitants et permet de comparer des zones géographiques entre elles.",
"keyfigure.tauxpositivite.label":"Taux de positivité",
"keyfigure.tauxpositivite.shortLabel":"Positivité",
"keyfigure.tauxpositivite.description":"Le taux de positivité correspond au nombre de nouvelles personnes testées positives rapporté au nombre total de personnes testées pour la première fois sur une période donnée.",
"keyfigure.tauxoccupation.label":"Tension des réanimations",
"keyfigure.tauxoccupation.shortLabel":"Tension réa",
"keyfigure.tauxoccupation.description":"Cet indicateur reflète le niveau de tension des capacités hospitalières en réanimation. Il s’agit du nombre de patients atteints de COVID-19 actuellement en réanimation, en soins intensifs, ou en unité de surveillance continue rapportée au total des lits de réanimation en capacité initiale, c’est-à-dire avant la crise.",
"keyfigure.nombrecas.label":"Nouveaux cas",
"keyfigure.nombrecas.shortLabel":"Nouveaux cas",
"keyfigure.nombrecas.description":"Cet indicateur correspond au nombre de cas confirmés par un test positif rapportés à Santé Publique France depuis la veille. Cet indicateur est très sensible au rythme et à la qualité de remontée des données et ne reflète pas la réalité de la situation épidémiologique de la veille. Par exemple, les données rapportées en début de semaine sont souvent moins élevées en raison d'une diminution de l'activité des laboratoires le week-end.",
"keyfigure.nombrecasj3.label":"Nouveaux cas J-3",
"keyfigure.nombrecasj3.shortLabel":"Nouveaux cas à J-3",
"keyfigure.nombrecasj3.description":"Cet indicateur correspond au nombre de nouveaux cas confirmés par un test positif redistribués par date de prélèvement. L’indicateur est produit à \"J-3\" afin de reposer sur des données suffisamment consolidées, et refléter ainsi correctement la situation épidémiologique à cette date.",
"keyfigure.nouveauxpatientsrea.label":"Nouveaux patients en réanimation",
"keyfigure.nouveauxpatientsrea.shortLabel":"Nouveaux réa",
"keyfigure.nouveauxpatientsrea.description":"Il s’agit du nombre de nouveaux patients atteints de COVID-19 admis en réanimation au cours des dernières 24h.",
"keyfigure.nouveauxpatientsrea.description":"Il s'agit du nombre de nouveaux patients atteints de COVID-19 admis en réanimation, en soins intensifs, ou en unité de surveillance continue au cours des dernières 24h.",
"keyfigure.patientsrea.label":"Patients en réanimation",
"keyfigure.patientsrea.shortLabel":"Patients réa",
"keyfigure.patientsrea.shortLabel":"Patients en réa",
"keyfigure.patientsrea.description":"Il s’agit du nombre de patients atteints de COVID-19 actuellement en réanimation, en soins intensifs, ou en unité de surveillance continue.",
"keyfigure.nouveauxpatientsrea.colorCode.light":"#D95FDD",
"keyfigure.nouveauxpatientsrea.colorCode.dark":"#C712CD",
"keyfigure.patientsrea.colorCode.light":"#3393FD",
"keyfigure.patientsrea.colorCode.dark":"#2682DF",
"keyfigure.nombrecas.colorCode.light":"#8944AB",
"keyfigure.nombrecas.colorCode.dark":"#DA8FFF",
"keyfigure.nombrecasj3.colorCode.light":"#8944AB",
"keyfigure.nombrecasj3.colorCode.dark":"#DA8FFF",
"keyfigure.reffectif.colorCode.light":"#0141DD",
"keyfigure.reffectif.colorCode.dark":"#429DFF",
"keyfigure.tauxincidence.colorCode.light":"#A05A03",
"keyfigure.tauxincidence.colorCode.dark":"#FED708",
"keyfigure.tauxpositivite.colorCode.light":"#3734A3",
"keyfigure.tauxpositivite.colorCode.dark":"#7D7BFF",
"keyfigure.tauxoccupation.colorCode.light":"#0271A4",
"keyfigure.tauxoccupation.colorCode.dark":"#70D8FF",
"keyfigure.tauxpositivite.colorCode.light":"#3734A3",
"keyfigure.tauxpositivite.colorCode.dark":"#7D7BFF",
"keyfigure.tauxoccupation.colorCode.light":"#0271A4",
"keyfigure.tauxoccupation.colorCode.dark":"#70D8FF",
"keyfigure.registered.colorCode.light":"#FF2C55",
"keyfigure.registered.colorCode.dark":"#FF395F",
"keyfigure.notification.colorCode.light":"#007AFF",
"keyfigure.notification.colorCode.dark":"#0B84FF",
"keyfigure.qrcodes.colorCode.light":"#34C859",
"keyfigure.qrcodes.colorCode.dark":"#31D158",
"keyFiguresController.title": "الأرقام الأساسية",
"keyFiguresController.section.health": "الوضع الصحي",
"keyFiguresController.section.app": "تطبيق TousAntiCovid",
"keyFiguresController.title":"Chiffres clés",
"keyFiguresController.section.health":"Situation sanitaire",
"keyFiguresController.section.app":"Appli TousAntiCovid",
"common.thousandsSeparator": " ",
"home.moreSection.testingSites": "أين يمكنني إجراء الاختبار؟",
"common.justNow": "مستعجل",
......@@ -554,5 +548,12 @@
"sendHistoryController.successAlert.title": "Merci !",
"sendHistoryController.successAlert.message": "Merci de vous être déclaré via TousAntiCovid et d'avoir informé les utilisateurs qui ont été à proximité lorsque vous étiez contagieux.\n\nGrâce à vous ces utilisateurs vont pouvoir prendre les mesures nécessaires pour se protéger et protéger les autres. Merci de contribuer à la lutte contre la Covid.",
"sendHistoryController.successAlert.button.learnMore": "En savoir plus"
"sendHistoryController.successAlert.button.learnMore": "En savoir plus",
"keyFiguresExplanationsController.title": "Explication des chiffres",
"keyFiguresController.section.health.subtitle": "Appuyez sur \"lire maintenant\" pour en savoir plus sur l'interprétation de ces chiffres sanitaires, leur mise à jour ainsi que les sources utilisées.",
"keyFiguresController.section.health.button": "Lire maintenant",
"home.activation.sick.alert.title": "Informations",
"home.activation.sick.alert.message": "Vous ne pouvez pas activer le “contact tracing” pendant 2 mois après votre déclaration de positivité au COVID-19.\n\nEn effet, pendant les 2 mois suivant un test positif pour la COVID-19, vous ne serez pas considéré comme \"à risque de contamination\"."
}
{
"app.name": "TousAntiCovid",
"app.name": "TousAntiCovid",
"onboarding.welcomeController.title": "Herzlich willkommen",
"onboarding.welcomeController.mainMessage.title": "Schützen Sie Ihre Angehörigen, sich selbst und Ihre Mitmenschen falls sie\nmit COVID-19 in Kontakt waren\n\n ",
"onboarding.welcomeController.mainMessage.subtitle": "Mit TousAntiCovid leisten Sie einen Beitrag zur Bekämpfung der Epidemie, indem Sie das Ansteckungsrisiko mindern.",
......@@ -331,67 +331,61 @@
"home.healthSection.noContact.cellSubtitle": "Hier antippen, um mehr zu erfahren",
"home.healthSection.contact.cellTitle": "Es wurde ein Infektionsrisiko ermittelt",
"home.healthSection.contact.cellSubtitle": "Unsere Empfehlungen abfragen",
"keyfigure.registered.label": "Nettoerfassung",
"keyfigure.registered.description": "Die Anzahl der Personen, die die App seit dem 2. Juni 2020 heruntergeladen und aktiviert haben.",
"keyfigure.notification.label": "Von der App benachrichtigt",
"keyfigure.notification.description": "Die Anzahl der Personen, die von der App nach der Ermittlung eines COVID-19 Infektionsrisikos seit dem 2. Juni 2020 benachrichtigt wurden.",
"keyfigure.qrcodes.label": "Gemeldete COVID-19-Fälle",
"keyfigure.qrcodes.description": "Die Anzahl der Personen, die sich über die App mit dem QR-Code aus ihrem Laborbefund als Corona positiv gemeldet haben (seit dem 2. Juni 2020).",
"keyfigure.reffectif.label": "R-Wert",
"keyfigure.reffectif.shortLabel": "R-Wert",
"keyfigure.reffectif.description": "Der R-Wert, auch Basisreproduktionszahl genannt, gibt an, wie viele Menschen von einer infektiösen Person durchschnittlich angesteckt werden. Dieser regelmäßig aktualisierte Wert misst die Intensität der Viruszirkulation. Liegt der R-Wert über 1, steigt die Anzahl täglicher Neuinfektionen, liegt der R-Wert unter 1, sinkt die Anzahl täglicher Neuinfektionen.",
"keyfigure.tauxincidence.label": "Inzidenzrate",
"keyfigure.tauxincidence.shortLabel": "Inzidenz",
"keyfigure.tauxincidence.description": "Die Inzidenzrate entspricht der Anzahl der SARS-CoV-2 positiv getesteten Personen im Verhältnis zur betrachteten Bevölkerung. Dieser Wert wird für je 100.000 Einwohner errechnet und ermöglicht den Vergleich geografischer Gebiete.",
"keyfigure.tauxpositivite.label": "Positivrate",
"keyfigure.tauxpositivite.shortLabel": "Positivität",
"keyfigure.tauxpositivite.description": "Die Positivrate entspricht der Anzahl der positiv getesteten Personen im Verhältnis zur Gesamtzahl positiv oder negativ getesteter Personen über einen vorgegebenen Zeitraum.",
"keyfigure.tauxoccupation.label": "Auslastungsgrad",
"keyfigure.tauxoccupation.shortLabel": "Auslastung",
"keyfigure.tauxoccupation.description": "Es handelt sich hierbei um die Bettenauslastung mit COVID-Patienten auf Intensivstationen im Verhältnis zu einer Anfangskapazität, also bevor die Bettenkapazität auf der Intensivstation eines Krankenhauses aufgestockt wurde. Dieser Wert misst die Auslastung der Intensivbetten.",
"keyfigure.nombrecas.label": "Neuinfektionen",
"keyfigure.nombrecas.shortLabel": "Neuinfektionen",
"keyfigure.nombrecas.description": "Diese Zahl entspricht der Anzahl der mit einem positiven Testergebnis bestätigten Neuinfektionen in den letzten 24 Stunden. Die Wochenenddaten sind aufgrund weniger Wochenend-Testungen oft niedriger.",
"keyfigure.nouveauxpatientsrea.label":"Nouveaux patients en réanimation",
"keyfigure.registered.label":"Enregistrements nets",
"keyfigure.registered.description":"Le nombre de personnes qui ont téléchargé et activé l’application depuis le 2 juin 2020.",
"keyfigure.notification.label":"Notifiés par l’application",
"keyfigure.notification.description":"Le nombre de personnes notifiées par l’application suite à une exposition à la COVID-19, depuis le 2 juin 2020.",
"keyfigure.qrcodes.label":"Cas de COVID-19 déclarés",
"keyfigure.qrcodes.description":"Le nombre d’utilisateurs qui se sont déclarés comme des cas de COVID-19 dans l’application (depuis le 2 juin 2020).",
"keyfigure.reffectif.label":"R effectif",
"keyfigure.reffectif.shortLabel":"R effectif",
"keyfigure.reffectif.description":"Le nombre de reproduction du virus : c’est le nombre moyen qu’une personne infectée peut contaminer. Actualisé régulièrement, cet indicateur mesure l’intensité de la circulation du virus. Si le R effectif est supérieur à 1, l’épidémie se développe ; s’il est inférieur à 1, l’épidémie régresse. Pour évaluer son impact sur la dynamique de l’épidémie, ce R (Reff SI-DEP) calculé à partir du nombre de cas doit être associé avec le R calculé à partir du nombre de passages aux urgences (Reff OSCOUR®), le nombre d’hospitalisation (Reff SI-VIC).",
"keyfigure.tauxincidence.label":"Taux d’incidence",
"keyfigure.tauxincidence.shortLabel":"Incidence",
"keyfigure.tauxincidence.description":"Cet indicateur correspond au nombre de nouvelles personnes testées positives (RT-PCR) rapporté à la taille de la population. Il est exprimé pour 100 000 habitants et permet de comparer des zones géographiques entre elles.",
"keyfigure.tauxpositivite.label":"Taux de positivité",
"keyfigure.tauxpositivite.shortLabel":"Positivité",
"keyfigure.tauxpositivite.description":"Le taux de positivité correspond au nombre de nouvelles personnes testées positives rapporté au nombre total de personnes testées pour la première fois sur une période donnée.",
"keyfigure.tauxoccupation.label":"Tension des réanimations",
"keyfigure.tauxoccupation.shortLabel":"Tension réa",
"keyfigure.tauxoccupation.description":"Cet indicateur reflète le niveau de tension des capacités hospitalières en réanimation. Il s’agit du nombre de patients atteints de COVID-19 actuellement en réanimation, en soins intensifs, ou en unité de surveillance continue rapportée au total des lits de réanimation en capacité initiale, c’est-à-dire avant la crise.",
"keyfigure.nombrecas.label":"Nouveaux cas",
"keyfigure.nombrecas.shortLabel":"Nouveaux cas",
"keyfigure.nombrecas.description":"Cet indicateur correspond au nombre de cas confirmés par un test positif rapportés à Santé Publique France depuis la veille. Cet indicateur est très sensible au rythme et à la qualité de remontée des données et ne reflète pas la réalité de la situation épidémiologique de la veille. Par exemple, les données rapportées en début de semaine sont souvent moins élevées en raison d'une diminution de l'activité des laboratoires le week-end.",
"keyfigure.nombrecasj3.label":"Nouveaux cas J-3",
"keyfigure.nombrecasj3.shortLabel":"Nouveaux cas à J-3",
"keyfigure.nombrecasj3.description":"Cet indicateur correspond au nombre de nouveaux cas confirmés par un test positif redistribués par date de prélèvement. L’indicateur est produit à \"J-3\" afin de reposer sur des données suffisamment consolidées, et refléter ainsi correctement la situation épidémiologique à cette date.",
"keyfigure.nouveauxpatientsrea.label":"Nouveaux patients en réanimation",
"keyfigure.nouveauxpatientsrea.shortLabel":"Nouveaux réa",
"keyfigure.nouveauxpatientsrea.description":"Il s’agit du nombre de nouveaux patients atteints de COVID-19 admis en réanimation au cours des dernières 24h.",
"keyfigure.nouveauxpatientsrea.description":"Il s'agit du nombre de nouveaux patients atteints de COVID-19 admis en réanimation, en soins intensifs, ou en unité de surveillance continue au cours des dernières 24h.",
"keyfigure.patientsrea.label":"Patients en réanimation",
"keyfigure.patientsrea.shortLabel":"Patients réa",
"keyfigure.patientsrea.shortLabel":"Patients en réa",
"keyfigure.patientsrea.description":"Il s’agit du nombre de patients atteints de COVID-19 actuellement en réanimation, en soins intensifs, ou en unité de surveillance continue.",
"keyfigure.nouveauxpatientsrea.colorCode.light":"#D95FDD",
"keyfigure.nouveauxpatientsrea.colorCode.dark":"#C712CD",
"keyfigure.patientsrea.colorCode.light":"#3393FD",
"keyfigure.patientsrea.colorCode.dark":"#2682DF",
"keyfigure.nombrecas.colorCode.light":"#8944AB",
"keyfigure.nombrecas.colorCode.dark":"#DA8FFF",
"keyfigure.nombrecasj3.colorCode.light":"#8944AB",
"keyfigure.nombrecasj3.colorCode.dark":"#DA8FFF",
"keyfigure.reffectif.colorCode.light":"#0141DD",
"keyfigure.reffectif.colorCode.dark":"#429DFF",
"keyfigure.tauxincidence.colorCode.light":"#A05A03",
"keyfigure.tauxincidence.colorCode.dark":"#FED708",
"keyfigure.tauxpositivite.colorCode.light":"#3734A3",
"keyfigure.tauxpositivite.colorCode.dark":"#7D7BFF",
"keyfigure.tauxoccupation.colorCode.light":"#0271A4",
"keyfigure.tauxoccupation.colorCode.dark":"#70D8FF",
"keyfigure.tauxpositivite.colorCode.light":"#3734A3",
"keyfigure.tauxpositivite.colorCode.dark":"#7D7BFF",
"keyfigure.tauxoccupation.colorCode.light":"#0271A4",
"keyfigure.tauxoccupation.colorCode.dark":"#70D8FF",
"keyfigure.registered.colorCode.light":"#FF2C55",
"keyfigure.registered.colorCode.dark":"#FF395F",
"keyfigure.notification.colorCode.light":"#007AFF",
"keyfigure.notification.colorCode.dark":"#0B84FF",
"keyfigure.qrcodes.colorCode.light":"#34C859",
"keyfigure.qrcodes.colorCode.dark":"#31D158",
"keyFiguresController.title": "Schlüsselzahlen",
"keyFiguresController.section.health": "Gesundheitszustand",
"keyFiguresController.section.app": "TousAntiCovid-App",
"keyFiguresController.title":"Chiffres clés",