@cosmicdrift/kumiko-locale-fr 0.377.0 → 0.379.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/src/strings.ts +106 -19
- package/src/__tests__/completeness.test.ts +0 -37
- package/src/__tests__/en-catalog.ts +0 -1811
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cosmicdrift/kumiko-locale-fr",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.379.0",
|
|
4
4
|
"description": "French UI and mail copy for Kumiko framework screens. Opt in by mounting localeFr() + localeFrClient().",
|
|
5
5
|
"license": "BUSL-1.1",
|
|
6
6
|
"author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
}
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@cosmicdrift/kumiko-framework": "0.
|
|
31
|
+
"@cosmicdrift/kumiko-framework": "0.379.0"
|
|
32
32
|
},
|
|
33
33
|
"publishConfig": {
|
|
34
34
|
"registry": "https://registry.npmjs.org",
|
package/src/strings.ts
CHANGED
|
@@ -47,15 +47,20 @@ export const localeFrBundle: Readonly<Record<string, string>> = {
|
|
|
47
47
|
"audit.log.col.actor": "Acteur",
|
|
48
48
|
"audit.log.col.aggregateId": "ID d'agrégat",
|
|
49
49
|
"audit.log.col.aggregateType": "Type d'agrégat",
|
|
50
|
+
"audit.log.col.tenant": "Locataire",
|
|
50
51
|
"audit.log.col.type": "Événement",
|
|
51
52
|
"audit.log.col.when": "Date",
|
|
52
53
|
"audit.log.detail.field.id": "ID de l'événement",
|
|
53
54
|
"audit.log.detail.metadata": "Métadonnées",
|
|
54
55
|
"audit.log.detail.payload": "Payload de l'événement",
|
|
56
|
+
"audit.log.description": "Tous les événements de ce locataire. Une ligne ouvre les détails.",
|
|
57
|
+
"audit.log.allTenants.description":
|
|
58
|
+
"Tous les événements de tous les locataires. Une ligne ouvre les détails.",
|
|
55
59
|
"audit.log.detail.subtitle":
|
|
56
|
-
"
|
|
60
|
+
"Un événement avec son acteur, son horodatage et ses données enregistrées.",
|
|
57
61
|
"audit.log.details": "Détails",
|
|
58
62
|
"audit:nav.auditLog": "Journal d'audit",
|
|
63
|
+
"audit:nav.auditLogAllTenants": "Journal d'audit (tous les locataires)",
|
|
59
64
|
"auth-mfa:entity:__action-form__:field:code": "Code de votre application d'authentification",
|
|
60
65
|
"auth.errors.accountLocked": "Compte temporairement verrouillé.",
|
|
61
66
|
"auth.errors.accountLockedRetry": "Compte verrouillé. Réessayez dans {minutes} minutes.",
|
|
@@ -466,6 +471,7 @@ export const localeFrBundle: Readonly<Record<string, string>> = {
|
|
|
466
471
|
"config.settings.extensionSelectorHint":
|
|
467
472
|
"Choisissez un fournisseur. Ses paramètres apparaissent ci-dessous et sont enregistrés avec lui.",
|
|
468
473
|
"config.settings.provider": "Fournisseur",
|
|
474
|
+
"config.settings.provider.platformDefault": "Plateforme (par défaut)",
|
|
469
475
|
"config.settings.system": "Plateforme",
|
|
470
476
|
"config.settings.tenant": "Organisation",
|
|
471
477
|
"config.settings.title": "Paramètres",
|
|
@@ -536,10 +542,17 @@ export const localeFrBundle: Readonly<Record<string, string>> = {
|
|
|
536
542
|
"errors.unconfigured": "Cette fonctionnalité n'est pas encore configurée.",
|
|
537
543
|
"errors.uniqueViolation": "Cette entrée existe déjà.",
|
|
538
544
|
"errors.unprocessable": "La requête n'a pas pu être traitée.",
|
|
545
|
+
"errors.file.violatesBindTarget": "Ce fichier ne respecte pas les exigences du champ cible.",
|
|
539
546
|
"errors.validation.custom": "Valeur invalide.",
|
|
540
547
|
"errors.validation.failed": "Échec de la validation.",
|
|
541
548
|
"errors.validation.invalid_element": "Entrée invalide.",
|
|
542
549
|
"errors.validation.invalid_format": "Format invalide.",
|
|
550
|
+
"errors.validation.invalid_format.email": "Adresse e-mail invalide, p. ex. nom@exemple.fr.",
|
|
551
|
+
"errors.validation.invalid_format.url": "Adresse web invalide, p. ex. https://exemple.fr.",
|
|
552
|
+
"errors.validation.invalid_format.date": "Date invalide, p. ex. 20/10/2026.",
|
|
553
|
+
"errors.validation.invalid_format.datetime": "Date et heure invalides, p. ex. 20/10/2026 14:30.",
|
|
554
|
+
"errors.validation.invalid_format.uuid":
|
|
555
|
+
"Identifiant invalide, p. ex. 123e4567-e89b-12d3-a456-426614174000.",
|
|
543
556
|
"errors.validation.invalid_key": "Clé invalide.",
|
|
544
557
|
"errors.validation.invalid_option": "Choix invalide.",
|
|
545
558
|
"errors.validation.invalid_type": "Valeur invalide.",
|
|
@@ -550,9 +563,14 @@ export const localeFrBundle: Readonly<Record<string, string>> = {
|
|
|
550
563
|
"errors.validation.too_big": "Trop grand ou trop long (maximum : {maximum}).",
|
|
551
564
|
"kumiko.boolean.no": "Non",
|
|
552
565
|
"kumiko.boolean.yes": "Oui",
|
|
566
|
+
"kumiko.field.file-list.download": "Télécharger",
|
|
567
|
+
"kumiko.field.file-list.hidePreview": "Masquer l'aperçu",
|
|
568
|
+
"kumiko.field.file-list.preview": "Aperçu",
|
|
553
569
|
"kumiko.validation.number.min": "Doit être au moins {minimum}.",
|
|
554
570
|
"kumiko.validation.number.max": "Doit être {maximum} ou moins.",
|
|
555
571
|
"errors.validation.too_small": "Trop petit ou trop court (minimum : {minimum}).",
|
|
572
|
+
"errors.validation.list_min_rows.one": "Au moins 1 ligne est requise.",
|
|
573
|
+
"errors.validation.list_min_rows.other": "Au moins {minimum} lignes sont requises.",
|
|
556
574
|
"errors.validation.unexpected_field": "Champ inconnu.",
|
|
557
575
|
"errors.validation.unrecognized_keys": "Champs inconnus.",
|
|
558
576
|
"errors.versionConflict": "L'enregistrement a été modifié entre-temps. Rechargez et réessayez.",
|
|
@@ -750,18 +768,24 @@ export const localeFrBundle: Readonly<Record<string, string>> = {
|
|
|
750
768
|
"kumiko.field.embedded-list.empty-cta": "Ajouter la première ligne",
|
|
751
769
|
"kumiko.field.embedded-list.move-down": "Descendre",
|
|
752
770
|
"kumiko.field.embedded-list.move-up": "Monter",
|
|
753
|
-
"kumiko.field.embedded-list.paste-cells-unmatched":
|
|
754
|
-
"
|
|
755
|
-
"kumiko.field.embedded-list.paste-
|
|
756
|
-
"{count}
|
|
771
|
+
"kumiko.field.embedded-list.paste-cells-unmatched.one":
|
|
772
|
+
"1 cellule sans option correspondante a été laissée inchangée.",
|
|
773
|
+
"kumiko.field.embedded-list.paste-cells-unmatched.other":
|
|
774
|
+
"{count} cellules sans option correspondante ont été laissées inchangées.",
|
|
775
|
+
"kumiko.field.embedded-list.paste-rows-truncated.one":
|
|
776
|
+
"1 ligne collée a été ignorée (nombre maximal de lignes atteint).",
|
|
777
|
+
"kumiko.field.embedded-list.paste-rows-truncated.other":
|
|
778
|
+
"{count} lignes collées ont été ignorées (nombre maximal de lignes atteint).",
|
|
757
779
|
"kumiko.field.embedded-list.remove-row": "Supprimer la ligne",
|
|
758
780
|
"kumiko.field.file-list.add": "Ajouter un fichier",
|
|
759
781
|
"kumiko.field.file-list.empty": "Aucun fichier pour l'instant.",
|
|
782
|
+
"kumiko.field.dropzone.limit-count": "jusqu'à {count} fichiers",
|
|
783
|
+
"kumiko.field.dropzone.limit-size": "jusqu'à {size} par fichier",
|
|
784
|
+
"kumiko.field.dropzone.title": "Déposez des fichiers ici ou cliquez pour choisir",
|
|
760
785
|
"kumiko.field.file-list.move-down": "Descendre le fichier",
|
|
761
786
|
"kumiko.field.file-list.move-up": "Monter le fichier",
|
|
762
787
|
"kumiko.field.file-upload.attached": "Fichier joint",
|
|
763
788
|
"kumiko.field.file-upload.change": "Modifier",
|
|
764
|
-
"kumiko.field.file-upload.failed": "Échec du téléversement",
|
|
765
789
|
"kumiko.field.file-upload.remove": "Supprimer",
|
|
766
790
|
"kumiko.field.file-upload.upload": "Téléverser",
|
|
767
791
|
"kumiko.field.fillAction.failed": "Impossible de récupérer une suggestion.",
|
|
@@ -811,6 +835,9 @@ export const localeFrBundle: Readonly<Record<string, string>> = {
|
|
|
811
835
|
"kumiko.list.count.other": "{count} entrées",
|
|
812
836
|
"kumiko.list.empty.filtered":
|
|
813
837
|
"Aucune entrée ne correspond à la recherche ou aux filtres actuels.",
|
|
838
|
+
"kumiko.list.empty.defaultFiltered":
|
|
839
|
+
"Aucune entrée ne correspond au filtre par défaut. Affichez tout pour inclure les entrées hors filtre.",
|
|
840
|
+
"kumiko.list.empty.showAll": "Tout afficher",
|
|
814
841
|
"kumiko.list.empty.hint": "Créez la première pour commencer.",
|
|
815
842
|
"kumiko.list.empty.title": "Aucune entrée pour l'instant.",
|
|
816
843
|
"kumiko.list.end-of-list": "— Fin de la liste —",
|
|
@@ -850,6 +877,7 @@ export const localeFrBundle: Readonly<Record<string, string>> = {
|
|
|
850
877
|
"kumiko.planCard.priceUnavailable": "Prix non disponible",
|
|
851
878
|
"kumiko.reference.system-tenant": "Système",
|
|
852
879
|
"kumiko.reference.system-user": "Système",
|
|
880
|
+
"kumiko.reference.unknown-user": "Inconnu",
|
|
853
881
|
"kumiko.rowAction.failed": "Échec de l'action",
|
|
854
882
|
"kumiko.clientAction.success": "Terminé.",
|
|
855
883
|
"kumiko.clientAction.unregistered": "Cette action n'est pas disponible dans cette application.",
|
|
@@ -879,10 +907,17 @@ export const localeFrBundle: Readonly<Record<string, string>> = {
|
|
|
879
907
|
"kumiko.widget.floatingPanel.resizeRight": "Redimensionner le panneau depuis le bord droit",
|
|
880
908
|
"kumiko.widget.floatingPanel.resizeTop": "Redimensionner le panneau depuis le bord supérieur",
|
|
881
909
|
"kumiko.widget.loading": "Chargement…",
|
|
910
|
+
"kumiko.widget.pdf-preview.loading": "Chargement du PDF…",
|
|
911
|
+
"kumiko.widget.pdf-preview.pageOf": "Page {page} sur {pages}",
|
|
912
|
+
"kumiko.widget.pdf-preview.renderFailed": "Le PDF n'a pas pu être affiché.",
|
|
882
913
|
"kumiko.widget.step-bar.done": "Terminé",
|
|
883
914
|
"kumiko.widget.upload.done": "Téléversé",
|
|
884
915
|
"kumiko.widget.upload.error": "Échec",
|
|
885
916
|
"kumiko.widget.upload.rejected-type": "Type de fichier non autorisé",
|
|
917
|
+
"kumiko.widget.upload.invalid-type": "Type ou contenu de fichier non autorisé",
|
|
918
|
+
"kumiko.widget.upload.max-count": "{count} fichiers au maximum",
|
|
919
|
+
"kumiko.widget.upload.remove": "Retirer le fichier",
|
|
920
|
+
"kumiko.widget.upload.too-large": "Le fichier est trop volumineux",
|
|
886
921
|
"kumiko.widget.upload.uploading": "Téléversement en cours…",
|
|
887
922
|
"kumiko.wizard.next-with-title": "Suivant : {title}",
|
|
888
923
|
"kumiko.wizard.save-and-close": "Enregistrer et fermer",
|
|
@@ -1008,6 +1043,8 @@ export const localeFrBundle: Readonly<Record<string, string>> = {
|
|
|
1008
1043
|
"secrets.errors.invalidValue": "Cette valeur n'est pas valide pour ce secret.",
|
|
1009
1044
|
"screen:api-token-create.title": "Créer un nouveau jeton",
|
|
1010
1045
|
"screen:api-tokens.title": "Jetons d'accès personnels",
|
|
1046
|
+
"screen:audit-log-all-tenants-detail.title": "Événement",
|
|
1047
|
+
"screen:audit-log-all-tenants.title": "Journal d'audit (tous les locataires)",
|
|
1011
1048
|
"screen:audit-log-detail.title": "Événement",
|
|
1012
1049
|
"screen:audit-log.title": "Journal d'audit",
|
|
1013
1050
|
"screen:auth-mfa-disable.title": "Désactiver l'authentification à deux facteurs",
|
|
@@ -1092,7 +1129,9 @@ export const localeFrBundle: Readonly<Record<string, string>> = {
|
|
|
1092
1129
|
"tags.manage.cancel": "Annuler",
|
|
1093
1130
|
"tags.manage.create": "Créer une étiquette",
|
|
1094
1131
|
"tags.manage.delete": "Supprimer",
|
|
1095
|
-
"tags.manage.deleteConfirmDesc": "La
|
|
1132
|
+
"tags.manage.deleteConfirmDesc.one": "La retire d'1 objet. Cette action est irréversible.",
|
|
1133
|
+
"tags.manage.deleteConfirmDesc.other":
|
|
1134
|
+
"La retire de {count} objets. Cette action est irréversible.",
|
|
1096
1135
|
"tags.manage.deleteConfirmTitle": "Supprimer l'étiquette « {name} » ?",
|
|
1097
1136
|
"tags.manage.edit": "Modifier",
|
|
1098
1137
|
"tags.manage.namePlaceholder": "Nom de l'étiquette",
|
|
@@ -1113,6 +1152,24 @@ export const localeFrBundle: Readonly<Record<string, string>> = {
|
|
|
1113
1152
|
"tags:entity:tag:field:color": "Couleur",
|
|
1114
1153
|
"tags:entity:tag:field:name": "Nom",
|
|
1115
1154
|
"tags:entity:tag:field:scope": "Portée",
|
|
1155
|
+
"template-resolver:write:upsert-system:title": "Enregistrer le modèle système",
|
|
1156
|
+
"template-resolver:write:upsert-tenant:title": "Enregistrer le modèle",
|
|
1157
|
+
"template-resolver:write:publish:title": "Publier le modèle",
|
|
1158
|
+
"template-resolver:write:archive:title": "Archiver le modèle",
|
|
1159
|
+
"template-resolver:write:publish-system:title": "Publier le modèle système",
|
|
1160
|
+
"template-resolver:write:archive-system:title": "Archiver le modèle système",
|
|
1161
|
+
"template-resolver:write:discard-draft:title": "Supprimer le brouillon",
|
|
1162
|
+
"template-resolver:write:discard-draft-system:title": "Supprimer le brouillon du modèle système",
|
|
1163
|
+
"template-resolver:write:reset-to-system:title": "Rétablir le modèle système",
|
|
1164
|
+
"template-resolver:write:set:title": "Enregistrer le texte",
|
|
1165
|
+
"template-resolver:write:import-bundle:title": "Importer le modèle",
|
|
1166
|
+
"template-resolver:write:import-bundle-system:title": "Importer un modèle système",
|
|
1167
|
+
"template-resolver:write:copy-locale:title": "Copier le modèle dans une autre langue",
|
|
1168
|
+
"template-resolver:write:resource-upload:title": "Téléverser une image ou une pièce jointe",
|
|
1169
|
+
"template-resolver:write:resource-remove:title": "Retirer l'image ou la pièce jointe",
|
|
1170
|
+
"template-resolver:write:resource-link-pdf:title": "Joindre un modèle PDF",
|
|
1171
|
+
"template-resolver:write:send-test:title": "Envoyer un e-mail de test",
|
|
1172
|
+
"template-resolver:write:patch-draft:title": "Modifier le brouillon du modèle",
|
|
1116
1173
|
"template-resolver.documentEditor.button": "Bouton",
|
|
1117
1174
|
"template-resolver.documentEditor.buttonDefaultText": "Confirmer",
|
|
1118
1175
|
"template-resolver.documentEditor.buttonTarget": "Cible du bouton",
|
|
@@ -1149,6 +1206,8 @@ export const localeFrBundle: Readonly<Record<string, string>> = {
|
|
|
1149
1206
|
"template-resolver.documentEditor.removeLink": "Supprimer le lien",
|
|
1150
1207
|
"template-resolver.documentEditor.repeat": "Répéter",
|
|
1151
1208
|
"template-resolver.documentEditor.repeatList": "Liste à répéter",
|
|
1209
|
+
"template-resolver.documentEditor.images": "Photos",
|
|
1210
|
+
"template-resolver.documentEditor.imagesVariable": "Photos issues de",
|
|
1152
1211
|
"template-resolver.documentEditor.steps": "Étapes",
|
|
1153
1212
|
"template-resolver.documentEditor.stepsVariable": "Étape actuelle issue de",
|
|
1154
1213
|
"template-resolver.documentEditor.stepsList": "Étapes séparées par des virgules (valeur=libellé)",
|
|
@@ -1170,6 +1229,8 @@ export const localeFrBundle: Readonly<Record<string, string>> = {
|
|
|
1170
1229
|
"template-resolver.editor.saved": "Enregistré.",
|
|
1171
1230
|
"template-resolver.editor.saving": "Enregistrement…",
|
|
1172
1231
|
"template-resolver.editor.titleLabel": "Titre",
|
|
1232
|
+
"templateResolver.errors.document.imagesBlockPdfOnly":
|
|
1233
|
+
"Les blocs de photos ne sont autorisés que dans les documents PDF.",
|
|
1173
1234
|
"templateResolver.errors.document.buttonHrefNotPlaceholder":
|
|
1174
1235
|
"La cible du bouton « {detail} » doit être un espace réservé.",
|
|
1175
1236
|
"templateResolver.errors.document.disallowedLinkHref":
|
|
@@ -1204,6 +1265,10 @@ export const localeFrBundle: Readonly<Record<string, string>> = {
|
|
|
1204
1265
|
"Ce lien est invalide ou a expiré. Utilisez le lien de désabonnement d'un e-mail plus récent.",
|
|
1205
1266
|
"templateResolver.errors.systemOnlyTemplate":
|
|
1206
1267
|
"Seule la plateforme gère ce modèle ; il ne peut pas être remplacé par organisation.",
|
|
1268
|
+
"templateResolver.errors.templateNotTenantEditable":
|
|
1269
|
+
"Seule la plateforme peut modifier ce modèle.",
|
|
1270
|
+
"templateResolver.overview.lockedOverride":
|
|
1271
|
+
"Version propre enregistrée mais non diffusée : le modèle n’est pas activé pour les organisations.",
|
|
1207
1272
|
"templateResolver.errors.template.targetExists":
|
|
1208
1273
|
"Un modèle existe déjà pour la langue « {detail} » ; écrasez-le explicitement pour le remplacer.",
|
|
1209
1274
|
"templateResolver.warnings.resourceNotUploaded": "Image non téléversée : {detail}",
|
|
@@ -1514,6 +1579,11 @@ export const localeFrBundle: Readonly<Record<string, string>> = {
|
|
|
1514
1579
|
"Modifiez la mise en page des e-mails ou le papier à en-tête PDF.",
|
|
1515
1580
|
"documentDesigner.search": "Rechercher des modèles",
|
|
1516
1581
|
"documentDesigner.action.edit": "Modifier",
|
|
1582
|
+
"documentDesigner.status.lockedOverride": "Non livrée",
|
|
1583
|
+
"documentDesigner.action.resetLockedOverride": "Retirer la version propre",
|
|
1584
|
+
"documentDesigner.action.resetLockedOverride.confirm":
|
|
1585
|
+
"La version propre enregistrée d'une langue (l'allemand en premier) est archivée et la version de la plateforme reste utilisée. Si le modèle compte plusieurs langues, l'opération est à répéter pour chacune.",
|
|
1586
|
+
"documentDesigner.action.resetLockedOverride.confirmLabel": "Retirer",
|
|
1517
1587
|
"documentDesigner.col.template": "Modèle",
|
|
1518
1588
|
"documentDesigner.col.kind": "Type",
|
|
1519
1589
|
"documentDesigner.col.origin": "Origine",
|
|
@@ -1541,7 +1611,8 @@ export const localeFrBundle: Readonly<Record<string, string>> = {
|
|
|
1541
1611
|
"documentDesigner.status.draftVersion": "Brouillon v{version}",
|
|
1542
1612
|
"documentDesigner.usedBy.allMails": "tous les e-mails",
|
|
1543
1613
|
"documentDesigner.usedBy.allPdfs": "tous les PDF",
|
|
1544
|
-
"documentDesigner.usedBy.templates": "
|
|
1614
|
+
"documentDesigner.usedBy.templates.one": "1 modèle",
|
|
1615
|
+
"documentDesigner.usedBy.templates.other": "{count} modèles",
|
|
1545
1616
|
"documentDesigner.usedBy.title": "Utilisé par",
|
|
1546
1617
|
"documentDesigner.usedBy.none": "Aucun modèle n'utilise encore cette mise en page.",
|
|
1547
1618
|
"documentDesigner.overriddenBy.tenants": "{active} organisations",
|
|
@@ -1607,9 +1678,13 @@ export const localeFrBundle: Readonly<Record<string, string>> = {
|
|
|
1607
1678
|
"documentDesigner.editor.origin.none": "Il n'existe pas encore de mise en page.",
|
|
1608
1679
|
"documentDesigner.editor.origin.system":
|
|
1609
1680
|
"Vous consultez la mise en page système. L'enregistrer crée une personnalisation pour votre organisation.",
|
|
1610
|
-
"documentDesigner.editor.origin.tenant.mails":
|
|
1681
|
+
"documentDesigner.editor.origin.tenant.mails.one":
|
|
1682
|
+
"Remplace la mise en page système v{version}. S'applique à 1 modèle d'e-mail de cette organisation.",
|
|
1683
|
+
"documentDesigner.editor.origin.tenant.mails.other":
|
|
1611
1684
|
"Remplace la mise en page système v{version}. S'applique à {count} modèles d'e-mail de cette organisation.",
|
|
1612
|
-
"documentDesigner.editor.origin.tenant.pdfs":
|
|
1685
|
+
"documentDesigner.editor.origin.tenant.pdfs.one":
|
|
1686
|
+
"Remplace le papier à en-tête système v{version}. S'applique à 1 modèle PDF de cette organisation.",
|
|
1687
|
+
"documentDesigner.editor.origin.tenant.pdfs.other":
|
|
1613
1688
|
"Remplace le papier à en-tête système v{version}. S'applique à {count} modèles PDF de cette organisation.",
|
|
1614
1689
|
"documentDesigner.editor.origin.platformPlain": "Mise en page système v{version}",
|
|
1615
1690
|
"documentDesigner.editor.origin.platformCount":
|
|
@@ -1635,9 +1710,13 @@ export const localeFrBundle: Readonly<Record<string, string>> = {
|
|
|
1635
1710
|
"Le contenu de chaque modèle d'e-mail est inséré ici. L'objet et le texte d'aperçu proviennent du modèle.",
|
|
1636
1711
|
"documentDesigner.editor.slot.pdf": "Le contenu de chaque modèle PDF est inséré ici.",
|
|
1637
1712
|
"documentDesigner.editor.footer.checking": "Vérification de la mise en page …",
|
|
1638
|
-
"documentDesigner.editor.footer.okMail":
|
|
1713
|
+
"documentDesigner.editor.footer.okMail.one":
|
|
1714
|
+
"Espace réservé du contenu présent. Après la publication, la modification s'applique à 1 modèle.",
|
|
1715
|
+
"documentDesigner.editor.footer.okMail.other":
|
|
1639
1716
|
"Espace réservé du contenu présent. Après la publication, la modification s'applique à {count} modèles.",
|
|
1640
|
-
"documentDesigner.editor.footer.okPdf":
|
|
1717
|
+
"documentDesigner.editor.footer.okPdf.one":
|
|
1718
|
+
"Espace réservé du contenu présent. Après la publication, la modification s'applique à 1 modèle.",
|
|
1719
|
+
"documentDesigner.editor.footer.okPdf.other":
|
|
1641
1720
|
"Espace réservé du contenu présent. Après la publication, la modification s'applique à {count} modèles.",
|
|
1642
1721
|
"documentDesigner.editor.discard": "Abandonner les modifications",
|
|
1643
1722
|
"documentDesigner.editor.save": "Enregistrer",
|
|
@@ -1695,6 +1774,12 @@ export const localeFrBundle: Readonly<Record<string, string>> = {
|
|
|
1695
1774
|
"documentDesigner.mail.resource.title": "Ressources",
|
|
1696
1775
|
"documentDesigner.mail.resource.upload": "+ Téléverser",
|
|
1697
1776
|
"documentDesigner.mail.resource.saveFirst": "Enregistrez d'abord, puis téléversez.",
|
|
1777
|
+
"documentDesigner.mail.resource.noFilesFeature":
|
|
1778
|
+
"Les téléversements nécessitent la fonctionnalité de fichiers, que cette application n'a pas intégrée.",
|
|
1779
|
+
"documentDesigner.mail.testMail.unavailable.noChannel":
|
|
1780
|
+
"Les e-mails de test nécessitent le canal e-mail, que cette application n'a pas intégré.",
|
|
1781
|
+
"documentDesigner.mail.testMail.unavailable.noAddress":
|
|
1782
|
+
"Aucune adresse e-mail n'est enregistrée pour vous, donc aucun e-mail de test ne peut être envoyé.",
|
|
1698
1783
|
"documentDesigner.mail.resource.inline": "En ligne",
|
|
1699
1784
|
"documentDesigner.mail.resource.attachment": "Pièce jointe",
|
|
1700
1785
|
"documentDesigner.mail.resource.fromPdf": "Pièce jointe · issue de « {title} »",
|
|
@@ -1741,7 +1826,7 @@ export const localeFrBundle: Readonly<Record<string, string>> = {
|
|
|
1741
1826
|
"Les e-mails transactionnels n'ont pas besoin de lien de désabonnement. Avec « Marketing », la mise en page doit en fournir un.",
|
|
1742
1827
|
"documentDesigner.mail.chrome.title": "En-tête et pied de page",
|
|
1743
1828
|
"documentDesigner.mail.chrome.headerChip": "Libellé dans l'en-tête",
|
|
1744
|
-
"documentDesigner.mail.chrome.headerChipPlaceholder": "p. ex.
|
|
1829
|
+
"documentDesigner.mail.chrome.headerChipPlaceholder": "p. ex. Rappel",
|
|
1745
1830
|
"documentDesigner.mail.chrome.tone": "Tonalité",
|
|
1746
1831
|
"documentDesigner.mail.chrome.toneAccent": "Couleur d'accentuation (par défaut)",
|
|
1747
1832
|
"documentDesigner.mail.chrome.toneInfo": "Info (gris bleuté)",
|
|
@@ -1810,7 +1895,8 @@ export const localeFrBundle: Readonly<Record<string, string>> = {
|
|
|
1810
1895
|
"documentDesigner.mail.preview.samplesHint":
|
|
1811
1896
|
"Les montants et les dates sont mis en forme selon les paramètres de l'organisation.",
|
|
1812
1897
|
"documentDesigner.mail.preview.missingInContent": "absent du contenu",
|
|
1813
|
-
"documentDesigner.mail.preview.entries": "
|
|
1898
|
+
"documentDesigner.mail.preview.entries.one": "1 entrée",
|
|
1899
|
+
"documentDesigner.mail.preview.entries.other": "{count} entrées",
|
|
1814
1900
|
"documentDesigner.mail.preview.checks": "Vérifications",
|
|
1815
1901
|
"documentDesigner.mail.preview.checksHint":
|
|
1816
1902
|
"Ce que le serveur a constaté lors du rendu de cet e-mail.",
|
|
@@ -1829,13 +1915,14 @@ export const localeFrBundle: Readonly<Record<string, string>> = {
|
|
|
1829
1915
|
"Trop d'e-mails de test, veuillez réessayer plus tard.",
|
|
1830
1916
|
"screen:mail-foundation-tenant.title": "Envoi d'e-mails",
|
|
1831
1917
|
"mail-foundation.settings": "Envoi d'e-mails",
|
|
1832
|
-
"mail-foundation.provider": "
|
|
1918
|
+
"mail-foundation.provider": "Envoyer via",
|
|
1833
1919
|
"mail-foundation.provider.description":
|
|
1834
|
-
"
|
|
1920
|
+
"Choisissez qui envoie vos e-mails. L'envoi par la plateforme ne demande aucun réglage propre.",
|
|
1921
|
+
"mail-foundation.provider.platformDefault": "Envoi par la plateforme (par défaut)",
|
|
1835
1922
|
"mail-transport-inmemory.settings": "Boîte de test (en mémoire)",
|
|
1836
|
-
"mail-transport-smtp.settings": "Serveur SMTP",
|
|
1837
|
-
"
|
|
1838
|
-
"config:entity:__config-edit__:field:provider:option:smtp": "Serveur SMTP",
|
|
1923
|
+
"mail-transport-smtp.settings": "Serveur SMTP propre",
|
|
1924
|
+
"config:entity:__config-edit__:field:provider:option:": "Envoi par la plateforme (par défaut)",
|
|
1925
|
+
"config:entity:__config-edit__:field:provider:option:smtp": "Serveur SMTP propre",
|
|
1839
1926
|
"mail-transport-smtp.settings.secrets": "Connexion SMTP",
|
|
1840
1927
|
"mail-transport-smtp.settings.description":
|
|
1841
1928
|
"Les informations de connexion proviennent de votre fournisseur de messagerie, par exemple Brevo, Postmark, Amazon SES ou votre propre serveur.",
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from "bun:test";
|
|
2
|
-
import { localeFrBundle } from "../strings";
|
|
3
|
-
import { frameworkEnCatalog } from "./en-catalog";
|
|
4
|
-
|
|
5
|
-
function placeholders(s: string): string[] {
|
|
6
|
-
return [...s.matchAll(/\{(\w+)\}/g)].map((m) => m[1] ?? "").sort();
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
describe("locale-fr completeness", () => {
|
|
10
|
-
test("has every English framework key", () => {
|
|
11
|
-
const missing = Object.keys(frameworkEnCatalog).filter((k) => localeFrBundle[k] === undefined);
|
|
12
|
-
expect(missing).toEqual([]);
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
test("has no stale extra keys", () => {
|
|
16
|
-
const extra = Object.keys(localeFrBundle).filter((k) => frameworkEnCatalog[k] === undefined);
|
|
17
|
-
expect(extra).toEqual([]);
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
test("interpolation placeholders match English", () => {
|
|
21
|
-
for (const key of Object.keys(frameworkEnCatalog)) {
|
|
22
|
-
expect(placeholders(localeFrBundle[key] ?? "")).toEqual(
|
|
23
|
-
placeholders(frameworkEnCatalog[key] ?? ""),
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
test("uses localized tenant wording, not raw English tenant labels", () => {
|
|
29
|
-
const roleAllowlist = new Set(["TenantAdmin", "SystemAdmin"]);
|
|
30
|
-
const offenders: string[] = [];
|
|
31
|
-
for (const [key, value] of Object.entries(localeFrBundle)) {
|
|
32
|
-
if (roleAllowlist.has(value)) continue;
|
|
33
|
-
if (/\btenants?\b/i.test(value)) offenders.push(key);
|
|
34
|
-
}
|
|
35
|
-
expect(offenders).toEqual([]);
|
|
36
|
-
});
|
|
37
|
-
});
|