@cosmicdrift/kumiko-locale-it 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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cosmicdrift/kumiko-locale-it",
3
- "version": "0.377.0",
3
+ "version": "0.379.0",
4
4
  "description": "Italian UI and mail copy for Kumiko framework screens. Opt in by mounting localeIt() + localeItClient().",
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.377.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,19 @@ export const localeItBundle: Readonly<Record<string, string>> = {
47
47
  "audit.log.col.actor": "Attore",
48
48
  "audit.log.col.aggregateId": "ID aggregato",
49
49
  "audit.log.col.aggregateType": "Tipo di aggregato",
50
+ "audit.log.col.tenant": "Organizzazione",
50
51
  "audit.log.col.type": "Evento",
51
52
  "audit.log.col.when": "Data",
52
53
  "audit.log.detail.field.id": "ID evento",
53
54
  "audit.log.detail.metadata": "Metadati",
54
55
  "audit.log.detail.payload": "Payload dell'evento",
55
- "audit.log.detail.subtitle":
56
- "Vista di dettaglio in sola lettura di un evento di audit con attore, timestamp, aggregato, payload e metadati grezzi dell'evento; si apre da una riga del registro di audit.",
56
+ "audit.log.description": "Tutti gli eventi di questa organizzazione. Una riga apre i dettagli.",
57
+ "audit.log.allTenants.description":
58
+ "Tutti gli eventi di tutte le organizzazioni. Una riga apre i dettagli.",
59
+ "audit.log.detail.subtitle": "Un singolo evento con il suo attore, data e dati registrati.",
57
60
  "audit.log.details": "Dettagli",
58
61
  "audit:nav.auditLog": "Registro di audit",
62
+ "audit:nav.auditLogAllTenants": "Registro di audit (tutte le organizzazioni)",
59
63
  "auth-mfa:entity:__action-form__:field:code": "Codice della tua app di autenticazione",
60
64
  "auth.errors.accountLocked": "Account temporaneamente bloccato.",
61
65
  "auth.errors.accountLockedRetry": "Account bloccato. Riprova tra {minutes} minuti.",
@@ -457,6 +461,7 @@ export const localeItBundle: Readonly<Record<string, string>> = {
457
461
  "config.settings.extensionSelectorHint":
458
462
  "Scegli un provider. Le sue impostazioni compaiono qui sotto e vengono salvate insieme ad esso.",
459
463
  "config.settings.provider": "Provider",
464
+ "config.settings.provider.platformDefault": "Piattaforma (predefinito)",
460
465
  "config.settings.system": "Piattaforma",
461
466
  "config.settings.tenant": "Organizzazione",
462
467
  "config.settings.title": "Impostazioni",
@@ -526,10 +531,18 @@ export const localeItBundle: Readonly<Record<string, string>> = {
526
531
  "errors.unconfigured": "Questa funzione non è ancora configurata.",
527
532
  "errors.uniqueViolation": "Questa voce esiste già.",
528
533
  "errors.unprocessable": "Non è stato possibile elaborare la richiesta.",
534
+ "errors.file.violatesBindTarget":
535
+ "Questo file non soddisfa i requisiti del campo di destinazione.",
529
536
  "errors.validation.custom": "Valore non valido.",
530
537
  "errors.validation.failed": "Convalida non riuscita.",
531
538
  "errors.validation.invalid_element": "Voce non valida.",
532
539
  "errors.validation.invalid_format": "Formato non valido.",
540
+ "errors.validation.invalid_format.email": "Indirizzo e-mail non valido, ad es. nome@esempio.it.",
541
+ "errors.validation.invalid_format.url": "Indirizzo web non valido, ad es. https://esempio.it.",
542
+ "errors.validation.invalid_format.date": "Data non valida, ad es. 20/10/2026.",
543
+ "errors.validation.invalid_format.datetime": "Data e ora non valide, ad es. 20/10/2026 14:30.",
544
+ "errors.validation.invalid_format.uuid":
545
+ "ID non valido, ad es. 123e4567-e89b-12d3-a456-426614174000.",
533
546
  "errors.validation.invalid_key": "Chiave non valida.",
534
547
  "errors.validation.invalid_option": "Scelta non valida.",
535
548
  "errors.validation.invalid_type": "Valore non valido.",
@@ -540,9 +553,14 @@ export const localeItBundle: Readonly<Record<string, string>> = {
540
553
  "errors.validation.too_big": "Troppo grande o troppo lungo (massimo: {maximum}).",
541
554
  "kumiko.boolean.no": "No",
542
555
  "kumiko.boolean.yes": "Sì",
556
+ "kumiko.field.file-list.download": "Scarica",
557
+ "kumiko.field.file-list.hidePreview": "Nascondi anteprima",
558
+ "kumiko.field.file-list.preview": "Anteprima",
543
559
  "kumiko.validation.number.min": "Deve essere almeno {minimum}.",
544
560
  "kumiko.validation.number.max": "Deve essere {maximum} o meno.",
545
561
  "errors.validation.too_small": "Troppo piccolo o troppo corto (minimo: {minimum}).",
562
+ "errors.validation.list_min_rows.one": "È richiesta almeno 1 riga.",
563
+ "errors.validation.list_min_rows.other": "Sono richieste almeno {minimum} righe.",
546
564
  "errors.validation.unexpected_field": "Campo sconosciuto.",
547
565
  "errors.validation.unrecognized_keys": "Campi sconosciuti.",
548
566
  "errors.versionConflict": "Il record è stato modificato nel frattempo. Ricarica e riprova.",
@@ -738,18 +756,24 @@ export const localeItBundle: Readonly<Record<string, string>> = {
738
756
  "kumiko.field.embedded-list.empty-cta": "Aggiungi la prima riga",
739
757
  "kumiko.field.embedded-list.move-down": "Sposta giù",
740
758
  "kumiko.field.embedded-list.move-up": "Sposta su",
741
- "kumiko.field.embedded-list.paste-cells-unmatched":
742
- "{count} cella/e senza opzione corrispondente sono state lasciate invariate.",
743
- "kumiko.field.embedded-list.paste-rows-truncated":
744
- "{count} riga/righe incollata/e sono state scartate (raggiunto il numero massimo di righe).",
759
+ "kumiko.field.embedded-list.paste-cells-unmatched.one":
760
+ "1 cella senza opzione corrispondente è stata lasciata invariata.",
761
+ "kumiko.field.embedded-list.paste-cells-unmatched.other":
762
+ "{count} celle senza opzione corrispondente sono state lasciate invariate.",
763
+ "kumiko.field.embedded-list.paste-rows-truncated.one":
764
+ "1 riga incollata è stata scartata (raggiunto il numero massimo di righe).",
765
+ "kumiko.field.embedded-list.paste-rows-truncated.other":
766
+ "{count} righe incollate sono state scartate (raggiunto il numero massimo di righe).",
745
767
  "kumiko.field.embedded-list.remove-row": "Rimuovi riga",
746
768
  "kumiko.field.file-list.add": "Aggiungi file",
747
769
  "kumiko.field.file-list.empty": "Ancora nessun file.",
770
+ "kumiko.field.dropzone.limit-count": "fino a {count} file",
771
+ "kumiko.field.dropzone.limit-size": "fino a {size} per file",
772
+ "kumiko.field.dropzone.title": "Trascina qui i file o fai clic per sceglierli",
748
773
  "kumiko.field.file-list.move-down": "Sposta il file giù",
749
774
  "kumiko.field.file-list.move-up": "Sposta il file su",
750
775
  "kumiko.field.file-upload.attached": "File allegato",
751
776
  "kumiko.field.file-upload.change": "Cambia",
752
- "kumiko.field.file-upload.failed": "Caricamento non riuscito",
753
777
  "kumiko.field.file-upload.remove": "Rimuovi",
754
778
  "kumiko.field.file-upload.upload": "Carica",
755
779
  "kumiko.field.fillAction.failed": "Impossibile recuperare un suggerimento.",
@@ -799,6 +823,9 @@ export const localeItBundle: Readonly<Record<string, string>> = {
799
823
  "kumiko.list.count.one": "1 voce",
800
824
  "kumiko.list.count.other": "{count} voci",
801
825
  "kumiko.list.empty.filtered": "Nessuna voce corrisponde alla ricerca o ai filtri attuali.",
826
+ "kumiko.list.empty.defaultFiltered":
827
+ "Nessuna voce corrisponde al filtro predefinito. Mostra tutto per includere le voci fuori dal filtro.",
828
+ "kumiko.list.empty.showAll": "Mostra tutto",
802
829
  "kumiko.list.empty.hint": "Crea la prima per iniziare.",
803
830
  "kumiko.list.empty.title": "Ancora nessuna voce.",
804
831
  "kumiko.list.end-of-list": "— Fine dell'elenco —",
@@ -838,6 +865,7 @@ export const localeItBundle: Readonly<Record<string, string>> = {
838
865
  "kumiko.planCard.priceUnavailable": "Prezzo non disponibile",
839
866
  "kumiko.reference.system-tenant": "Sistema",
840
867
  "kumiko.reference.system-user": "Sistema",
868
+ "kumiko.reference.unknown-user": "Sconosciuto",
841
869
  "kumiko.rowAction.failed": "Azione non riuscita",
842
870
  "kumiko.clientAction.success": "Fatto.",
843
871
  "kumiko.clientAction.unregistered": "Questa azione non è disponibile in questa app.",
@@ -867,10 +895,17 @@ export const localeItBundle: Readonly<Record<string, string>> = {
867
895
  "kumiko.widget.floatingPanel.resizeRight": "Ridimensiona il pannello dal bordo destro",
868
896
  "kumiko.widget.floatingPanel.resizeTop": "Ridimensiona il pannello dal bordo superiore",
869
897
  "kumiko.widget.loading": "Caricamento…",
898
+ "kumiko.widget.pdf-preview.loading": "Caricamento del PDF…",
899
+ "kumiko.widget.pdf-preview.pageOf": "Pagina {page} di {pages}",
900
+ "kumiko.widget.pdf-preview.renderFailed": "Impossibile visualizzare il PDF.",
870
901
  "kumiko.widget.step-bar.done": "Fatto",
871
902
  "kumiko.widget.upload.done": "Caricato",
872
903
  "kumiko.widget.upload.error": "Non riuscito",
873
904
  "kumiko.widget.upload.rejected-type": "Tipo di file non consentito",
905
+ "kumiko.widget.upload.invalid-type": "Tipo o contenuto del file non consentito",
906
+ "kumiko.widget.upload.max-count": "Al massimo {count} file",
907
+ "kumiko.widget.upload.remove": "Rimuovi file",
908
+ "kumiko.widget.upload.too-large": "Il file è troppo grande",
874
909
  "kumiko.widget.upload.uploading": "Caricamento in corso…",
875
910
  "kumiko.wizard.next-with-title": "Avanti: {title}",
876
911
  "kumiko.wizard.save-and-close": "Salva e chiudi",
@@ -996,6 +1031,8 @@ export const localeItBundle: Readonly<Record<string, string>> = {
996
1031
  "secrets.errors.invalidValue": "Questo valore non è valido per questo segreto.",
997
1032
  "screen:api-token-create.title": "Crea un nuovo token",
998
1033
  "screen:api-tokens.title": "Token di accesso personali",
1034
+ "screen:audit-log-all-tenants-detail.title": "Evento",
1035
+ "screen:audit-log-all-tenants.title": "Registro di audit (tutte le organizzazioni)",
999
1036
  "screen:audit-log-detail.title": "Evento",
1000
1037
  "screen:audit-log.title": "Registro di audit",
1001
1038
  "screen:auth-mfa-disable.title": "Disattiva l'autenticazione a due fattori",
@@ -1079,7 +1116,9 @@ export const localeItBundle: Readonly<Record<string, string>> = {
1079
1116
  "tags.manage.cancel": "Annulla",
1080
1117
  "tags.manage.create": "Crea etichetta",
1081
1118
  "tags.manage.delete": "Elimina",
1082
- "tags.manage.deleteConfirmDesc":
1119
+ "tags.manage.deleteConfirmDesc.one":
1120
+ "La rimuove da 1 oggetto. L'azione non può essere annullata.",
1121
+ "tags.manage.deleteConfirmDesc.other":
1083
1122
  "La rimuove da {count} oggetti. L'azione non può essere annullata.",
1084
1123
  "tags.manage.deleteConfirmTitle": "Eliminare l'etichetta «{name}»?",
1085
1124
  "tags.manage.edit": "Modifica",
@@ -1101,6 +1140,24 @@ export const localeItBundle: Readonly<Record<string, string>> = {
1101
1140
  "tags:entity:tag:field:color": "Colore",
1102
1141
  "tags:entity:tag:field:name": "Nome",
1103
1142
  "tags:entity:tag:field:scope": "Ambito",
1143
+ "template-resolver:write:upsert-system:title": "Salva modello di sistema",
1144
+ "template-resolver:write:upsert-tenant:title": "Salva modello",
1145
+ "template-resolver:write:publish:title": "Pubblica modello",
1146
+ "template-resolver:write:archive:title": "Archivia modello",
1147
+ "template-resolver:write:publish-system:title": "Pubblica modello di sistema",
1148
+ "template-resolver:write:archive-system:title": "Archivia modello di sistema",
1149
+ "template-resolver:write:discard-draft:title": "Scarta bozza",
1150
+ "template-resolver:write:discard-draft-system:title": "Scarta bozza del modello di sistema",
1151
+ "template-resolver:write:reset-to-system:title": "Ripristina modello di sistema",
1152
+ "template-resolver:write:set:title": "Salva testo",
1153
+ "template-resolver:write:import-bundle:title": "Importa modello",
1154
+ "template-resolver:write:import-bundle-system:title": "Importa modello di sistema",
1155
+ "template-resolver:write:copy-locale:title": "Copia modello in un'altra lingua",
1156
+ "template-resolver:write:resource-upload:title": "Carica immagine o allegato",
1157
+ "template-resolver:write:resource-remove:title": "Rimuovi immagine o allegato",
1158
+ "template-resolver:write:resource-link-pdf:title": "Allega modello PDF",
1159
+ "template-resolver:write:send-test:title": "Invia e-mail di prova",
1160
+ "template-resolver:write:patch-draft:title": "Modifica bozza del modello",
1104
1161
  "template-resolver.documentEditor.button": "Pulsante",
1105
1162
  "template-resolver.documentEditor.buttonDefaultText": "Conferma",
1106
1163
  "template-resolver.documentEditor.buttonTarget": "Destinazione del pulsante",
@@ -1137,6 +1194,8 @@ export const localeItBundle: Readonly<Record<string, string>> = {
1137
1194
  "template-resolver.documentEditor.removeLink": "Rimuovi il link",
1138
1195
  "template-resolver.documentEditor.repeat": "Ripeti",
1139
1196
  "template-resolver.documentEditor.repeatList": "Elenco da ripetere",
1197
+ "template-resolver.documentEditor.images": "Foto",
1198
+ "template-resolver.documentEditor.imagesVariable": "Foto da",
1140
1199
  "template-resolver.documentEditor.steps": "Passaggi",
1141
1200
  "template-resolver.documentEditor.stepsVariable": "Passaggio attuale da",
1142
1201
  "template-resolver.documentEditor.stepsList": "Passaggi separati da virgole (valore=etichetta)",
@@ -1158,6 +1217,8 @@ export const localeItBundle: Readonly<Record<string, string>> = {
1158
1217
  "template-resolver.editor.saved": "Salvato.",
1159
1218
  "template-resolver.editor.saving": "Salvataggio…",
1160
1219
  "template-resolver.editor.titleLabel": "Titolo",
1220
+ "templateResolver.errors.document.imagesBlockPdfOnly":
1221
+ "I blocchi di foto sono consentiti solo nei documenti PDF.",
1161
1222
  "templateResolver.errors.document.buttonHrefNotPlaceholder":
1162
1223
  "La destinazione del pulsante «{detail}» deve essere un segnaposto.",
1163
1224
  "templateResolver.errors.document.disallowedLinkHref":
@@ -1192,6 +1253,10 @@ export const localeItBundle: Readonly<Record<string, string>> = {
1192
1253
  "Questo link non è valido o è scaduto. Usa il link per annullare l'iscrizione di un'e-mail più recente.",
1193
1254
  "templateResolver.errors.systemOnlyTemplate":
1194
1255
  "Solo la piattaforma gestisce questo modello; non può essere sostituito per singola organizzazione.",
1256
+ "templateResolver.errors.templateNotTenantEditable":
1257
+ "Solo la piattaforma può modificare questo modello.",
1258
+ "templateResolver.overview.lockedOverride":
1259
+ "Versione propria salvata ma non consegnata: il modello non è abilitato per le organizzazioni.",
1195
1260
  "templateResolver.errors.template.targetExists":
1196
1261
  "Esiste già un modello per la lingua «{detail}»; sovrascrivilo esplicitamente per sostituirlo.",
1197
1262
  "templateResolver.warnings.resourceNotUploaded": "Immagine non caricata: {detail}",
@@ -1499,6 +1564,11 @@ export const localeItBundle: Readonly<Record<string, string>> = {
1499
1564
  "Modifica il layout delle e-mail o la carta intestata PDF.",
1500
1565
  "documentDesigner.search": "Cerca modelli",
1501
1566
  "documentDesigner.action.edit": "Modifica",
1567
+ "documentDesigner.status.lockedOverride": "Non consegnata",
1568
+ "documentDesigner.action.resetLockedOverride": "Rimuovi versione propria",
1569
+ "documentDesigner.action.resetLockedOverride.confirm":
1570
+ "La versione propria salvata di una lingua (prima il tedesco) viene archiviata e resta in uso la versione della piattaforma. Se il modello ha più lingue, l'operazione va ripetuta per ciascuna.",
1571
+ "documentDesigner.action.resetLockedOverride.confirmLabel": "Rimuovi",
1502
1572
  "documentDesigner.col.template": "Modello",
1503
1573
  "documentDesigner.col.kind": "Tipo",
1504
1574
  "documentDesigner.col.origin": "Origine",
@@ -1526,7 +1596,8 @@ export const localeItBundle: Readonly<Record<string, string>> = {
1526
1596
  "documentDesigner.status.draftVersion": "Bozza v{version}",
1527
1597
  "documentDesigner.usedBy.allMails": "tutte le e-mail",
1528
1598
  "documentDesigner.usedBy.allPdfs": "tutti i PDF",
1529
- "documentDesigner.usedBy.templates": "{count} modelli",
1599
+ "documentDesigner.usedBy.templates.one": "1 modello",
1600
+ "documentDesigner.usedBy.templates.other": "{count} modelli",
1530
1601
  "documentDesigner.usedBy.title": "Usato da",
1531
1602
  "documentDesigner.usedBy.none": "Nessun modello usa ancora questo layout.",
1532
1603
  "documentDesigner.overriddenBy.tenants": "{active} organizzazioni",
@@ -1590,9 +1661,13 @@ export const localeItBundle: Readonly<Record<string, string>> = {
1590
1661
  "documentDesigner.editor.origin.none": "Non esiste ancora alcun layout.",
1591
1662
  "documentDesigner.editor.origin.system":
1592
1663
  "Stai guardando il layout di sistema. Salvando crei una personalizzazione per la tua organizzazione.",
1593
- "documentDesigner.editor.origin.tenant.mails":
1664
+ "documentDesigner.editor.origin.tenant.mails.one":
1665
+ "Sostituisce il layout di sistema v{version}. Vale per 1 modello di e-mail di questa organizzazione.",
1666
+ "documentDesigner.editor.origin.tenant.mails.other":
1594
1667
  "Sostituisce il layout di sistema v{version}. Vale per {count} modelli di e-mail di questa organizzazione.",
1595
- "documentDesigner.editor.origin.tenant.pdfs":
1668
+ "documentDesigner.editor.origin.tenant.pdfs.one":
1669
+ "Sostituisce la carta intestata di sistema v{version}. Vale per 1 modello PDF di questa organizzazione.",
1670
+ "documentDesigner.editor.origin.tenant.pdfs.other":
1596
1671
  "Sostituisce la carta intestata di sistema v{version}. Vale per {count} modelli PDF di questa organizzazione.",
1597
1672
  "documentDesigner.editor.origin.platformPlain": "Layout di sistema v{version}",
1598
1673
  "documentDesigner.editor.origin.platformCount":
@@ -1616,9 +1691,13 @@ export const localeItBundle: Readonly<Record<string, string>> = {
1616
1691
  "Il contenuto di ogni modello di e-mail viene inserito qui. Oggetto e testo di anteprima provengono dal modello.",
1617
1692
  "documentDesigner.editor.slot.pdf": "Il contenuto di ogni modello PDF viene inserito qui.",
1618
1693
  "documentDesigner.editor.footer.checking": "Controllo del layout in corso …",
1619
- "documentDesigner.editor.footer.okMail":
1694
+ "documentDesigner.editor.footer.okMail.one":
1695
+ "Segnaposto del contenuto presente. Dopo la pubblicazione la modifica vale per 1 modello.",
1696
+ "documentDesigner.editor.footer.okMail.other":
1620
1697
  "Segnaposto del contenuto presente. Dopo la pubblicazione la modifica vale per {count} modelli.",
1621
- "documentDesigner.editor.footer.okPdf":
1698
+ "documentDesigner.editor.footer.okPdf.one":
1699
+ "Segnaposto del contenuto presente. Dopo la pubblicazione la modifica vale per 1 modello.",
1700
+ "documentDesigner.editor.footer.okPdf.other":
1622
1701
  "Segnaposto del contenuto presente. Dopo la pubblicazione la modifica vale per {count} modelli.",
1623
1702
  "documentDesigner.editor.discard": "Scarta le modifiche",
1624
1703
  "documentDesigner.editor.save": "Salva",
@@ -1676,6 +1755,12 @@ export const localeItBundle: Readonly<Record<string, string>> = {
1676
1755
  "documentDesigner.mail.resource.title": "Risorse",
1677
1756
  "documentDesigner.mail.resource.upload": "+ Carica",
1678
1757
  "documentDesigner.mail.resource.saveFirst": "Salva prima, poi carica.",
1758
+ "documentDesigner.mail.resource.noFilesFeature":
1759
+ "I caricamenti richiedono la funzione file, che questa app non ha incluso.",
1760
+ "documentDesigner.mail.testMail.unavailable.noChannel":
1761
+ "Le e-mail di prova richiedono il canale e-mail, che questa app non ha incluso.",
1762
+ "documentDesigner.mail.testMail.unavailable.noAddress":
1763
+ "Non è salvato alcun indirizzo e-mail per te, quindi non è possibile inviare un'e-mail di prova.",
1679
1764
  "documentDesigner.mail.resource.inline": "In linea",
1680
1765
  "documentDesigner.mail.resource.attachment": "Allegato",
1681
1766
  "documentDesigner.mail.resource.fromPdf": "Allegato · da «{title}»",
@@ -1722,7 +1807,7 @@ export const localeItBundle: Readonly<Record<string, string>> = {
1722
1807
  "Le e-mail transazionali non richiedono un link per annullare l'iscrizione. Con «Marketing» il layout deve fornirne uno.",
1723
1808
  "documentDesigner.mail.chrome.title": "Intestazione e piè di pagina",
1724
1809
  "documentDesigner.mail.chrome.headerChip": "Etichetta nell'intestazione",
1725
- "documentDesigner.mail.chrome.headerChipPlaceholder": "ad es. Nuovo incidente",
1810
+ "documentDesigner.mail.chrome.headerChipPlaceholder": "ad es. Promemoria",
1726
1811
  "documentDesigner.mail.chrome.tone": "Tono",
1727
1812
  "documentDesigner.mail.chrome.toneAccent": "Colore principale (predefinito)",
1728
1813
  "documentDesigner.mail.chrome.toneInfo": "Info (grigio-azzurro)",
@@ -1791,7 +1876,8 @@ export const localeItBundle: Readonly<Record<string, string>> = {
1791
1876
  "documentDesigner.mail.preview.samplesHint":
1792
1877
  "Importi e date sono formattati secondo le impostazioni dell'organizzazione.",
1793
1878
  "documentDesigner.mail.preview.missingInContent": "manca nel contenuto",
1794
- "documentDesigner.mail.preview.entries": "{count} voci",
1879
+ "documentDesigner.mail.preview.entries.one": "1 voce",
1880
+ "documentDesigner.mail.preview.entries.other": "{count} voci",
1795
1881
  "documentDesigner.mail.preview.checks": "Controlli",
1796
1882
  "documentDesigner.mail.preview.checksHint":
1797
1883
  "Ciò che il server ha rilevato durante il rendering di questa e-mail.",
@@ -1809,13 +1895,14 @@ export const localeItBundle: Readonly<Record<string, string>> = {
1809
1895
  "documentDesigner.mail.testMail.rateLimited": "Troppe e-mail di prova, riprova più tardi.",
1810
1896
  "screen:mail-foundation-tenant.title": "Invio delle e-mail",
1811
1897
  "mail-foundation.settings": "Invio delle e-mail",
1812
- "mail-foundation.provider": "Server di posta proprio",
1898
+ "mail-foundation.provider": "Invia tramite",
1813
1899
  "mail-foundation.provider.description":
1814
- "Senza un server proprio, le e-mail vengono inviate dalla piattaforma. Reimposta la scelta per tornare a questa modalità.",
1900
+ "Scegli chi invia le tue e-mail. L'invio dalla piattaforma non richiede impostazioni proprie.",
1901
+ "mail-foundation.provider.platformDefault": "Invio dalla piattaforma (predefinito)",
1815
1902
  "mail-transport-inmemory.settings": "Casella di prova (in memoria)",
1816
- "mail-transport-smtp.settings": "Server SMTP",
1817
- "screen:mail-foundation-tenant-selection.title": "Provider",
1818
- "config:entity:__config-edit__:field:provider:option:smtp": "Server SMTP",
1903
+ "mail-transport-smtp.settings": "Server SMTP proprio",
1904
+ "config:entity:__config-edit__:field:provider:option:": "Invio dalla piattaforma (predefinito)",
1905
+ "config:entity:__config-edit__:field:provider:option:smtp": "Server SMTP proprio",
1819
1906
  "mail-transport-smtp.settings.secrets": "Accesso SMTP",
1820
1907
  "mail-transport-smtp.settings.description":
1821
1908
  "I dati di connessione provengono dal tuo provider di posta, ad esempio Brevo, Postmark, Amazon SES o il tuo server.",
@@ -1,37 +0,0 @@
1
- import { describe, expect, test } from "bun:test";
2
- import { localeItBundle } 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-it completeness", () => {
10
- test("has every English framework key", () => {
11
- const missing = Object.keys(frameworkEnCatalog).filter((k) => localeItBundle[k] === undefined);
12
- expect(missing).toEqual([]);
13
- });
14
-
15
- test("has no stale extra keys", () => {
16
- const extra = Object.keys(localeItBundle).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(localeItBundle[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(localeItBundle)) {
32
- if (roleAllowlist.has(value)) continue;
33
- if (/\btenants?\b/i.test(value)) offenders.push(key);
34
- }
35
- expect(offenders).toEqual([]);
36
- });
37
- });