@cosmicdrift/kumiko-locale-it 0.378.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.378.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.378.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.",
@@ -527,10 +531,18 @@ export const localeItBundle: Readonly<Record<string, string>> = {
527
531
  "errors.unconfigured": "Questa funzione non è ancora configurata.",
528
532
  "errors.uniqueViolation": "Questa voce esiste già.",
529
533
  "errors.unprocessable": "Non è stato possibile elaborare la richiesta.",
534
+ "errors.file.violatesBindTarget":
535
+ "Questo file non soddisfa i requisiti del campo di destinazione.",
530
536
  "errors.validation.custom": "Valore non valido.",
531
537
  "errors.validation.failed": "Convalida non riuscita.",
532
538
  "errors.validation.invalid_element": "Voce non valida.",
533
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.",
534
546
  "errors.validation.invalid_key": "Chiave non valida.",
535
547
  "errors.validation.invalid_option": "Scelta non valida.",
536
548
  "errors.validation.invalid_type": "Valore non valido.",
@@ -547,6 +559,8 @@ export const localeItBundle: Readonly<Record<string, string>> = {
547
559
  "kumiko.validation.number.min": "Deve essere almeno {minimum}.",
548
560
  "kumiko.validation.number.max": "Deve essere {maximum} o meno.",
549
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.",
550
564
  "errors.validation.unexpected_field": "Campo sconosciuto.",
551
565
  "errors.validation.unrecognized_keys": "Campi sconosciuti.",
552
566
  "errors.versionConflict": "Il record è stato modificato nel frattempo. Ricarica e riprova.",
@@ -742,18 +756,24 @@ export const localeItBundle: Readonly<Record<string, string>> = {
742
756
  "kumiko.field.embedded-list.empty-cta": "Aggiungi la prima riga",
743
757
  "kumiko.field.embedded-list.move-down": "Sposta giù",
744
758
  "kumiko.field.embedded-list.move-up": "Sposta su",
745
- "kumiko.field.embedded-list.paste-cells-unmatched":
746
- "{count} cella/e senza opzione corrispondente sono state lasciate invariate.",
747
- "kumiko.field.embedded-list.paste-rows-truncated":
748
- "{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).",
749
767
  "kumiko.field.embedded-list.remove-row": "Rimuovi riga",
750
768
  "kumiko.field.file-list.add": "Aggiungi file",
751
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",
752
773
  "kumiko.field.file-list.move-down": "Sposta il file giù",
753
774
  "kumiko.field.file-list.move-up": "Sposta il file su",
754
775
  "kumiko.field.file-upload.attached": "File allegato",
755
776
  "kumiko.field.file-upload.change": "Cambia",
756
- "kumiko.field.file-upload.failed": "Caricamento non riuscito",
757
777
  "kumiko.field.file-upload.remove": "Rimuovi",
758
778
  "kumiko.field.file-upload.upload": "Carica",
759
779
  "kumiko.field.fillAction.failed": "Impossibile recuperare un suggerimento.",
@@ -803,6 +823,9 @@ export const localeItBundle: Readonly<Record<string, string>> = {
803
823
  "kumiko.list.count.one": "1 voce",
804
824
  "kumiko.list.count.other": "{count} voci",
805
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",
806
829
  "kumiko.list.empty.hint": "Crea la prima per iniziare.",
807
830
  "kumiko.list.empty.title": "Ancora nessuna voce.",
808
831
  "kumiko.list.end-of-list": "— Fine dell'elenco —",
@@ -842,6 +865,7 @@ export const localeItBundle: Readonly<Record<string, string>> = {
842
865
  "kumiko.planCard.priceUnavailable": "Prezzo non disponibile",
843
866
  "kumiko.reference.system-tenant": "Sistema",
844
867
  "kumiko.reference.system-user": "Sistema",
868
+ "kumiko.reference.unknown-user": "Sconosciuto",
845
869
  "kumiko.rowAction.failed": "Azione non riuscita",
846
870
  "kumiko.clientAction.success": "Fatto.",
847
871
  "kumiko.clientAction.unregistered": "Questa azione non è disponibile in questa app.",
@@ -878,6 +902,10 @@ export const localeItBundle: Readonly<Record<string, string>> = {
878
902
  "kumiko.widget.upload.done": "Caricato",
879
903
  "kumiko.widget.upload.error": "Non riuscito",
880
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",
881
909
  "kumiko.widget.upload.uploading": "Caricamento in corso…",
882
910
  "kumiko.wizard.next-with-title": "Avanti: {title}",
883
911
  "kumiko.wizard.save-and-close": "Salva e chiudi",
@@ -1003,6 +1031,8 @@ export const localeItBundle: Readonly<Record<string, string>> = {
1003
1031
  "secrets.errors.invalidValue": "Questo valore non è valido per questo segreto.",
1004
1032
  "screen:api-token-create.title": "Crea un nuovo token",
1005
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)",
1006
1036
  "screen:audit-log-detail.title": "Evento",
1007
1037
  "screen:audit-log.title": "Registro di audit",
1008
1038
  "screen:auth-mfa-disable.title": "Disattiva l'autenticazione a due fattori",
@@ -1086,7 +1116,9 @@ export const localeItBundle: Readonly<Record<string, string>> = {
1086
1116
  "tags.manage.cancel": "Annulla",
1087
1117
  "tags.manage.create": "Crea etichetta",
1088
1118
  "tags.manage.delete": "Elimina",
1089
- "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":
1090
1122
  "La rimuove da {count} oggetti. L'azione non può essere annullata.",
1091
1123
  "tags.manage.deleteConfirmTitle": "Eliminare l'etichetta «{name}»?",
1092
1124
  "tags.manage.edit": "Modifica",
@@ -1108,6 +1140,24 @@ export const localeItBundle: Readonly<Record<string, string>> = {
1108
1140
  "tags:entity:tag:field:color": "Colore",
1109
1141
  "tags:entity:tag:field:name": "Nome",
1110
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",
1111
1161
  "template-resolver.documentEditor.button": "Pulsante",
1112
1162
  "template-resolver.documentEditor.buttonDefaultText": "Conferma",
1113
1163
  "template-resolver.documentEditor.buttonTarget": "Destinazione del pulsante",
@@ -1205,6 +1255,8 @@ export const localeItBundle: Readonly<Record<string, string>> = {
1205
1255
  "Solo la piattaforma gestisce questo modello; non può essere sostituito per singola organizzazione.",
1206
1256
  "templateResolver.errors.templateNotTenantEditable":
1207
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.",
1208
1260
  "templateResolver.errors.template.targetExists":
1209
1261
  "Esiste già un modello per la lingua «{detail}»; sovrascrivilo esplicitamente per sostituirlo.",
1210
1262
  "templateResolver.warnings.resourceNotUploaded": "Immagine non caricata: {detail}",
@@ -1512,6 +1564,11 @@ export const localeItBundle: Readonly<Record<string, string>> = {
1512
1564
  "Modifica il layout delle e-mail o la carta intestata PDF.",
1513
1565
  "documentDesigner.search": "Cerca modelli",
1514
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",
1515
1572
  "documentDesigner.col.template": "Modello",
1516
1573
  "documentDesigner.col.kind": "Tipo",
1517
1574
  "documentDesigner.col.origin": "Origine",
@@ -1539,7 +1596,8 @@ export const localeItBundle: Readonly<Record<string, string>> = {
1539
1596
  "documentDesigner.status.draftVersion": "Bozza v{version}",
1540
1597
  "documentDesigner.usedBy.allMails": "tutte le e-mail",
1541
1598
  "documentDesigner.usedBy.allPdfs": "tutti i PDF",
1542
- "documentDesigner.usedBy.templates": "{count} modelli",
1599
+ "documentDesigner.usedBy.templates.one": "1 modello",
1600
+ "documentDesigner.usedBy.templates.other": "{count} modelli",
1543
1601
  "documentDesigner.usedBy.title": "Usato da",
1544
1602
  "documentDesigner.usedBy.none": "Nessun modello usa ancora questo layout.",
1545
1603
  "documentDesigner.overriddenBy.tenants": "{active} organizzazioni",
@@ -1603,9 +1661,13 @@ export const localeItBundle: Readonly<Record<string, string>> = {
1603
1661
  "documentDesigner.editor.origin.none": "Non esiste ancora alcun layout.",
1604
1662
  "documentDesigner.editor.origin.system":
1605
1663
  "Stai guardando il layout di sistema. Salvando crei una personalizzazione per la tua organizzazione.",
1606
- "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":
1607
1667
  "Sostituisce il layout di sistema v{version}. Vale per {count} modelli di e-mail di questa organizzazione.",
1608
- "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":
1609
1671
  "Sostituisce la carta intestata di sistema v{version}. Vale per {count} modelli PDF di questa organizzazione.",
1610
1672
  "documentDesigner.editor.origin.platformPlain": "Layout di sistema v{version}",
1611
1673
  "documentDesigner.editor.origin.platformCount":
@@ -1629,9 +1691,13 @@ export const localeItBundle: Readonly<Record<string, string>> = {
1629
1691
  "Il contenuto di ogni modello di e-mail viene inserito qui. Oggetto e testo di anteprima provengono dal modello.",
1630
1692
  "documentDesigner.editor.slot.pdf": "Il contenuto di ogni modello PDF viene inserito qui.",
1631
1693
  "documentDesigner.editor.footer.checking": "Controllo del layout in corso …",
1632
- "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":
1633
1697
  "Segnaposto del contenuto presente. Dopo la pubblicazione la modifica vale per {count} modelli.",
1634
- "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":
1635
1701
  "Segnaposto del contenuto presente. Dopo la pubblicazione la modifica vale per {count} modelli.",
1636
1702
  "documentDesigner.editor.discard": "Scarta le modifiche",
1637
1703
  "documentDesigner.editor.save": "Salva",
@@ -1741,7 +1807,7 @@ export const localeItBundle: Readonly<Record<string, string>> = {
1741
1807
  "Le e-mail transazionali non richiedono un link per annullare l'iscrizione. Con «Marketing» il layout deve fornirne uno.",
1742
1808
  "documentDesigner.mail.chrome.title": "Intestazione e piè di pagina",
1743
1809
  "documentDesigner.mail.chrome.headerChip": "Etichetta nell'intestazione",
1744
- "documentDesigner.mail.chrome.headerChipPlaceholder": "ad es. Nuovo incidente",
1810
+ "documentDesigner.mail.chrome.headerChipPlaceholder": "ad es. Promemoria",
1745
1811
  "documentDesigner.mail.chrome.tone": "Tono",
1746
1812
  "documentDesigner.mail.chrome.toneAccent": "Colore principale (predefinito)",
1747
1813
  "documentDesigner.mail.chrome.toneInfo": "Info (grigio-azzurro)",
@@ -1810,7 +1876,8 @@ export const localeItBundle: Readonly<Record<string, string>> = {
1810
1876
  "documentDesigner.mail.preview.samplesHint":
1811
1877
  "Importi e date sono formattati secondo le impostazioni dell'organizzazione.",
1812
1878
  "documentDesigner.mail.preview.missingInContent": "manca nel contenuto",
1813
- "documentDesigner.mail.preview.entries": "{count} voci",
1879
+ "documentDesigner.mail.preview.entries.one": "1 voce",
1880
+ "documentDesigner.mail.preview.entries.other": "{count} voci",
1814
1881
  "documentDesigner.mail.preview.checks": "Controlli",
1815
1882
  "documentDesigner.mail.preview.checksHint":
1816
1883
  "Ciò che il server ha rilevato durante il rendering di questa e-mail.",
@@ -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
- });