diff --git a/backend/.gitignore b/backend/.gitignore index b09bf63965..c7570ae919 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -5,7 +5,6 @@ __pycache__ *~$* staticfiles/* static/ -*.mo .env .vscode *.sqlite3 diff --git a/backend/core/locale/fr/LC_MESSAGES/django.mo b/backend/core/locale/fr/LC_MESSAGES/django.mo new file mode 100644 index 0000000000..caaa2bbfe9 Binary files /dev/null and b/backend/core/locale/fr/LC_MESSAGES/django.mo differ diff --git a/backend/core/locale/fr/LC_MESSAGES/django.po b/backend/core/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 0000000000..efb3614a55 --- /dev/null +++ b/backend/core/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,1212 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-05-29 13:18+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: admin_config.py:6 +msgid "Editor" +msgstr "Éditeur" + +#: admin_config.py:7 +msgid "Menu" +msgstr "Menu" + +#: base_models.py:10 filters.py:324 +msgid "Created at" +msgstr "Créé le" + +#: base_models.py:11 +msgid "Updated at" +msgstr "Mis à jour le" + +#: base_models.py:12 +msgid "published" +msgstr "publié" + +#: base_models.py:110 models.py:52 templates/core/action_plan_pdf.html:42 +#: templates/snippets/mp_data.html:58 templates/snippets/ri_list_nested.html:16 +msgid "Name" +msgstr "Nom" + +#: base_models.py:111 models.py:54 templates/core/action_plan_pdf.html:43 +#: templates/snippets/mp_data.html:59 templates/snippets/ra_data.html:43 +msgid "Description" +msgstr "Description" + +#: filters.py:28 filters.py:30 +msgid "Order by" +msgstr "Trier par" + +#: filters.py:121 +msgid "Search applied control..." +msgstr "Rechercher un mesure appliquée..." + +#: filters.py:137 filters.py:166 filters.py:194 filters.py:219 filters.py:251 +#: filters.py:347 filters.py:370 filters.py:398 filters.py:425 filters.py:452 +#: filters.py:479 +msgid "name" +msgstr "nom" + +#: filters.py:138 filters.py:167 filters.py:195 filters.py:220 filters.py:252 +#: filters.py:348 filters.py:371 filters.py:399 filters.py:426 filters.py:453 +#: filters.py:480 +msgid "Name (descending)" +msgstr "Nom (décroissant)" + +#: filters.py:139 filters.py:196 templates/core/action_plan_pdf.html:14 +#: templates/snippets/mp_data.html:5 +msgid "Domain" +msgstr "Domaine" + +#: filters.py:140 filters.py:197 +msgid "Domain (descending)" +msgstr "Domaine (décroissant)" + +#: filters.py:141 +msgid "reference control" +msgstr "mesure de référence" + +#: filters.py:142 +msgid "Reference control (descending)" +msgstr "Mesure de référence (décroissant)" + +#: filters.py:156 +msgid "Search domain..." +msgstr "Rechercher un domaine..." + +#: filters.py:168 filters.py:372 filters.py:400 filters.py:427 filters.py:454 +#: filters.py:481 +msgid "description" +msgstr "description" + +#: filters.py:169 filters.py:373 filters.py:401 filters.py:428 filters.py:455 +#: filters.py:482 +msgid "Description (descending)" +msgstr "Description (décroissant)" + +#: filters.py:183 +msgid "Search project..." +msgstr "Rechercher un projet..." + +#: filters.py:212 +msgid "Search threat..." +msgstr "Rechercher une menace..." + +#: filters.py:240 +msgid "Search function..." +msgstr "Rechercher une fonction..." + +#: filters.py:253 +msgid "provider" +msgstr "fournisseur" + +#: filters.py:254 +msgid "Provider (descending)" +msgstr "Fournisseur (décroissant)" + +#: filters.py:276 +msgid "Yes" +msgstr "Oui" + +#: filters.py:277 +msgid "No" +msgstr "Non" + +#: filters.py:305 +msgid "Search user..." +msgstr "Rechercher un utilisateur..." + +#: filters.py:318 +msgid "Email" +msgstr "E-mail" + +#: filters.py:319 +msgid "Email (descending)" +msgstr "E-mail (décroissant)" + +#: filters.py:320 +msgid "First name" +msgstr "Prénom" + +#: filters.py:321 +msgid "First name (descending)" +msgstr "Prénom (décroissant)" + +#: filters.py:322 +msgid "Last name" +msgstr "Nom de famille" + +#: filters.py:323 +msgid "Last name (descending)" +msgstr "Nom de famille (décroissant)" + +#: filters.py:325 +msgid "Created at (descending)" +msgstr "Créé le (décroissant)" + +#: filters.py:339 +msgid "Search user group..." +msgstr "Rechercher un groupe d'utilisateurs..." + +#: filters.py:358 +msgid "Search compliance assessment..." +msgstr "Rechercher une évaluation de conformité..." + +#: filters.py:388 +msgid "Search requirement assessment..." +msgstr "Rechercher une évaluation d'exigence..." + +#: filters.py:415 +msgid "Search requirement..." +msgstr "Rechercher une exigence..." + +#: filters.py:442 +msgid "Search evidence..." +msgstr "Rechercher une preuve..." + +#: filters.py:469 +msgid "Search framework..." +msgstr "Rechercher un référentiel..." + +#: models.py:39 models.py:93 +msgid "URN" +msgstr "URN" + +#: models.py:42 +msgid "Reference ID" +msgstr "ID de référence" + +#: models.py:45 +msgid "Locale" +msgstr "Locale" + +#: models.py:47 +msgid "Default locale" +msgstr "Locale par défaut" + +#: models.py:49 models.py:400 +msgid "Provider" +msgstr "Fournisseur" + +#: models.py:55 +msgid "Annotation" +msgstr "Annotation" + +#: models.py:95 +msgid "Copyright" +msgstr "Copyright" + +#: models.py:97 models.py:867 +msgid "Version" +msgstr "Version" + +#: models.py:102 +msgid "Packager of the library" +msgstr "Responsable de l'empaquetage de la bibliothèque" + +#: models.py:103 +msgid "Packager" +msgstr "Empaqueteur" + +#: models.py:218 +msgid "Dependencies" +msgstr "Dépendances" + +#: models.py:299 templates/snippets/ri_list_nested.html:19 +msgid "Threat" +msgstr "Menace" + +#: models.py:300 models.py:524 models.py:1255 +msgid "Threats" +msgstr "Menaces" + +#: models.py:320 models.py:838 +msgid "Policy" +msgstr "Politique" + +#: models.py:321 +msgid "Process" +msgstr "Processus" + +#: models.py:322 +msgid "Technical" +msgstr "Technique" + +#: models.py:323 +msgid "Physical" +msgstr "Physique" + +#: models.py:339 models.py:727 templates/core/action_plan_pdf.html:44 +msgid "Category" +msgstr "Catégorie" + +#: models.py:343 models.py:550 +msgid "Typical evidence" +msgstr "Preuve type" + +#: models.py:349 templates/snippets/mp_data.html:61 +msgid "Reference control" +msgstr "Mesure de référence" + +#: models.py:350 models.py:530 +msgid "Reference controls" +msgstr "Mesures de référence" + +#: models.py:385 +msgid "JSON definition" +msgstr "Définition JSON" + +#: models.py:387 +msgid "" +"JSON definition of the risk matrix. See the documentation for more " +"information." +msgstr "" +"Définition JSON de la matrice de risque. Consultez la documentation pour " +"plus d'informations." + +#: models.py:393 +msgid "enabled" +msgstr "activé" + +#: models.py:396 +msgid "" +"If the risk matrix is set as disabled, it will not be available for " +"selection for new risk assessments." +msgstr "" +"Si la matrice de risque est désactivée, elle ne sera pas disponible pour la " +"sélection lors de nouvelles évaluations de risque." + +#: models.py:458 models.py:1432 +msgid "Minimum score" +msgstr "Score minimum" + +#: models.py:459 models.py:1433 +msgid "Maximum score" +msgstr "Score maximum" + +#: models.py:461 models.py:1435 +msgid "Score definition" +msgstr "Définition du score" + +#: models.py:464 +msgid "Implementation groups definition" +msgstr "Définition des groupes de mise en œuvre" + +#: models.py:475 models.py:538 models.py:1419 +#: templates/core/action_plan_pdf.html:20 +msgid "Framework" +msgstr "Référentiel" + +#: models.py:476 +msgid "Frameworks" +msgstr "Référentiels" + +#: models.py:542 +msgid "Parent URN" +msgstr "URN parent" + +#: models.py:544 +msgid "Order ID" +msgstr "ID de commande" + +#: models.py:546 +msgid "Implementation groups" +msgstr "Groupes de mise en œuvre" + +#: models.py:548 +msgid "Assessable" +msgstr "Évaluable" + +#: models.py:554 +#, fuzzy +#| msgid "Requirement" +msgid "RequirementNode" +msgstr "Exigence" + +#: models.py:555 +#, fuzzy +#| msgid "Requirement" +msgid "RequirementNodes" +msgstr "Exigence" + +#: models.py:563 +msgid "Undefined" +msgstr "Non défini" + +#: models.py:564 +msgid "Design" +msgstr "Conception" + +#: models.py:565 +msgid "Development" +msgstr "Développement" + +#: models.py:566 +msgid "Production" +msgstr "Production" + +#: models.py:567 +msgid "EndOfLife" +msgstr "Fin de vie" + +#: models.py:568 +msgid "Dropped" +msgstr "Abandonné" + +#: models.py:571 +msgid "Internal reference" +msgstr "Référence interne" + +#: models.py:577 models.py:734 models.py:874 models.py:1717 +#: templates/snippets/mp_data.html:65 templates/snippets/ri_list_nested.html:31 +msgid "Status" +msgstr "Statut" + +#: models.py:582 models.py:860 models.py:1327 +#: templates/core/action_plan_pdf.html:16 templates/snippets/mp_data.html:7 +msgid "Project" +msgstr "Projet" + +#: models.py:583 +msgid "Projects" +msgstr "Projets" + +#: models.py:616 +msgid "Primary" +msgstr "Primaire" + +#: models.py:617 +msgid "Support" +msgstr "Support" + +#: models.py:620 +msgid "business value" +msgstr "valeur métier" + +#: models.py:623 +msgid "type" +msgstr "type" + +#: models.py:626 +msgid "parent assets" +msgstr "actifs parents" + +#: models.py:632 models.py:1242 +msgid "Assets" +msgstr "Actifs" + +#: models.py:633 +msgid "Asset" +msgstr "Actif" + +#: models.py:663 +msgid "Attachment for evidence (eg. screenshot, log file, etc.)" +msgstr "" +"Pièce jointe pour la preuve (par ex. capture d'écran, fichier journal, etc.)" + +#: models.py:664 +msgid "Attachment" +msgstr "Pièce jointe" + +#: models.py:670 +msgid "Link to the evidence (eg. Jira ticket, etc.)" +msgstr "Lien vers la preuve (par ex. billet Jira, etc.)" + +#: models.py:671 models.py:753 templates/snippets/mp_data.html:64 +msgid "Link" +msgstr "Lien" + +#: models.py:677 +msgid "Evidence" +msgstr "Preuve" + +#: models.py:678 models.py:719 models.py:1731 +msgid "Evidences" +msgstr "Preuves" + +#: models.py:694 models.py:853 +msgid "Planned" +msgstr "Planifié" + +#: models.py:695 +msgid "Active" +msgstr "Actif" + +#: models.py:696 +msgid "Inactive" +msgstr "Inactif" + +#: models.py:701 +msgid "Small" +msgstr "Petit" + +#: models.py:702 models.py:1219 tests/test_helpers.py:77 +#: tests/test_helpers.py:142 +msgid "Medium" +msgstr "Moyen" + +#: models.py:703 +msgid "Large" +msgstr "Grand" + +#: models.py:704 +msgid "Extra Large" +msgstr "Extra large" + +#: models.py:714 +msgid "Reference Control" +msgstr "Mesure de référence" + +#: models.py:739 +msgid "Estimated Time of Arrival" +msgstr "Heure d'arrivée estimée" + +#: models.py:740 models.py:894 templates/core/action_plan_pdf.html:45 +#: templates/snippets/mp_data.html:62 +msgid "ETA" +msgstr "ETA" + +#: models.py:745 +msgid "Date after which the applied control is no longer valid" +msgstr "Date à partir de laquelle la mesure appliquée n'est plus valide" + +#: models.py:746 models.py:1803 templates/core/action_plan_pdf.html:46 +msgid "Expiry date" +msgstr "Date d'expiration" + +#: models.py:752 +msgid "External url for action follow-up (eg. Jira ticket)" +msgstr "URL externe pour le suivi de l'action (par ex. billet Jira)" + +#: models.py:760 +msgid "Relative effort of the measure (using T-Shirt sizing)" +msgstr "Effort relatif de la mesure (en utilisant la taille des T-shirts)" + +#: models.py:761 templates/core/action_plan_pdf.html:47 +#: templates/snippets/mp_data.html:63 +msgid "Effort" +msgstr "Effort" + +#: models.py:767 +msgid "Applied control" +msgstr "Mesure appliqué" + +#: models.py:768 models.py:1249 models.py:1747 +msgid "Applied controls" +msgstr "Mesures appliqués" + +#: models.py:839 +msgid "Policies" +msgstr "Politiques" + +#: models.py:854 models.py:1707 +msgid "In progress" +msgstr "En cours" + +#: models.py:855 +msgid "In review" +msgstr "En examen" + +#: models.py:856 +msgid "Done" +msgstr "Terminé" + +#: models.py:857 +msgid "Deprecated" +msgstr "Déprécié" + +#: models.py:866 +msgid "Version of the compliance assessment (eg. 1.0, 2.0, etc.)" +msgstr "Version de l'évaluation de conformité (par ex. 1.0, 2.0, etc.)" + +#: models.py:881 +msgid "Authors" +msgstr "Auteurs" + +#: models.py:887 +msgid "Reviewers" +msgstr "Relecteurs" + +#: models.py:893 +#, fuzzy +#| msgid "estimated time of arrival" +msgid "Estimated time of arrival" +msgstr "heure d'arrivée estimée" + +#: models.py:899 models.py:900 +msgid "Due date" +msgstr "Date d'échéance" + +#: models.py:913 +msgid "WARNING! After choosing it, you will not be able to change it" +msgstr "" +"ATTENTION ! Une fois que vous l'aurez choisi, vous ne pourrez plus le " +"modifier." + +#: models.py:914 +msgid "Risk matrix" +msgstr "Matrice de risque" + +#: models.py:918 templates/snippets/mp_data.html:9 +#: templates/snippets/ra_data.html:8 +msgid "Risk assessment" +msgstr "Évaluation de risque" + +#: models.py:919 +msgid "Risk assessments" +msgstr "Évaluations de risque" + +#: models.py:943 +msgid "{}: Risk assessment is still in progress" +msgstr "{} : L'évaluation des risques est toujours en cours" + +#: models.py:954 +msgid "{}: No author assigned to this risk assessment" +msgstr "{} : Aucun auteur n'a été affecté à cette évaluation des risques" + +#: models.py:966 +msgid "{}: RiskAssessment is empty. No risk scenario declared yet" +msgstr "" +"{} : L'évaluation des risques est vide. Aucun scénario de risque n'a encore " +"été déclaré." + +#: models.py:987 +msgid "{} current risk level has not been assessed" +msgstr "{} : Le niveau de risque actuel n'a pas été évalué" + +#: models.py:1000 +msgid "" +"{} residual risk level has not been assessed. If no additional measures are " +"applied, it should be at the same level as the current risk" +msgstr "" +"{} : Le niveau de risque résiduel n'a pas été évalué. S'il n'y a pas de " +"mesures supplémentaires appliquées, il devrait être au même niveau que le " +"risque actuel." + +#: models.py:1011 +msgid "{} residual risk level is higher than the current one" +msgstr "{} : Le niveau de risque résiduel est supérieur à l'actuel" + +#: models.py:1023 +msgid "{} residual risk probability is higher than the current one" +msgstr "{} : La probabilité de risque résiduel est supérieure à l'actuelle" + +#: models.py:1035 +msgid "{} residual risk impact is higher than the current one" +msgstr "{} : L'impact du risque résiduel est supérieur à l'actuel" + +#: models.py:1056 +msgid "{}: residual risk level has been lowered without any specific measure" +msgstr "" +"{} : Le niveau de risque résiduel a été réduit sans aucune mesure spécifique" + +#: models.py:1070 +msgid "{} risk accepted but no risk acceptance attached" +msgstr "{} : Risque accepté mais aucune acceptation de risque jointe" + +#: models.py:1093 +msgid "{} does not have an ETA" +msgstr "{} : Pas d'ETA" + +#: models.py:1105 +msgid "{} ETA is in the past now. Consider updating its status or the date" +msgstr "" +"{} : L'ETA est dans le passé maintenant. Envisagez de mettre à jour son " +"statut ou la date." + +#: models.py:1118 +msgid "" +"{} does not have an estimated effort. This will help you for prioritization" +msgstr "{} : Pas d'effort estimé. Cela vous aidera pour la prioritisation" + +#: models.py:1131 +msgid "" +"{}: Applied control does not have an external link attached. This will help " +"you for follow-up" +msgstr "" +"{} : La mesure appliquée ne comporte pas de lien externe joint. Cela vous " +"aidera pour le suivi" + +#: models.py:1154 +msgid "{}: Acceptance has no expiry date" +msgstr "{} : L'acceptation n'a pas de date d'expiration" + +#: models.py:1168 +msgid "{}: Acceptance has expired. Consider updating the status or the date" +msgstr "" +"{} : L'acceptation a expiré. Envisagez de mettre à jour le statut ou la date." + +#: models.py:1197 +msgid "Open" +msgstr "Ouvert" + +#: models.py:1198 +msgid "Mitigate" +msgstr "Atténuer" + +#: models.py:1199 +msgid "Accept" +msgstr "Accepter" + +#: models.py:1200 +msgid "Avoid" +msgstr "Éviter" + +#: models.py:1201 +msgid "Transfer" +msgstr "Transférer" + +#: models.py:1206 +msgid "--" +msgstr "--" + +#: models.py:1208 +msgid "The strength of the knowledge supporting the assessment is undefined" +msgstr "La force de la connaissance soutenant l'évaluation est indéfinie" + +#: models.py:1212 tests/test_helpers.py:76 tests/test_helpers.py:141 +msgid "Low" +msgstr "Faible" + +#: models.py:1214 +msgid "The strength of the knowledge supporting the assessment is low" +msgstr "La force de la connaissance soutenant l'évaluation est faible" + +#: models.py:1221 +msgid "The strength of the knowledge supporting the assessment is medium" +msgstr "La force de la connaissance soutenant l'évaluation est moyenne" + +#: models.py:1226 tests/test_helpers.py:78 tests/test_helpers.py:143 +msgid "High" +msgstr "Élevé" + +#: models.py:1228 +msgid "The strength of the knowledge supporting the assessment is high" +msgstr "La force de la connaissance soutenant l'évaluation est élevée" + +#: models.py:1237 +msgid "RiskAssessment" +msgstr "ÉvaluationDesRisques" + +#: models.py:1244 +msgid "Assets impacted by the risk scenario" +msgstr "Actifs impactés par le scénario de risque" + +#: models.py:1262 +msgid "" +"The existing controls to manage this risk. Edit the risk scenario to add " +"extra applied controls." +msgstr "" +"Les mesures existantes pour gérer ce risque. Modifiez le scénario de risque " +"pour ajouter des mesures appliquées supplémentaires." + +#: models.py:1264 templates/snippets/mp_data.html:48 +#: templates/snippets/ri_list_nested.html:22 +msgid "Existing controls" +msgstr "Mesures existantes" + +#: models.py:1270 +msgid "Current probability" +msgstr "Probabilité actuelle" + +#: models.py:1273 +msgid "Current impact" +msgstr "Impact actuel" + +#: models.py:1277 +msgid "Current level" +msgstr "Niveau actuel" + +#: models.py:1279 +msgid "" +"The risk level given the current measures. Automatically updated on Save, " +"based on the chosen risk matrix" +msgstr "" +"Le niveau de risque compte tenu des mesures actuelles. Mis à jour " +"automatiquement lors de l'enregistrement, sur la base de la matrice de " +"risque choisie." + +#: models.py:1285 +msgid "Residual probability" +msgstr "Probabilité résiduelle" + +#: models.py:1288 +msgid "Residual impact" +msgstr "Impact résiduel" + +#: models.py:1292 +msgid "Residual level" +msgstr "Niveau résiduel" + +#: models.py:1294 +msgid "" +"The risk level when all the extra measures are done. Automatically updated " +"on Save, based on the chosen risk matrix" +msgstr "" +"Le niveau de risque lorsque toutes les mesures supplémentaires sont mises en " +"œuvre. Mis à jour automatiquement lors de l'enregistrement, sur la base de " +"la matrice de risque choisie." + +#: models.py:1302 +msgid "Treatment status" +msgstr "Statut de traitement" + +#: models.py:1307 +msgid "Strength of Knowledge" +msgstr "Force de la connaissance" + +#: models.py:1308 +msgid "The strength of the knowledge supporting the assessment" +msgstr "La force de la connaissance soutenant l'évaluation" + +#: models.py:1311 models.py:1815 +msgid "Justification" +msgstr "Justification" + +#: models.py:1317 +msgid "Risk scenario" +msgstr "Scénario de risque" + +#: models.py:1318 models.py:1780 +msgid "Risk scenarios" +msgstr "Scénarios de risque" + +#: models.py:1384 +msgid ": " +msgstr ": " + +#: models.py:1413 models.py:1710 +msgid "Compliant" +msgstr "Conforme" + +#: models.py:1414 +msgid "Non compliant (minor)" +msgstr "Non conforme (mineur)" + +#: models.py:1415 +msgid "Non compliant (major)" +msgstr "Non conforme (majeur)" + +#: models.py:1416 models.py:1711 +msgid "Not applicable" +msgstr "Non applicable" + +#: models.py:1426 +msgid "Result" +msgstr "Résultat" + +#: models.py:1429 +msgid "Selected implementation groups" +msgstr "Groupes de mise en œuvre sélectionnés" + +#: models.py:1439 models.py:1738 +msgid "Compliance assessment" +msgstr "Évaluation de conformité" + +#: models.py:1440 +msgid "Compliance assessments" +msgstr "Évaluations de conformité" + +#: models.py:1594 +msgid "{}: Compliance assessment is still in progress" +msgstr "{} : L'évaluation de la conformité est toujours en cours" + +#: models.py:1607 +msgid "{}: No author assigned to this compliance assessment" +msgstr "{} : Aucun auteur n'a été affecté à cette évaluation de conformité" + +#: models.py:1634 +msgid "" +"{}: Requirement assessment status is compliant or partially compliant with " +"no applied control applied" +msgstr "" +"{} : Le statut de l'évaluation de l'exigence est conforme ou partiellement " +"conforme, sans aucun mesure appliquée" + +#: models.py:1659 +msgid "{}: Applied control has no reference control selected" +msgstr "" +"{} : La mesure appliquée ne comporte pas de mesure de référence " +"sélectionné" + +#: models.py:1685 +msgid "{}: Evidence has no file uploaded" +msgstr "{} : La preuve ne comporte pas de fichier téléchargé" + +#: models.py:1706 +msgid "To do" +msgstr "À faire" + +#: models.py:1708 +msgid "Non compliant" +msgstr "Non conforme" + +#: models.py:1709 +msgid "Partially compliant" +msgstr "Partiellement conforme" + +#: models.py:1722 +msgid "Score" +msgstr "Score" + +#: models.py:1726 +msgid "Is scored" +msgstr "Est noté" + +#: models.py:1734 +msgid "Observation" +msgstr "Observation" + +#: models.py:1742 +msgid "Requirement" +msgstr "Exigence" + +#: models.py:1752 +msgid "Selected" +msgstr "Sélectionné" + +#: models.py:1762 +msgid "Requirement assessment" +msgstr "Évaluation de l'exigence" + +#: models.py:1763 +msgid "Requirement assessments" +msgstr "Évaluations de l'exigence" + +#: models.py:1771 +msgid "Created" +msgstr "Créé" + +#: models.py:1772 +msgid "Submitted" +msgstr "Soumis" + +#: models.py:1773 +msgid "Accepted" +msgstr "Accepté" + +#: models.py:1774 +msgid "Rejected" +msgstr "Rejeté" + +#: models.py:1775 +msgid "Revoked" +msgstr "Révoqué" + +#: models.py:1782 +msgid "" +"Select the risk scenarios to be accepted, attention they must be part of the " +"chosen domain" +msgstr "" +"Sélectionnez les scénarios de risque à accepter, faites attention, ils " +"doivent faire partie du domaine choisi" + +#: models.py:1788 +msgid "Risk owner and approver identity" +msgstr "Identité du propriétaire du risque et de l'approbateur" + +#: models.py:1789 utils.py:48 utils.py:55 utils.py:58 +msgid "Approver" +msgstr "Approbateur" + +#: models.py:1798 +msgid "State" +msgstr "État" + +#: models.py:1801 +msgid "Specify when the risk acceptance will no longer apply" +msgstr "Précisez quand l'acceptation du risque ne sera plus valable" + +#: models.py:1806 +msgid "Acceptance date" +msgstr "Date d'acceptation" + +#: models.py:1809 +msgid "Rejection date" +msgstr "Date de rejet" + +#: models.py:1812 +msgid "Revocation date" +msgstr "Date de révocation" + +#: models.py:1824 +msgid "Risk acceptance" +msgstr "Acceptation du risque" + +#: models.py:1825 +msgid "Risk acceptances" +msgstr "Acceptations du risque" + +#: templates/core/action_plan_pdf.html:12 +msgid "Action plan" +msgstr "Plan d'action" + +#: templates/core/action_plan_pdf.html:18 +msgid "Audit" +msgstr "Audit" + +#: templates/core/action_plan_pdf.html:22 +msgid "Associated applied controls" +msgstr "Mesures appliqués associés" + +#: templates/core/action_plan_pdf.html:23 +msgid "Separated by status and sorted by eta" +msgstr "Séparés par statut et triés par ETA" + +#: templates/core/action_plan_pdf.html:28 +msgid "No status" +msgstr "Pas de statut" + +#: templates/core/action_plan_pdf.html:48 +msgid "Matching requirements" +msgstr "Exigences correspondantes" + +#: templates/core/action_plan_pdf.html:65 +msgid "No entries found" +msgstr "Aucun résultat trouvé" + +#: templates/registration/first_connexion_email.html:14 +msgid "Welcome to CISO Assistant!" +msgstr "Bienvenue sur CISO Assistant !" + +#: templates/registration/first_connexion_email.html:15 +#: templates/registration/password_reset_email.html:23 +msgid "Your all-in-one GRC Management Platform" +msgstr "Votre plateforme de gestion GRC tout-en-un" + +#: templates/registration/first_connexion_email.html:33 +msgid "" +"You have been granted access to CISO Assistant. To get started, use the link " +"below to define your password:" +msgstr "" +"Vous avez été autorisé à accéder à CISO Assistant. Pour commencer, utilisez " +"le lien ci-dessous pour définir votre mot de passe :" + +#: templates/registration/first_connexion_email.html:38 +msgid "Set my password" +msgstr "Définir mon mot de passe" + +#: templates/registration/first_connexion_email.html:41 +#: templates/registration/password_reset_email.html:43 +msgid "An issue with the link? copy and paste the following in your browser" +msgstr "" +"Un problème avec le lien ? Copiez et collez le suivant dans votre navigateur" + +#: templates/registration/first_connexion_email.html:49 +msgid "" +"This link can only be used once. In case of an issue, you can access your " +"instance" +msgstr "" +"Ce lien ne peut être utilisé qu'une seule fois. En cas de problème, vous " +"pouvez accéder à votre instance" + +#: templates/registration/first_connexion_email.html:49 +#: templates/registration/first_connexion_email.html:58 +#: templates/registration/password_reset_email.html:51 +msgid "here" +msgstr "ici" + +#: templates/registration/first_connexion_email.html:49 +msgid "and request a password reset" +msgstr "et demander une réinitialisation du mot de passe" + +#: templates/registration/first_connexion_email.html:54 +#: templates/registration/password_reset_email.html:55 +msgid "" +"If you, or your organization, did not make this request, you can simply " +"ignore this email" +msgstr "" +"Si vous ou votre organisation n'avez pas fait cette demande, vous pouvez " +"simplement ignorer cet e-mail." + +#: templates/registration/first_connexion_email.html:58 +msgid "Learn more about CISO Assistant" +msgstr "En savoir plus sur CISO Assistant" + +#: templates/registration/first_connexion_email.html:63 +#: templates/registration/password_reset_email.html:58 +msgid "Sincerely" +msgstr "Cordialement," + +#: templates/registration/first_connexion_email.html:64 +#: templates/registration/password_reset_email.html:59 +msgid "CISO Assistant Team" +msgstr "Équipe CISO Assistant" + +#: templates/registration/password_reset_email.html:32 +msgid "Hello" +msgstr "Bonjour," + +#: templates/registration/password_reset_email.html:36 +msgid "" +"We have received a password reset request for this email. Click below to " +"proceed:" +msgstr "" +"Nous avons reçu une demande de réinitialisation de mot de passe pour cet e-" +"mail. Cliquez ci-dessous pour continuer :" + +#: templates/registration/password_reset_email.html:40 +msgid "Reset my password" +msgstr "Réinitialiser mon mot de passe" + +#: templates/registration/password_reset_email.html:50 +msgid "" +"This link can only be used once. In case of an issue, go to your instance" +msgstr "" +"Ce lien ne peut être utilisé qu'une seule fois. En cas de problème, rendez-" +"vous sur votre instance" + +#: templates/registration/password_reset_email.html:51 +msgid "and request a new password reset" +msgstr "et demander une nouvelle réinitialisation de mot de passe" + +#: templates/snippets/mp_data.html:11 +msgid "Associated risk scenarios" +msgstr "Scénarios de risque associés" + +#: templates/snippets/mp_data.html:20 +msgid "" +"Risk risk_assessment seems to be empty. Measure Plan cannot be generated." +msgstr "" +"Le risque risk_assessment semble être vide. Le plan de mesure ne peut pas " +"être généré." + +#: templates/snippets/mp_data.html:43 +msgid "No associated measure" +msgstr "Aucune mesure associée" + +#: templates/snippets/mp_data.html:54 +msgid "Additional measures" +msgstr "Mesures supplémentaires" + +#: templates/snippets/mp_data.html:60 +msgid "Type" +msgstr "Type" + +#: templates/snippets/ra_data.html:13 +msgid "Risk matrix:" +msgstr "Matrice de risque :" + +#: templates/snippets/ra_data.html:18 +msgid "Authors:" +msgstr "Auteurs :" + +#: templates/snippets/ra_data.html:25 +msgid "Reviewers:" +msgstr "Relecteurs :" + +#: templates/snippets/ra_data.html:32 +msgid "Status:" +msgstr "Statut :" + +#: templates/snippets/ra_data.html:35 +msgid "ETA:" +msgstr "ETA :" + +#: templates/snippets/ra_data.html:36 +msgid "Due date:" +msgstr "Date d'échéance :" + +#: templates/snippets/ra_data.html:37 +msgid "Created at:" +msgstr "Créé le :" + +#: templates/snippets/ra_data.html:38 +msgid "Updated at:" +msgstr "Mis à jour le :" + +#: templates/snippets/ra_data.html:51 +msgid "Associated Risk scenarios" +msgstr "Scénarios de risque associés" + +#: templates/snippets/ra_data.html:56 +msgid "Risk matrix view" +msgstr "Vue de la matrice de risque" + +#: templates/snippets/ra_data.html:59 +msgid "Current" +msgstr "Actuel" + +#: templates/snippets/ra_data.html:67 +msgid "Residual" +msgstr "Résiduel" + +#: templates/snippets/ri_list_nested.html:13 +msgid "ID" +msgstr "ID" + +#: templates/snippets/ri_list_nested.html:25 +msgid "Current risk level" +msgstr "Niveau de risque actuel" + +#: templates/snippets/ri_list_nested.html:28 +msgid "Residual risk level" +msgstr "Niveau de risque résiduel" + +#: templates/snippets/ri_list_nested.html:34 +msgid "Suggested measures" +msgstr "Mesures suggérées" + +#: templates/snippets/ri_list_nested.html:115 +msgid "No scenario found." +msgstr "Aucun scénario trouvé." + +#: templates/snippets/risk_legend.html:4 +msgid "Risk levels" +msgstr "Niveaux de risque" + +#: templates/snippets/risk_matrix.html:40 +#: templates/snippets/risk_matrix.html:86 +msgid "Impact" +msgstr "Impact" + +#: templates/snippets/risk_matrix.html:46 +msgid "Probability" +msgstr "Probabilité" + +#: tests/test_helpers.py:75 tests/test_helpers.py:140 +msgid "Very Low" +msgstr "Très faible" + +#: tests/test_helpers.py:79 tests/test_helpers.py:144 +msgid "Very High" +msgstr "Très élevé" + +#: utils.py:45 utils.py:53 +msgid "Administrator" +msgstr "Administrateur" + +#: utils.py:46 utils.py:56 +msgid "Domain manager" +msgstr "Gestionnaire de domaine" + +#: utils.py:47 utils.py:57 +msgid "Analyst" +msgstr "Analyste" + +#: utils.py:49 utils.py:54 utils.py:59 +msgid "Reader" +msgstr "Lecteur" + +#: utils.py:68 +msgid "French" +msgstr "Français" + +#: utils.py:69 +msgid "English" +msgstr "Anglais" diff --git a/backend/core/models.py b/backend/core/models.py index f3da6da5c2..11034567e9 100644 --- a/backend/core/models.py +++ b/backend/core/models.py @@ -1225,6 +1225,7 @@ def quality_check(self) -> dict: "msg": _("{}: Risk assessment is still in progress").format( str(self) ), + "msgid": "riskAssessmentInProgress", "obj_type": "risk_assessment", "object": _object, } @@ -1235,6 +1236,7 @@ def quality_check(self) -> dict: "msg": _("{}: No author assigned to this risk assessment").format( str(self) ), + "msgid": "riskAssessmentNoAuthor", "obj_type": "risk_assessment", "object": _object, } @@ -1245,6 +1247,7 @@ def quality_check(self) -> dict: "msg": _( "{}: RiskAssessment is empty. No risk scenario declared yet" ).format(self), + "msgid": "riskAssessmentEmpty", "obj_type": "risk_assessment", "object": _object, } @@ -1257,6 +1260,8 @@ def quality_check(self) -> dict: "json", self.risk_scenarios.all().order_by("created_at") ) scenarios = [x["fields"] for x in json.loads(_scenarios)] + for i in range(len(scenarios)): + scenarios[i]["id"] = json.loads(_scenarios)[i]["pk"] for ri in scenarios: if ri["current_level"] < 0: warnings_lst.append( @@ -1264,6 +1269,8 @@ def quality_check(self) -> dict: "msg": _("{} current risk level has not been assessed").format( ri["name"] ), + "msgid": "riskScenarioNoCurrentLevel", + "link": f"risk-scenarios/{ri['id']}", "obj_type": "riskscenario", "object": ri, } @@ -1274,6 +1281,7 @@ def quality_check(self) -> dict: "msg": _( "{} residual risk level has not been assessed. If no additional measures are applied, it should be at the same level as the current risk" ).format(ri["name"]), + "msgid": "riskScenarioNoResidualLevel", "obj_type": "riskscenario", "object": ri, } @@ -1284,6 +1292,8 @@ def quality_check(self) -> dict: "msg": _( "{} residual risk level is higher than the current one" ).format(ri["name"]), + "msgid": "riskScenarioResidualHigherThanCurrent", + "link": f"risk-scenarios/{ri['id']}", "obj_type": "riskscenario", "object": ri, } @@ -1294,6 +1304,8 @@ def quality_check(self) -> dict: "msg": _( "{} residual risk probability is higher than the current one" ).format(ri["name"]), + "msgid": "riskScenarioResidualProbaHigherThanCurrent", + "link": f"risk-scenarios/{ri['id']}", "obj_type": "riskscenario", "object": ri, } @@ -1304,6 +1316,8 @@ def quality_check(self) -> dict: "msg": _( "{} residual risk impact is higher than the current one" ).format(ri["name"]), + "msgid": "riskScenarioResidualImpactHigherThanCurrent", + "link": f"risk-scenarios/{ri['id']}", "obj_type": "riskscenario", "object": ri, } @@ -1323,6 +1337,8 @@ def quality_check(self) -> dict: "msg": _( "{}: residual risk level has been lowered without any specific measure" ).format(ri["name"]), + "msgid": "riskScenarioResidualLoweredWithoutMeasures", + "link": f"risk-scenarios/{ri['id']}", "obj_type": "riskscenario", "object": ri, } @@ -1335,6 +1351,8 @@ def quality_check(self) -> dict: "msg": _( "{} risk accepted but no risk acceptance attached" ).format(ri), + "msgid": "riskScenarioAcceptedNoAcceptance", + "link": f"risk-scenarios/{ri['id']}", "obj_type": "riskscenario", "object": ri, } @@ -1355,6 +1373,8 @@ def quality_check(self) -> dict: warnings_lst.append( { "msg": _("{} does not have an ETA").format(mtg["name"]), + "msgid": "appliedControlNoETA", + "link": f"applied-controls/{mtg['id']}", "obj_type": "appliedcontrol", "object": {"name": mtg["name"], "id": mtg["id"]}, } @@ -1366,6 +1386,8 @@ def quality_check(self) -> dict: "msg": _( "{} ETA is in the past now. Consider updating its status or the date" ).format(mtg["name"]), + "msgid": "appliedControlETAInPast", + "link": f"applied-controls/{mtg['id']}", "obj_type": "appliedcontrol", "object": {"name": mtg["name"], "id": mtg["id"]}, } @@ -1377,6 +1399,8 @@ def quality_check(self) -> dict: "msg": _( "{} does not have an estimated effort. This will help you for prioritization" ).format(mtg["name"]), + "msgid": "appliedControlNoEffort", + "link": f"applied-controls/{mtg['id']}", "obj_type": "appliedcontrol", "object": {"name": mtg["name"], "id": mtg["id"]}, } @@ -1388,6 +1412,8 @@ def quality_check(self) -> dict: "msg": _( "{}: Applied control does not have an external link attached. This will help you for follow-up" ).format(mtg["name"]), + "msgid": "appliedControlNoLink", + "link": f"applied-controls/{mtg['id']}", "obj_type": "appliedcontrol", "object": {"name": mtg["name"], "id": mtg["id"]}, } @@ -1401,6 +1427,8 @@ def quality_check(self) -> dict: .order_by("created_at"), ) acceptances = [x["fields"] for x in json.loads(_acceptances)] + for i in range(len(acceptances)): + acceptances[i]["id"] = json.loads(_acceptances)[i]["pk"] for ra in acceptances: if not ra["expiry_date"]: warnings_lst.append( @@ -1408,6 +1436,8 @@ def quality_check(self) -> dict: "msg": _("{}: Acceptance has no expiry date").format( ra["name"] ), + "msgid": "riskAcceptanceNoExpiryDate", + "link": f"risk-acceptances/{ra['id']}", "obj_type": "appliedcontrol", "object": ra, } @@ -1419,6 +1449,8 @@ def quality_check(self) -> dict: "msg": _( "{}: Acceptance has expired. Consider updating the status or the date" ).format(ra["name"]), + "msgid": "riskAcceptanceExpired", + "link": f"risk-acceptances/{ra['id']}", "obj_type": "riskacceptance", "object": ra, } @@ -1844,6 +1876,7 @@ def quality_check(self) -> dict: "msg": _("{}: Compliance assessment is still in progress").format( str(self) ), + "msgid": "complianceAssessmentInProgress", "obj_type": "complianceassessment", "object": _object, } @@ -1855,6 +1888,7 @@ def quality_check(self) -> dict: "msg": _( "{}: No author assigned to this compliance assessment" ).format(str(self)), + "msgid": "complianceAssessmentNoAuthor", "obj_type": "complianceassessment", "object": _object, } @@ -1868,7 +1902,8 @@ def quality_check(self) -> dict: requirement_assessments = [] for ra in _requirement_assessments: ra_dict = json.loads(serializers.serialize("json", [ra]))[0]["fields"] - ra_dict["repr"] = str(ra) + ra_dict["name"] = str(ra) + ra_dict["id"] = ra.id requirement_assessments.append(ra_dict) for requirement_assessment in requirement_assessments: if ( @@ -1879,7 +1914,9 @@ def quality_check(self) -> dict: { "msg": _( "{}: Requirement assessment status is compliant or partially compliant with no applied control applied" - ).format(requirement_assessment["repr"]), + ).format(requirement_assessment["name"]), + "msgid": "requirementAssessmentNoAppliedControl", + "link": f"requirement-assessments/{requirement_assessment['id']}", "obj_type": "requirementassessment", "object": requirement_assessment, } @@ -1894,6 +1931,8 @@ def quality_check(self) -> dict: ).order_by("created_at"), ) applied_controls = [x["fields"] for x in json.loads(_applied_controls)] + for i in range(len(applied_controls)): + applied_controls[i]["id"] = json.loads(_applied_controls)[i]["pk"] for applied_control in applied_controls: if not applied_control["reference_control"]: info_lst.append( @@ -1901,6 +1940,8 @@ def quality_check(self) -> dict: "msg": _( "{}: Applied control has no reference control selected" ).format(applied_control["name"]), + "msgid": "appliedControlNoReferenceControl", + "link": f"applied-controls/{applied_control['id']}", "obj_type": "appliedcontrol", "object": applied_control, } @@ -1917,6 +1958,8 @@ def quality_check(self) -> dict: ).order_by("created_at"), ) evidences = [x["fields"] for x in json.loads(_evidences)] + for i in range(len(evidences)): + evidences[i]["id"] = json.loads(_evidences)[i]["pk"] for evidence in evidences: if not evidence["attachment"]: warnings_lst.append( @@ -1924,6 +1967,8 @@ def quality_check(self) -> dict: "msg": _("{}: Evidence has no file uploaded").format( evidence["name"] ), + "msgid": "evidenceNoFile", + "link": f"evidences/{evidence['id']}", "obj_type": "evidence", "object": evidence, } diff --git a/backend/core/templates/core/action_plan_pdf.html b/backend/core/templates/core/action_plan_pdf.html index 53efae1bab..75fbd11324 100644 --- a/backend/core/templates/core/action_plan_pdf.html +++ b/backend/core/templates/core/action_plan_pdf.html @@ -9,7 +9,7 @@
-

Action plan

+

{% trans "Action plan" %}

{% trans "Domain" %}: {{ compliance_assessment.project.folder }}

/

@@ -21,10 +21,17 @@

Action plan

{% trans "Associated applied controls" %}:

{% trans "Separated by status and sorted by eta" %}

- {% for status, applied_controls in context.items%} + {{ status }} + {% for status, applied_controls in context.items %} {% for status_color, color in color_map.items %} - {% if status_color == status %} -

{% trans status|title %}:

+ {% if status_color == status and status == "no status" %} +

{% trans "No status" %}

+ {% else %} + {% for text in status_text %} + {% if status_color == status and text.0 == status %} +

{{ text.1 }}:

+ {% endif %} + {% endfor %} {% endif %} {% endfor %}
diff --git a/backend/core/templates/snippets/mp_data.html b/backend/core/templates/snippets/mp_data.html index 6154436678..ab5d704573 100644 --- a/backend/core/templates/snippets/mp_data.html +++ b/backend/core/templates/snippets/mp_data.html @@ -6,7 +6,7 @@

/

{% trans "Project" %}: {{ risk_assessment.project }}

/

-

{% trans "RiskAssessment" %}: {{ risk_assessment.name }} - {{ risk_assessment.version }}

+

{% trans "Risk assessment" %}: {{ risk_assessment.name }} - {{ risk_assessment.version }}

{% trans "Associated risk scenarios" %}:

diff --git a/backend/core/views.py b/backend/core/views.py index c898a67e8c..dd6691b415 100644 --- a/backend/core/views.py +++ b/backend/core/views.py @@ -1267,6 +1267,7 @@ def action_plan_pdf(self, request, pk): "inactive": "#fca5a5", "no status": "#e5e7eb", } + status = AppliedControl.Status.choices compliance_assessment_object = self.get_object() requirement_assessments_objects = ( compliance_assessment_object.get_requirement_assessments() @@ -1285,6 +1286,7 @@ def action_plan_pdf(self, request, pk): applied_control ) data = { + "status_text": status, "color_map": color_map, "context": context, "compliance_assessment": compliance_assessment_object, diff --git a/frontend/messages/de.json b/frontend/messages/de.json index b213abc9f4..4fac1d0f20 100644 --- a/frontend/messages/de.json +++ b/frontend/messages/de.json @@ -532,6 +532,27 @@ "goBackToAudit": "Zurück zum Audit", "exportBackupDescription": "Dies wird die Datenbank serialisieren und ein Backup erstellen, einschließlich Benutzer und RBAC. Beweise und andere Dateien sind im Backup nicht enthalten.", "importBackupDescription": "Dies wird die Datenbank aus einem Backup deserialisieren und wiederherstellen. Dies wird alle vorhandenen Daten, einschließlich Benutzer und RBAC, überschreiben und kann nicht rückgängig gemacht werden.", + "riskAssessmentInProgress": "Die Risikobewertung ist noch im Gange", + "riskAssessmentNoAuthor": "Dieser Risikobewertung ist kein Autor zugewiesen", + "riskAssessmentEmpty": "Die Risikobewertung ist leer. Noch kein Risikoszenario deklariert", + "riskScenarioNoCurrentLevel": "Das aktuelle Risikoniveau wurde noch nicht bewertet", + "riskScenarioNoResidualLevel": "Das Restrisiko wurde nicht bewertet. Wenn keine zusätzlichen Maßnahmen ergriffen werden, sollte es auf dem gleichen Niveau liegen wie das aktuelle Risiko", + "riskScenarioResidualHigherThanCurrent": "Das Restrisiko ist höher als das aktuelle", + "riskScenarioResidualProbaHigherThanCurrent": "Die Restrisikowahrscheinlichkeit ist höher als die aktuelle", + "riskScenarioResidualImpactHigherThanCurrent": "Die Restrisikoauswirkung ist höher als die aktuelle", + "riskScenarioResidualLoweredWithoutMeasures": "Das Restrisiko wurde ohne besondere Maßnahmen gesenkt", + "riskScenarioAcceptedNoAcceptance": "Risiko akzeptiert, aber keine Risikoakzeptanz damit verbunden", + "appliedControlNoETA": "Hat keine ETA", + "appliedControlETAInPast": "Die voraussichtliche Ankunftszeit liegt nun in der Vergangenheit. Aktualisieren Sie den Status oder das Datum.", + "appliedControlNoEffort": "Hat keinen geschätzten Aufwand. Dies hilft Ihnen bei der Priorisierung", + "appliedControlNoLink": "Angewandte Kontrolle hat keinen externen Link angehängt. Dies hilft Ihnen bei der Nachverfolgung", + "riskAcceptanceNoExpiryDate": "Die Annahme hat kein Ablaufdatum", + "riskAcceptanceExpired": "Die Annahme ist abgelaufen. Erwägen Sie eine Aktualisierung des Status oder des Datums", + "complianceAssessmentInProgress": "Die Prüfung ist noch im Gange", + "complianceAssessmentNoAuthor": "Diesem Audit ist kein Autor zugewiesen", + "requirementAssessmentNoAppliedControl": "Der Status der Anforderungsbewertung ist konform oder teilweise konform, ohne dass eine Kontrolle angewendet wurde.", + "appliedControlNoReferenceControl": "Für die angewandte Steuerung ist keine Referenzsteuerung ausgewählt", + "evidenceNoFile": "Für den Beweis wurde keine Datei hochgeladen", "requirementAppliedControlHelpText": "Mit den ausgewählten Maßnahmen verknüpfte Nachweise werden automatisch der Anforderung zugeordnet.", "requirementEvidenceHelpText": "Über diese Registerkarte können Sie der Anforderung weitere Nachweise hinzufügen." } diff --git a/frontend/messages/en.json b/frontend/messages/en.json index 447c2b8ea2..86a0394c4c 100644 --- a/frontend/messages/en.json +++ b/frontend/messages/en.json @@ -539,6 +539,27 @@ "goBackToAudit": "Go back to the audit", "exportBackupDescription": "This will serialize and create a backup of the database, including users and RBAC. Evidences and other files are not included in the backup.", "importBackupDescription": "This will deserialize and restore the database from a backup. This will overwrite all existing data, including users and RBAC and cannot be undone.", + "riskAssessmentInProgress": "Risk assessment is still in progress", + "riskAssessmentNoAuthor": "No author assigned to this risk assessment", + "riskAssessmentEmpty": "Risk assessment is empty. No risk scenario declared yet", + "riskScenarioNoCurrentLevel": "Current risk level has not been assessed", + "riskScenarioNoResidualLevel": "Residual risk level has not been assessed. If no additional measures are applied, it should be at the same level as the current risk", + "riskScenarioResidualHigherThanCurrent": "Residual risk level is higher than the current one", + "riskScenarioResidualProbaHigherThanCurrent": "Residual risk probability is higher than the current one", + "riskScenarioResidualImpactHigherThanCurrent": "Residual risk impact is higher than the current one", + "riskScenarioResidualLoweredWithoutMeasures": "Residual risk level has been lowered without any specific measure", + "riskScenarioAcceptedNoAcceptance": "Risk accepted but no risk acceptance attached", + "appliedControlNoETA": "Does not have an ETA", + "appliedControlETAInPast": "ETA is in the past now. Consider updating its status or the date", + "appliedControlNoEffort": "Does not have an estimated effort. This will help you for prioritization", + "appliedControlNoLink": "Applied control does not have an external link attached. This will help you for follow-up", + "riskAcceptanceNoExpiryDate": "Acceptance has no expiry date", + "riskAcceptanceExpired": "Acceptance has expired. Consider updating the status or the date", + "complianceAssessmentInProgress": "Audit is still in progress", + "complianceAssessmentNoAuthor": "No author assigned to this audit", + "requirementAssessmentNoAppliedControl": "Requirement assessment status is compliant or partially compliant with no applied control applied", + "appliedControlNoReferenceControl": "Applied control has no reference control selected", + "evidenceNoFile": "Evidence has no file uploaded", "requirementAppliedControlHelpText": "Evidences linked to the selected measures will be automatically associated with the requirement.", "requirementEvidenceHelpText": "This tab allows you to add extra evidences to the requirement." } diff --git a/frontend/messages/es.json b/frontend/messages/es.json index 259c0e7fa4..5857d54b04 100644 --- a/frontend/messages/es.json +++ b/frontend/messages/es.json @@ -529,6 +529,27 @@ "asZIP": "como ZIP", "incoming": "Entrante", "outdated": "Desactualizado", + "riskAssessmentInProgress": "La evaluación de riesgos aún está en progreso", + "riskAssessmentNoAuthor": "Ningún autor asignado a esta evaluación de riesgos", + "riskAssessmentEmpty": "La evaluación de riesgos está vacía. Aún no se ha declarado ningún escenario de riesgo", + "riskScenarioNoCurrentLevel": "El nivel de riesgo actual no ha sido evaluado.", + "riskScenarioNoResidualLevel": "No se ha evaluado el nivel de riesgo residual. Si no se aplican medidas adicionales, debería estar al mismo nivel que el riesgo actual.", + "riskScenarioResidualHigherThanCurrent": "El nivel de riesgo residual es superior al actual", + "riskScenarioResidualProbaHigherThanCurrent": "La probabilidad de riesgo residual es mayor que la actual", + "riskScenarioResidualImpactHigherThanCurrent": "El impacto del riesgo residual es superior al actual", + "riskScenarioResidualLoweredWithoutMeasures": "Se ha reducido el nivel de riesgo residual sin ninguna medida específica", + "riskScenarioAcceptedNoAcceptance": "Riesgo aceptado pero sin aceptación de riesgo adjunta", + "appliedControlNoETA": "No tiene ETA", + "appliedControlETAInPast": "ETA ya es cosa del pasado. Considere actualizar su estado o la fecha", + "appliedControlNoEffort": "No tiene un esfuerzo estimado. Esto le ayudará a priorizar", + "appliedControlNoLink": "El control aplicado no tiene enlace externo adjunto. Esto le ayudará para el seguimiento.", + "riskAcceptanceNoExpiryDate": "La aceptación no tiene fecha de caducidad.", + "riskAcceptanceExpired": "La aceptación ha caducado. Considere actualizar el estado o la fecha", + "complianceAssessmentInProgress": "La auditoría aún está en progreso", + "complianceAssessmentNoAuthor": "Ningún autor asignado a esta auditoría", + "requirementAssessmentNoAppliedControl": "El estado de la evaluación de requisitos es conforme o parcialmente conforme sin que se haya aplicado ningún control.", + "appliedControlNoReferenceControl": "El control aplicado no tiene ningún control de referencia seleccionado", + "evidenceNoFile": "La evidencia no tiene ningún archivo subido", "goBackToAudit": "Volver a la auditoría", "exportBackupDescription": "Esto serializará y creará una copia de seguridad de la base de datos, incluidos los usuarios y RBAC. Las pruebas y otros archivos no se incluyen en la copia de seguridad.", "importBackupDescription": "Esto deserializará y restaurará la base de datos desde una copia de seguridad. Esto sobrescribirá todos los datos existentes, incluidos los usuarios y RBAC, y no se puede deshacer.", diff --git a/frontend/messages/fr.json b/frontend/messages/fr.json index 8e7ad4fec5..3a5c3ed916 100644 --- a/frontend/messages/fr.json +++ b/frontend/messages/fr.json @@ -538,6 +538,27 @@ "goBackToAudit": "Retour à l'audit", "exportBackupDescription": "Cela va sérialiser et créer une sauvegarde de la base de données, y compris les utilisateurs et RBAC. Les preuves et autres fichiers ne sont pas inclus dans la sauvegarde.", "importBackupDescription": "Cela va désérialiser et restaurer la base de données à partir d'une sauvegarde. Cela va écraser toutes les données existantes, y compris les utilisateurs et RBAC. Cette action est irréversible.", + "riskAssessmentInProgress": "L'évaluation des risques est toujours en cours", + "riskAssessmentNoAuthor": "Aucun auteur affecté à cette évaluation des risques", + "riskAssessmentEmpty": "L’évaluation des risques est vide. Aucun scénario de risque déclaré pour l'instant", + "riskScenarioNoCurrentLevel": "Le niveau de risque courant n’a pas été évalué", + "riskScenarioNoResidualLevel": "Le niveau de risque résiduel n’a pas été évalué. Si aucune mesure supplémentaire n’est appliquée, il devrait être au même niveau que le risque courant", + "riskScenarioResidualHigherThanCurrent": "Le niveau de risque résiduel est supérieur à celui courant", + "riskScenarioResidualProbaHigherThanCurrent": "La probabilité de risque résiduel est supérieure à celle courante", + "riskScenarioResidualImpactHigherThanCurrent": "L’impact du risque résiduel est supérieur à celui courant", + "riskScenarioResidualLoweredWithoutMeasures": "Le niveau de risque résiduel a été abaissé sans aucune mesure spécifique", + "riskScenarioAcceptedNoAcceptance": "Risque accepté mais aucune acceptation de risque n'est attachée", + "appliedControlNoETA": "N'a pas d'ETA", + "appliedControlETAInPast": "L’ETA appartient désormais au passé. Pensez à mettre à jour son statut ou la date", + "appliedControlNoEffort": "N'a pas d'effort estimé. Cela vous aidera pour la priorisation", + "appliedControlNoLink": "La mesure appliquée n’a pas de lien externe attaché. Cela vous aidera pour le suivi", + "riskAcceptanceNoExpiryDate": "L'acceptation n'a pas de date d'expiration", + "riskAcceptanceExpired": "L'acceptation a expiré. Pensez à mettre à jour le statut ou la date", + "complianceAssessmentInProgress": "L'audit est toujours en cours", + "complianceAssessmentNoAuthor": "Aucun auteur affecté à cet audit", + "requirementAssessmentNoAppliedControl": "Le statut d'évaluation des exigences est conforme ou partiellement conforme sans aucune mesure appliquée.", + "appliedControlNoReferenceControl": "La mesure appliquée n'a aucune mesure de référence sélectionnée", + "evidenceNoFile": "Aucun fichier n'a été téléchargé pour les preuves", "requirementAppliedControlHelpText": "Les preuves liées aux mesures sélectionnées seront automatiquement associées à l'exigence.", "requirementEvidenceHelpText": "Cet onglet vous permet d'ajouter des preuves supplémentaires à l'exigence." } diff --git a/frontend/messages/it.json b/frontend/messages/it.json index 988ae1bf15..9cd9f51e75 100644 --- a/frontend/messages/it.json +++ b/frontend/messages/it.json @@ -532,6 +532,27 @@ "goBackToAudit": "Torniamo all'audit", "exportBackupDescription": "Questo serializzerà e creerà un backup del database, inclusi utenti e RBAC. Le prove e altri file non sono inclusi nel backup.", "importBackupDescription": "Questo deserializzerà e ripristinerà il database da un backup. Questo sovrascriverà tutti i dati esistenti, inclusi utenti e RBAC, e non può essere annullato.", + "riskAssessmentInProgress": "La valutazione del rischio è ancora in corso", + "riskAssessmentNoAuthor": "Nessun autore assegnato a questa valutazione del rischio", + "riskAssessmentEmpty": "La valutazione del rischio è vuota. Nessuno scenario di rischio ancora dichiarato", + "riskScenarioNoCurrentLevel": "Il livello di rischio attuale non è stato valutato", + "riskScenarioNoResidualLevel": "Il livello di rischio residuo non è stato valutato. Se non vengono applicate misure aggiuntive, dovrebbe essere allo stesso livello del rischio attuale", + "riskScenarioResidualHigherThanCurrent": "Il livello di rischio residuo è superiore a quello attuale", + "riskScenarioResidualProbaHigherThanCurrent": "La probabilità di rischio residuo è superiore a quella attuale", + "riskScenarioResidualImpactHigherThanCurrent": "L’impatto del rischio residuo è superiore a quello attuale", + "riskScenarioResidualLoweredWithoutMeasures": "Il livello di rischio residuo è stato abbassato senza alcuna misura specifica", + "riskScenarioAcceptedNoAcceptance": "Rischio accettato ma nessuna accettazione di rischio allegata", + "appliedControlNoETA": "Non ha un ETA", + "appliedControlETAInPast": "L’ETA ormai appartiene al passato. Valuta la possibilità di aggiornarne lo stato o la data", + "appliedControlNoEffort": "Non ha uno sforzo stimato. Questo ti aiuterà a stabilire le priorità", + "appliedControlNoLink": "Al controllo applicato non è collegato un collegamento esterno. Questo ti aiuterà per il follow-up", + "riskAcceptanceNoExpiryDate": "L'accettazione non ha scadenza", + "riskAcceptanceExpired": "L'accettazione è scaduta. Valuta la possibilità di aggiornare lo stato o la data", + "complianceAssessmentInProgress": "La verifica è ancora in corso", + "complianceAssessmentNoAuthor": "Nessun autore assegnato a questo controllo", + "requirementAssessmentNoAppliedControl": "Lo stato di valutazione dei requisiti è conforme o parzialmente conforme senza alcun controllo applicato", + "appliedControlNoReferenceControl": "Per il controllo applicato non è selezionato alcun controllo di riferimento", + "evidenceNoFile": "Nessun file è stato caricato nelle prove", "requirementAppliedControlHelpText": "Le evidenze legate alle misure selezionate verranno automaticamente associate al requisito.", "requirementEvidenceHelpText": "Questa scheda ti consente di aggiungere ulteriori prove al requisito." } diff --git a/frontend/messages/nl.json b/frontend/messages/nl.json index cc06dd0392..dd4b1553a8 100644 --- a/frontend/messages/nl.json +++ b/frontend/messages/nl.json @@ -532,6 +532,27 @@ "goBackToAudit": "Ga terug naar de controle", "exportBackupDescription": "Dit zal de database serialiseren en een back-up maken, inclusief gebruikers en RBAC. Bewijzen en andere bestanden zijn niet inbegrepen in de back-up.", "importBackupDescription": "Dit zal de database deserialiseren en herstellen vanaf een back-up. Dit zal alle bestaande gegevens, inclusief gebruikers en RBAC, overschrijven en kan niet ongedaan worden gemaakt.", + "riskAssessmentInProgress": "De risicobeoordeling is nog in volle gang", + "riskAssessmentNoAuthor": "Er is geen auteur toegewezen aan deze risicobeoordeling", + "riskAssessmentEmpty": "Risicobeoordeling is leeg. Er is nog geen risicoscenario bekend", + "riskScenarioNoCurrentLevel": "Het huidige risiconiveau is niet beoordeeld", + "riskScenarioNoResidualLevel": "Het restrisiconiveau is niet beoordeeld. Als er geen aanvullende maatregelen worden toegepast, moet dit op hetzelfde niveau liggen als het huidige risico", + "riskScenarioResidualHigherThanCurrent": "Het restrisiconiveau is hoger dan het huidige", + "riskScenarioResidualProbaHigherThanCurrent": "De waarschijnlijkheid van het resterende risico is hoger dan de huidige", + "riskScenarioResidualImpactHigherThanCurrent": "De impact van het resterende risico is groter dan de huidige", + "riskScenarioResidualLoweredWithoutMeasures": "Het restrisiconiveau is zonder enige specifieke maatregel verlaagd", + "riskScenarioAcceptedNoAcceptance": "Risico geaccepteerd, maar er is geen risicoacceptatie aan verbonden", + "appliedControlNoETA": "Heeft geen verwachte aankomsttijd", + "appliedControlETAInPast": "ETA behoort nu tot het verleden. Overweeg om de status of de datum bij te werken", + "appliedControlNoEffort": "Heeft geen geschatte inspanning. Dit zal u helpen bij het stellen van prioriteiten", + "appliedControlNoLink": "Aan toegepaste controle is geen externe link gekoppeld. Dit zal u helpen bij de opvolging", + "riskAcceptanceNoExpiryDate": "Aanvaarding kent geen vervaldatum", + "riskAcceptanceExpired": "Acceptatie is verlopen. Overweeg om de status of de datum bij te werken", + "complianceAssessmentInProgress": "De audit is nog in volle gang", + "complianceAssessmentNoAuthor": "Er is geen auteur toegewezen aan deze audit", + "requirementAssessmentNoAppliedControl": "De status van de vereistenbeoordeling is conform of gedeeltelijk conform en er is geen toegepaste controle toegepast", + "appliedControlNoReferenceControl": "Voor de toegepaste regeling is geen referentieregeling geselecteerd", + "evidenceNoFile": "Er is geen bestand geüpload voor bewijsmateriaal", "requirementAppliedControlHelpText": "Bewijsstukken die verband houden met de geselecteerde maatregelen worden automatisch aan de eis gekoppeld.", "requirementEvidenceHelpText": "Op dit tabblad kunt u extra bewijsstukken aan de eis toevoegen." } diff --git a/frontend/messages/pt.json b/frontend/messages/pt.json index 1fb8741325..e299d4f16f 100644 --- a/frontend/messages/pt.json +++ b/frontend/messages/pt.json @@ -538,6 +538,27 @@ "goBackToAudit": "Volte para a auditoria", "exportBackupDescription": "Isso irá serializar e criar um backup do banco de dados, incluindo usuários e RBAC. Evidências e outros arquivos não estão incluídos no backup.", "importBackupDescription": "Isso irá desserializar e restaurar o banco de dados a partir de um backup. Isso substituirá todos os dados existentes, incluindo usuários e RBAC, e não poderá ser desfeito.", + "riskAssessmentInProgress": "A avaliação de risco ainda está em andamento", + "riskAssessmentNoAuthor": "Nenhum autor atribuído a esta avaliação de risco", + "riskAssessmentEmpty": "A avaliação de risco está vazia. Nenhum cenário de risco declarado ainda", + "riskScenarioNoCurrentLevel": "O nível de risco atual não foi avaliado", + "riskScenarioNoResidualLevel": "O nível de risco residual não foi avaliado. Se não forem aplicadas medidas adicionais, deverá estar ao mesmo nível do risco atual", + "riskScenarioResidualHigherThanCurrent": "O nível de risco residual é superior ao atual", + "riskScenarioResidualProbaHigherThanCurrent": "A probabilidade de risco residual é maior que a atual", + "riskScenarioResidualImpactHigherThanCurrent": "O impacto do risco residual é superior ao atual", + "riskScenarioResidualLoweredWithoutMeasures": "O nível de risco residual foi reduzido sem qualquer medida específica", + "riskScenarioAcceptedNoAcceptance": "Risco aceito, mas sem aceitação de risco associada", + "appliedControlNoETA": "Não tem HEC", + "appliedControlETAInPast": "ETA está no passado agora. Considere atualizar seu status ou a data", + "appliedControlNoEffort": "Não possui esforço estimado. Isso irá ajudá-lo na priorização", + "appliedControlNoLink": "O controle aplicado não possui link externo anexado. Isso irá ajudá-lo no acompanhamento", + "riskAcceptanceNoExpiryDate": "Aceitação não tem prazo de validade", + "riskAcceptanceExpired": "A aceitação expirou. Considere atualizar o status ou a data", + "complianceAssessmentInProgress": "A auditoria ainda está em andamento", + "complianceAssessmentNoAuthor": "Nenhum autor atribuído a esta auditoria", + "requirementAssessmentNoAppliedControl": "O status da avaliação de requisitos está em conformidade ou parcialmente em conformidade, sem nenhum controle aplicado", + "appliedControlNoReferenceControl": "O controle aplicado não tem nenhum controle de referência selecionado", + "evidenceNoFile": "A evidência não tem nenhum arquivo carregado", "requirementAppliedControlHelpText": "As evidências vinculadas às medidas selecionadas serão automaticamente associadas ao requisito.", "requirementEvidenceHelpText": "Esta aba permite adicionar evidências extras ao requisito." } diff --git a/frontend/src/lib/components/Breadcrumbs/Breadcrumbs.svelte b/frontend/src/lib/components/Breadcrumbs/Breadcrumbs.svelte index 277b3dd9ce..a46e750e33 100644 --- a/frontend/src/lib/components/Breadcrumbs/Breadcrumbs.svelte +++ b/frontend/src/lib/components/Breadcrumbs/Breadcrumbs.svelte @@ -65,8 +65,8 @@ {#if c.icon} {/if} - {#if localItems(languageTag())[c.label]} - {localItems(languageTag())[c.label]} + {#if localItems()[c.label]} + {localItems()[c.label]} {:else} {c.label} {/if} @@ -82,8 +82,8 @@ {#if c.icon} {/if} - {#if localItems(languageTag())[c.label]} - {localItems(languageTag())[c.label]} + {#if localItems()[c.label]} + {localItems()[c.label]} {:else} {c.label} {/if} @@ -93,8 +93,8 @@ {#if c.icon} {/if} - {#if localItems(languageTag())[c.label]} - {localItems(languageTag())[c.label]} + {#if localItems()[c.label]} + {localItems()[c.label]} {:else} {c.label} {/if} diff --git a/frontend/src/lib/components/Chart/DonutChart.svelte b/frontend/src/lib/components/Chart/DonutChart.svelte index 77335e0e19..5f55885428 100644 --- a/frontend/src/lib/components/Chart/DonutChart.svelte +++ b/frontend/src/lib/components/Chart/DonutChart.svelte @@ -16,7 +16,7 @@ for (const index in values) { if (values[index].localName) { - values[index].name = localItems(languageTag())[values[index].localName]; + values[index].name = localItems()[values[index].localName]; } } diff --git a/frontend/src/lib/components/Chart/RadarChart.svelte b/frontend/src/lib/components/Chart/RadarChart.svelte index 1c3075c419..465f36c43d 100644 --- a/frontend/src/lib/components/Chart/RadarChart.svelte +++ b/frontend/src/lib/components/Chart/RadarChart.svelte @@ -16,7 +16,7 @@ for (const index in values) { if (values[index].localName) { - values[index].name = localItems(languageTag())[values[index].localName]; + values[index].name = localItems()[values[index].localName]; } } diff --git a/frontend/src/lib/components/Forms/AutocompleteSelect.svelte b/frontend/src/lib/components/Forms/AutocompleteSelect.svelte index c426a332d5..f57f0107ca 100644 --- a/frontend/src/lib/components/Forms/AutocompleteSelect.svelte +++ b/frontend/src/lib/components/Forms/AutocompleteSelect.svelte @@ -89,8 +89,8 @@ {#if option.suggested} {option.label} (suggested) - {:else if translateOptions && localItems(languageTag())[toCamelCase(option.label)]} - {localItems(languageTag())[toCamelCase(option.label)]} + {:else if translateOptions && localItems()[toCamelCase(option.label)]} + {localItems()[toCamelCase(option.label)]} {:else} {option.label} {/if} diff --git a/frontend/src/lib/components/Forms/Select.svelte b/frontend/src/lib/components/Forms/Select.svelte index 880c543404..1fec2750e4 100644 --- a/frontend/src/lib/components/Forms/Select.svelte +++ b/frontend/src/lib/components/Forms/Select.svelte @@ -62,8 +62,8 @@ {/if} {#each options as option}
  • {value} {:else if ISO_8601_REGEX.test(value)} {formatDateOrDateTime(value, languageTag())} - {:else if localItems(languageTag())[toCamelCase((value.str || value.name) ?? value)]} - {localItems(languageTag())[toCamelCase((value.str || value.name) ?? value)]} + {:else if localItems()[toCamelCase((value.str || value.name) ?? value)]} + {localItems()[toCamelCase((value.str || value.name) ?? value)]} {:else} {(value.str || value.name) ?? value} {/if} @@ -261,7 +261,7 @@ {#each Object.entries(data.relatedModels) as [urlmodel, model], index} - {localItems(languageTag())[model.info.localNamePlural]} + {localItems()[model.info.localNamePlural]} {#if model.table.body.length > 0} {model.table.body.length} {/if} @@ -272,9 +272,7 @@ {#if tabSet === index}

    - {localItems(languageTag())[ - 'associated' + capitalizeFirstLetter(model.info.localNamePlural) - ]} + {localItems()['associated' + capitalizeFirstLetter(model.info.localNamePlural)]}

    {#if model.table} @@ -283,7 +281,7 @@ slot="addButton" class="btn variant-filled-primary self-end my-auto" on:click={(_) => modalCreateForm(model)} - >{localItems(languageTag())[ + >{localItems()[ 'add' + capitalizeFirstLetter(model.info.localName) ]} diff --git a/frontend/src/routes/(app)/[model=urlmodel]/[id=uuid]/edit/+page.server.ts b/frontend/src/routes/(app)/[model=urlmodel]/[id=uuid]/edit/+page.server.ts index fb5c32fef8..acf9a9b473 100644 --- a/frontend/src/routes/(app)/[model=urlmodel]/[id=uuid]/edit/+page.server.ts +++ b/frontend/src/routes/(app)/[model=urlmodel]/[id=uuid]/edit/+page.server.ts @@ -93,9 +93,7 @@ export const actions: Actions = { { type: 'success', message: m.successfullyUpdatedObject({ - object: localItems(languageTag())[ - toCamelCase(modelVerboseName.toLowerCase()) - ].toLowerCase(), + object: localItems()[toCamelCase(modelVerboseName.toLowerCase())].toLowerCase(), name: form.data.name }) }, diff --git a/frontend/src/routes/(app)/analytics/+page.svelte b/frontend/src/routes/(app)/analytics/+page.svelte index 7188c8673f..0ed5020838 100644 --- a/frontend/src/routes/(app)/analytics/+page.svelte +++ b/frontend/src/routes/(app)/analytics/+page.svelte @@ -35,7 +35,7 @@ const rsd_rsk_label = m.residualRisk(); function localizeChartLabels(labels: string[]): string[] { - return labels.map((label) => localItems(languageTag())[label]); + return labels.map((label) => localItems()[label]); } const appliedControlTodoTable: TableSource = { diff --git a/frontend/src/routes/(app)/analytics/composer/+page.svelte b/frontend/src/routes/(app)/analytics/composer/+page.svelte index cbdc02b3ee..9ce8e9a86e 100644 --- a/frontend/src/routes/(app)/analytics/composer/+page.svelte +++ b/frontend/src/routes/(app)/analytics/composer/+page.svelte @@ -14,9 +14,7 @@ let applied_control_status: AppliedControlStatus = data.applied_control_status; for (const item in applied_control_status.labels) { - applied_control_status.labels[item] = localItems(languageTag())[ - applied_control_status.localLables[item] - ]; + applied_control_status.labels[item] = localItems()[applied_control_status.localLables[item]]; } diff --git a/frontend/src/routes/(app)/compliance-assessments/[id=uuid]/+page.svelte b/frontend/src/routes/(app)/compliance-assessments/[id=uuid]/+page.svelte index 398a1c22ea..fe3e1bc689 100644 --- a/frontend/src/routes/(app)/compliance-assessments/[id=uuid]/+page.svelte +++ b/frontend/src/routes/(app)/compliance-assessments/[id=uuid]/+page.svelte @@ -124,7 +124,7 @@ {#if key === 'urn'} {m.urn()} {:else} - {localItems(languageTag())[toCamelCase(key)]} + {localItems()[toCamelCase(key)]} {/if}
      @@ -157,8 +157,8 @@ )?.urlModel }/${value.id}`} {value.str} - {:else if localItems(languageTag())[toCamelCase(value.str ?? value)]} - {localItems(languageTag())[toCamelCase(value.str ?? value)]} + {:else if localItems()[toCamelCase(value.str ?? value)]} + {localItems()[toCamelCase(value.str ?? value)]} {:else} {value.str ?? value} {/if} diff --git a/frontend/src/routes/(app)/compliance-assessments/[id=uuid]/TreeViewItemLead.svelte b/frontend/src/routes/(app)/compliance-assessments/[id=uuid]/TreeViewItemLead.svelte index efcf6a5e61..a7e0082cc1 100644 --- a/frontend/src/routes/(app)/compliance-assessments/[id=uuid]/TreeViewItemLead.svelte +++ b/frontend/src/routes/(app)/compliance-assessments/[id=uuid]/TreeViewItemLead.svelte @@ -12,7 +12,7 @@ export let isScored: boolean; export let max_score: number; - const lead = localItems(languageTag())[statusI18n] ?? statusDisplay ?? ''; + const lead = localItems()[statusI18n] ?? statusDisplay ?? ''; $: classesText = statusColor === '#000000' ? 'text-white' : ''; diff --git a/frontend/src/routes/(app)/compliance-assessments/[id=uuid]/action-plan/export/pdf/+server.ts b/frontend/src/routes/(app)/compliance-assessments/[id=uuid]/action-plan/export/pdf/+server.ts index 41a8d50ed5..995eddc826 100644 --- a/frontend/src/routes/(app)/compliance-assessments/[id=uuid]/action-plan/export/pdf/+server.ts +++ b/frontend/src/routes/(app)/compliance-assessments/[id=uuid]/action-plan/export/pdf/+server.ts @@ -1,4 +1,5 @@ import { BASE_API_URL } from '$lib/utils/constants'; +import { languageTag } from '$paraglide/runtime'; import { error } from '@sveltejs/kit'; import type { RequestHandler } from './$types'; @@ -6,7 +7,11 @@ export const GET: RequestHandler = async ({ fetch, params }) => { const URLModel = 'compliance-assessments'; const endpoint = `${BASE_API_URL}/${URLModel}/${params.id}/action_plan_pdf/`; - const res = await fetch(endpoint); + const res = await fetch(endpoint, { + headers: { + 'Accept-Language': languageTag() + } + }); if (!res.ok) { error(400, 'Error fetching the PDF file'); } diff --git a/frontend/src/routes/(app)/evidences/[id=uuid]/+page.svelte b/frontend/src/routes/(app)/evidences/[id=uuid]/+page.svelte index 7dee5aeaf2..7f21481c11 100644 --- a/frontend/src/routes/(app)/evidences/[id=uuid]/+page.svelte +++ b/frontend/src/routes/(app)/evidences/[id=uuid]/+page.svelte @@ -79,7 +79,7 @@ class="text-sm font-medium text-gray-800 capitalize-first" data-testid={key.replace('_', '-') + '-field-title'} > - {localItems(languageTag())[toCamelCase(key)]} + {localItems()[toCamelCase(key)]}
        • diff --git a/frontend/src/routes/(app)/libraries/+page.server.ts b/frontend/src/routes/(app)/libraries/+page.server.ts index 774b4a5e78..72e75177d8 100644 --- a/frontend/src/routes/(app)/libraries/+page.server.ts +++ b/frontend/src/routes/(app)/libraries/+page.server.ts @@ -98,7 +98,7 @@ export const actions: Actions = { const response = await req.json(); console.error(response); - const translate_error = localItems(languageTag())[response.error]; + const translate_error = localItems()[response.error]; const toast_error_message = translate_error ?? m.libraryLoadingError() + '(' + response.error + ')'; diff --git a/frontend/src/routes/(app)/my-profile/+page.svelte b/frontend/src/routes/(app)/my-profile/+page.svelte index 2531599542..f81383328b 100644 --- a/frontend/src/routes/(app)/my-profile/+page.svelte +++ b/frontend/src/routes/(app)/my-profile/+page.svelte @@ -46,7 +46,7 @@
          {#each Object.entries(filterUserData()) as [label, value]}
          -

          {localItems(languageTag())[label]}

          +

          {localItems()[label]}

          {value}

          {/each} diff --git a/frontend/src/routes/(app)/requirement-assessments/[id=uuid]/+page.server.ts b/frontend/src/routes/(app)/requirement-assessments/[id=uuid]/+page.server.ts index 3c07dd2ccf..e9ea2f7e22 100644 --- a/frontend/src/routes/(app)/requirement-assessments/[id=uuid]/+page.server.ts +++ b/frontend/src/routes/(app)/requirement-assessments/[id=uuid]/+page.server.ts @@ -406,7 +406,7 @@ export const actions: Actions = { { type: 'success', message: m.successfullyCreatedObject({ - object: localItems(languageTag())[toCamelCase(modelVerboseName)].toLowerCase() + object: localItems()[toCamelCase(modelVerboseName)].toLowerCase() }) }, event diff --git a/frontend/src/routes/(app)/requirement-assessments/[id=uuid]/+page.svelte b/frontend/src/routes/(app)/requirement-assessments/[id=uuid]/+page.svelte index 64604e2cf0..22f2accb23 100644 --- a/frontend/src/routes/(app)/requirement-assessments/[id=uuid]/+page.svelte +++ b/frontend/src/routes/(app)/requirement-assessments/[id=uuid]/+page.svelte @@ -76,7 +76,7 @@ type: 'component', component: modalComponent, // Data - title: localItems(languageTag())['add' + capitalizeFirstLetter(data.measureModel.localName)] + title: localItems()['add' + capitalizeFirstLetter(data.measureModel.localName)] }; modalStore.trigger(modal); } @@ -95,7 +95,7 @@ type: 'component', component: modalComponent, // Data - title: localItems(languageTag())['add' + capitalizeFirstLetter(data.evidenceModel.localName)] + title: localItems()['add' + capitalizeFirstLetter(data.evidenceModel.localName)] }; modalStore.trigger(modal); } diff --git a/frontend/src/routes/(app)/risk-assessments/[id=uuid]/+page.server.ts b/frontend/src/routes/(app)/risk-assessments/[id=uuid]/+page.server.ts index 213dad3306..1be427ee9b 100644 --- a/frontend/src/routes/(app)/risk-assessments/[id=uuid]/+page.server.ts +++ b/frontend/src/routes/(app)/risk-assessments/[id=uuid]/+page.server.ts @@ -46,7 +46,7 @@ export const actions: Actions = { return message( createForm, m.successfullyCreatedObject({ - object: localItems(languageTag())[toCamelCase(model.toLowerCase())].toLowerCase() + object: localItems()[toCamelCase(model.toLowerCase())].toLowerCase() }) ); } @@ -82,7 +82,7 @@ export const actions: Actions = { return message( deleteForm, m.successfullyDeletedObject({ - object: localItems(languageTag())[toCamelCase(model.toLowerCase())].toLowerCase() + object: localItems()[toCamelCase(model.toLowerCase())].toLowerCase() }) ); } diff --git a/frontend/src/routes/(app)/risk-assessments/[id=uuid]/+page.svelte b/frontend/src/routes/(app)/risk-assessments/[id=uuid]/+page.svelte index 3cc44b1fab..9dda1a4553 100644 --- a/frontend/src/routes/(app)/risk-assessments/[id=uuid]/+page.svelte +++ b/frontend/src/routes/(app)/risk-assessments/[id=uuid]/+page.svelte @@ -216,7 +216,7 @@ {m.status()}: {risk_assessment.status === null ? '--' - : localItems(languageTag())[toCamelCase(risk_assessment.status)]} + : localItems()[toCamelCase(risk_assessment.status)]}
        • {m.authors()}: diff --git a/frontend/src/routes/(app)/risk-assessments/[id=uuid]/export/pdf/+server.ts b/frontend/src/routes/(app)/risk-assessments/[id=uuid]/export/pdf/+server.ts index b5f922a8e2..189655ddd4 100644 --- a/frontend/src/routes/(app)/risk-assessments/[id=uuid]/export/pdf/+server.ts +++ b/frontend/src/routes/(app)/risk-assessments/[id=uuid]/export/pdf/+server.ts @@ -1,4 +1,5 @@ import { BASE_API_URL } from '$lib/utils/constants'; +import { languageTag } from '$paraglide/runtime'; import { error } from '@sveltejs/kit'; import type { RequestHandler } from './$types'; @@ -10,7 +11,11 @@ export const GET: RequestHandler = async ({ fetch, params }) => { res.json() ); - const res = await fetch(endpoint); + const res = await fetch(endpoint, { + headers: { + 'Accept-Language': languageTag() + } + }); if (!res.ok) { error(400, 'Error fetching the PDF file'); } diff --git a/frontend/src/routes/(app)/risk-assessments/[id=uuid]/remediation-plan/export/pdf/+server.ts b/frontend/src/routes/(app)/risk-assessments/[id=uuid]/remediation-plan/export/pdf/+server.ts index 6d11ef2563..b2fe456d78 100644 --- a/frontend/src/routes/(app)/risk-assessments/[id=uuid]/remediation-plan/export/pdf/+server.ts +++ b/frontend/src/routes/(app)/risk-assessments/[id=uuid]/remediation-plan/export/pdf/+server.ts @@ -1,4 +1,5 @@ import { BASE_API_URL } from '$lib/utils/constants'; +import { languageTag } from '$paraglide/runtime'; import { error } from '@sveltejs/kit'; import type { RequestHandler } from './$types'; @@ -6,7 +7,11 @@ export const GET: RequestHandler = async ({ fetch, params }) => { const URLModel = 'risk-assessments'; const endpoint = `${BASE_API_URL}/${URLModel}/${params.id}/treatment_plan_pdf/`; - const res = await fetch(endpoint); + const res = await fetch(endpoint, { + headers: { + 'Accept-Language': languageTag() + } + }); if (!res.ok) { error(400, 'Error fetching the PDF file'); } diff --git a/frontend/src/routes/(app)/risk-scenarios/[id=uuid]/+page.svelte b/frontend/src/routes/(app)/risk-scenarios/[id=uuid]/+page.svelte index 0a038c3427..0a20f188b0 100644 --- a/frontend/src/routes/(app)/risk-scenarios/[id=uuid]/+page.svelte +++ b/frontend/src/routes/(app)/risk-scenarios/[id=uuid]/+page.svelte @@ -85,7 +85,7 @@

          {m.treatmentStatus()}

          - {localItems(languageTag())[toCamelCase(data.scenario.treatment)]} + {localItems()[toCamelCase(data.scenario.treatment)]}

        • @@ -120,8 +120,8 @@ class="text-sm text-center font-semibold p-2 rounded-md w-20" style="background-color: {color_map[data.scenario.current_proba]}" > - {#if localItems(languageTag())[toCamelCase(data.scenario.current_proba)]} - {localItems(languageTag())[toCamelCase(data.scenario.current_proba)]} + {#if localItems()[toCamelCase(data.scenario.current_proba)]} + {localItems()[toCamelCase(data.scenario.current_proba)]} {:else} {data.scenario.current_proba} {/if} @@ -134,8 +134,8 @@ class="text-sm text-center font-semibold p-2 rounded-md w-20" style="background-color: {color_map[data.scenario.current_impact]}" > - {#if localItems(languageTag())[toCamelCase(data.scenario.current_impact)]} - {localItems(languageTag())[toCamelCase(data.scenario.current_impact)]} + {#if localItems()[toCamelCase(data.scenario.current_impact)]} + {localItems()[toCamelCase(data.scenario.current_impact)]} {:else} {data.scenario.current_impact} {/if} @@ -148,8 +148,8 @@ class="text-sm text-center font-semibold p-2 rounded-md w-20" style="background-color: {data.scenario.current_level.hexcolor}" > - {#if localItems(languageTag())[toCamelCase(data.scenario.current_level.name)]} - {localItems(languageTag())[toCamelCase(data.scenario.current_level.name)]} + {#if localItems()[toCamelCase(data.scenario.current_level.name)]} + {localItems()[toCamelCase(data.scenario.current_level.name)]} {:else} {data.scenario.current_level.name} {/if} @@ -170,8 +170,8 @@ class="text-sm text-center font-semibold p-2 rounded-md w-20" style="background-color: {color_map[data.scenario.residual_proba]}" > - {#if localItems(languageTag())[toCamelCase(data.scenario.residual_proba)]} - {localItems(languageTag())[toCamelCase(data.scenario.residual_proba)]} + {#if localItems()[toCamelCase(data.scenario.residual_proba)]} + {localItems()[toCamelCase(data.scenario.residual_proba)]} {:else} {data.scenario.residual_proba} {/if} @@ -184,8 +184,8 @@ class="text-sm text-center font-semibold p-2 rounded-md w-20" style="background-color: {color_map[data.scenario.residual_impact]}" > - {#if localItems(languageTag())[toCamelCase(data.scenario.residual_impact)]} - {localItems(languageTag())[toCamelCase(data.scenario.residual_impact)]} + {#if localItems()[toCamelCase(data.scenario.residual_impact)]} + {localItems()[toCamelCase(data.scenario.residual_impact)]} {:else} {data.scenario.residual_impact} {/if} @@ -198,8 +198,8 @@ class="text-sm text-center font-semibold p-2 rounded-md w-20" style="background-color: {data.scenario.residual_level.hexcolor}" > - {#if localItems(languageTag())[toCamelCase(data.scenario.residual_level.name)]} - {localItems(languageTag())[toCamelCase(data.scenario.residual_level.name)]} + {#if localItems()[toCamelCase(data.scenario.residual_level.name)]} + {localItems()[toCamelCase(data.scenario.residual_level.name)]} {:else} {data.scenario.residual_level.name} {/if} @@ -215,10 +215,10 @@ {data.scenario.strength_of_knowledge.symbol} {/if} - {#if localItems(languageTag())[toCamelCase(data.scenario.strength_of_knowledge.name)]} - {localItems(languageTag())[toCamelCase(data.scenario.strength_of_knowledge.name)]} + {#if localItems()[toCamelCase(data.scenario.strength_of_knowledge.name)]} + {localItems()[toCamelCase(data.scenario.strength_of_knowledge.name)]} {:else} - {localItems(languageTag())['undefined']} + {localItems()['undefined']} {/if}

          diff --git a/frontend/src/routes/(app)/risk-scenarios/[id=uuid]/edit/+page.svelte b/frontend/src/routes/(app)/risk-scenarios/[id=uuid]/edit/+page.svelte index f5a16442a0..ffd35de141 100644 --- a/frontend/src/routes/(app)/risk-scenarios/[id=uuid]/edit/+page.svelte +++ b/frontend/src/routes/(app)/risk-scenarios/[id=uuid]/edit/+page.svelte @@ -71,7 +71,7 @@ type: 'component', component: modalComponent, // Data - title: localItems(languageTag())['add' + capitalizeFirstLetter(data.measureModel.localName)] + title: localItems()['add' + capitalizeFirstLetter(data.measureModel.localName)] }; modalStore.trigger(modal); } diff --git a/frontend/src/routes/(app)/risk-scenarios/[id=uuid]/edit/RiskLevel.svelte b/frontend/src/routes/(app)/risk-scenarios/[id=uuid]/edit/RiskLevel.svelte index 2bb62453f2..ad01bf961e 100644 --- a/frontend/src/routes/(app)/risk-scenarios/[id=uuid]/edit/RiskLevel.svelte +++ b/frontend/src/routes/(app)/risk-scenarios/[id=uuid]/edit/RiskLevel.svelte @@ -54,8 +54,8 @@ class="flex font-medium w-32 justify-center p-2 rounded-token" style="background-color: {riskLevel.hexcolor}" > - {#if localItems(languageTag())[toCamelCase(riskLevel.name)]} - {localItems(languageTag())[toCamelCase(riskLevel.name)]} + {#if localItems()[toCamelCase(riskLevel.name)]} + {localItems()[toCamelCase(riskLevel.name)]} {:else} {riskLevel.name} {/if} diff --git a/frontend/src/routes/(app)/scoring-assistant/selector.svelte b/frontend/src/routes/(app)/scoring-assistant/selector.svelte index 652283ff16..f6d48c0407 100644 --- a/frontend/src/routes/(app)/scoring-assistant/selector.svelte +++ b/frontend/src/routes/(app)/scoring-assistant/selector.svelte @@ -14,11 +14,11 @@ $: dispatch('change', value); -
          {localItems(languageTag())[text]}
          +
          {localItems()[text]}
          diff --git a/frontend/src/routes/(app)/users/[id=uuid]/edit/+page.server.ts b/frontend/src/routes/(app)/users/[id=uuid]/edit/+page.server.ts index 811a82b6f9..cb4f8b65df 100644 --- a/frontend/src/routes/(app)/users/[id=uuid]/edit/+page.server.ts +++ b/frontend/src/routes/(app)/users/[id=uuid]/edit/+page.server.ts @@ -61,7 +61,7 @@ export const actions: Actions = { const response = await res.json(); console.error('server response:', response); if (response.error) { - setFlash({ type: 'error', message: localItems(languageTag())[response.error] }, event); + setFlash({ type: 'error', message: localItems()[response.error] }, event); return fail(403, { form: form }); } if (response.non_field_errors) { diff --git a/frontend/src/routes/(app)/x-rays/+page.svelte b/frontend/src/routes/(app)/x-rays/+page.svelte index 56d605b4fa..12f5a5d989 100644 --- a/frontend/src/routes/(app)/x-rays/+page.svelte +++ b/frontend/src/routes/(app)/x-rays/+page.svelte @@ -2,6 +2,7 @@ import { Tab, TabGroup } from '@skeletonlabs/skeleton'; import type { PageData } from './$types'; import * as m from '$paraglide/messages'; + import { localItems } from '$lib/utils/locales'; export let data: PageData; @@ -110,7 +111,12 @@
            {#each quality_check.errors as error} -
          • {error.msg}
          • +
          • + {#if error.object.name}{error.object.name}:{/if} + {localItems()[error.msgid]} +
          • {/each}
          @@ -129,7 +135,12 @@
            {#each quality_check.warnings as warning} -
          • {warning.msg}
          • +
          • + {#if warning.object.name} + {warning.object.name}: + {/if} + {localItems()[warning.msgid]} +
          • {/each}
          @@ -148,7 +159,12 @@
            {#each quality_check.info as info} -
          • {info.msg}
          • +
          • + {#if info.object.name}{info.object.name}:{/if} + {localItems()[info.msgid]} +
          • {/each}
          @@ -185,7 +201,12 @@
            {#each quality_check.errors as error} -
          • {error.msg}
          • +
          • + {#if error.object.name}{error.object.name}:{/if} + {localItems()[error.msgid]} +
          • {/each}
          @@ -204,7 +225,12 @@
            {#each quality_check.warnings as warning} -
          • {warning.msg}
          • +
          • + {#if warning.object.name}{warning.object.name}:{/if} + {localItems()[warning.msgid]} +
          • {/each}
          @@ -223,7 +249,12 @@
            {#each quality_check.info as info} -
          • {info.msg}
          • +
          • + {#if info.object.name}{info.object.name}:{/if} + {localItems()[info.msgid]} +
          • {/each}
          diff --git a/frontend/src/routes/ParaglideJsProvider.svelte b/frontend/src/routes/ParaglideJsProvider.svelte index 471b8f58ca..777a8ae3a9 100644 --- a/frontend/src/routes/ParaglideJsProvider.svelte +++ b/frontend/src/routes/ParaglideJsProvider.svelte @@ -7,18 +7,19 @@ } from '$paraglide/runtime'; import { onDestroy, onMount } from 'svelte'; import { browser } from '$app/environment'; - import { getCookie, deleteCookie } from '$lib/utils/cookies'; + import { getCookie, deleteCookie, setCookie } from '$lib/utils/cookies'; onMount(() => { // const valueFromSession = sessionStorage.getItem('lang') || sourceLanguageTag; - const valueFromCookies = getCookie('lang') || sourceLanguageTag; + const valueFromCookies = getCookie('ciso_lang') || sourceLanguageTag; // @ts-ignore + setCookie('ciso_lang', valueFromCookies); setLanguageTag(valueFromCookies); }); onDestroy(() => { if (browser) { - deleteCookie('lang'); + deleteCookie('ciso_lang'); // sessionStorage.removeItem('lang'); } }); diff --git a/frontend/tests/functional/nav.test.ts b/frontend/tests/functional/nav.test.ts index 669481ce8f..d6ab2f37ac 100644 --- a/frontend/tests/functional/nav.test.ts +++ b/frontend/tests/functional/nav.test.ts @@ -12,7 +12,7 @@ test('sidebar navigation tests', async ({ logedPage, analyticsPage, sideBar, pag }); await test.step('navigation link are working properly', async () => { - const locals = localItems(languageTag()); + const locals = localItems(); for await (const [key, value] of sideBar.items) { for await (const item of value) { if (item.href !== '/role-assignments') {