@eifi1/ui-kit 0.17.0 → 0.19.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.
Files changed (210) hide show
  1. package/README.md +83 -4
  2. package/dist/chart.d.ts +13 -1
  3. package/dist/components/account-chips.d.ts +153 -0
  4. package/dist/components/account-chips.js +135 -0
  5. package/dist/components/account-chips.js.map +1 -0
  6. package/dist/components/account-settings-labels.d.ts +10 -2
  7. package/dist/components/account-settings-labels.js +3 -0
  8. package/dist/components/account-settings-labels.js.map +1 -1
  9. package/dist/components/amount-input.d.ts +13 -1
  10. package/dist/components/button-group.d.ts +13 -1
  11. package/dist/components/calculator.d.ts +13 -1
  12. package/dist/components/chip.d.ts +25 -1
  13. package/dist/components/chip.js +143 -6
  14. package/dist/components/chip.js.map +1 -1
  15. package/dist/components/confirm-dialog.d.ts +42 -1
  16. package/dist/components/confirm-dialog.js +36 -5
  17. package/dist/components/confirm-dialog.js.map +1 -1
  18. package/dist/components/copy-button.d.ts +13 -1
  19. package/dist/components/danger-confirm.d.ts +55 -4
  20. package/dist/components/danger-confirm.js +67 -30
  21. package/dist/components/danger-confirm.js.map +1 -1
  22. package/dist/components/data-table-cells.d.ts +1 -1
  23. package/dist/components/data-table-filter-popover.d.ts +1 -1
  24. package/dist/components/data-table-filters.d.ts +1 -1
  25. package/dist/components/data-table.d.ts +1 -1
  26. package/dist/components/data-table.js +2 -0
  27. package/dist/components/data-table.js.map +1 -1
  28. package/dist/components/facing-pair.d.ts +13 -1
  29. package/dist/components/file-button.d.ts +13 -1
  30. package/dist/components/file-dropzone.d.ts +13 -1
  31. package/dist/components/floating-panel.d.ts +4 -1
  32. package/dist/components/floating-panel.js +15 -1
  33. package/dist/components/floating-panel.js.map +1 -1
  34. package/dist/components/form-actions.d.ts +13 -1
  35. package/dist/components/form-actions.js +3 -0
  36. package/dist/components/form-actions.js.map +1 -1
  37. package/dist/components/legal.d.ts +84 -0
  38. package/dist/components/legal.js +55 -0
  39. package/dist/components/legal.js.map +1 -0
  40. package/dist/components/money-field.d.ts +13 -1
  41. package/dist/components/number-field.d.ts +14 -2
  42. package/dist/components/number-field.js +23 -22
  43. package/dist/components/number-field.js.map +1 -1
  44. package/dist/components/number-input.d.ts +13 -1
  45. package/dist/components/numpad-sheet.d.ts +13 -1
  46. package/dist/components/passkeys-setting.d.ts +27 -1
  47. package/dist/components/passkeys-setting.js +31 -5
  48. package/dist/components/passkeys-setting.js.map +1 -1
  49. package/dist/components/progress-bar.d.ts +15 -1
  50. package/dist/components/progress-bar.js +8 -1
  51. package/dist/components/progress-bar.js.map +1 -1
  52. package/dist/components/reauth-dialog.d.ts +90 -0
  53. package/dist/components/reauth-dialog.js +158 -0
  54. package/dist/components/reauth-dialog.js.map +1 -0
  55. package/dist/components/series-chart.d.ts +13 -1
  56. package/dist/components/server-wake.d.ts +60 -0
  57. package/dist/components/server-wake.js +79 -0
  58. package/dist/components/server-wake.js.map +1 -0
  59. package/dist/components/settings-fields.d.ts +13 -1
  60. package/dist/components/share-card.d.ts +64 -0
  61. package/dist/components/share-card.js +350 -0
  62. package/dist/components/share-card.js.map +1 -0
  63. package/dist/components/status-dot.d.ts +2 -0
  64. package/dist/components/text-link.d.ts +13 -1
  65. package/dist/components/time-input.d.ts +13 -1
  66. package/dist/components/toast.d.ts +10 -1
  67. package/dist/components/toast.js +42 -2
  68. package/dist/components/toast.js.map +1 -1
  69. package/dist/components/toggle-group.js +5 -2
  70. package/dist/components/toggle-group.js.map +1 -1
  71. package/dist/components/translation-review-editor.d.ts +56 -0
  72. package/dist/components/translation-review-editor.js +159 -0
  73. package/dist/components/translation-review-editor.js.map +1 -0
  74. package/dist/components/translation-review-labels.d.ts +92 -0
  75. package/dist/components/translation-review-labels.js +67 -0
  76. package/dist/components/translation-review-labels.js.map +1 -0
  77. package/dist/components/translation-review-parts.d.ts +97 -0
  78. package/dist/components/translation-review-parts.js +163 -0
  79. package/dist/components/translation-review-parts.js.map +1 -0
  80. package/dist/components/translation-review.d.ts +94 -0
  81. package/dist/components/translation-review.js +344 -0
  82. package/dist/components/translation-review.js.map +1 -0
  83. package/dist/components/ui.d.ts +13 -1
  84. package/dist/components/ui.js +43 -28
  85. package/dist/components/ui.js.map +1 -1
  86. package/dist/components/use-table-state.d.ts +1 -1
  87. package/dist/components/user-avatar.d.ts +2 -0
  88. package/dist/components/write-lock.d.ts +68 -0
  89. package/dist/components/write-lock.js +33 -0
  90. package/dist/components/write-lock.js.map +1 -0
  91. package/dist/{data-table-CpkWUJBY.d.ts → data-table-3mi2R3so.d.ts} +19 -1
  92. package/dist/data-table.d.ts +1 -1
  93. package/dist/hooks/use-file-drop.d.ts +13 -1
  94. package/dist/hooks/use-overlay-history.js +16 -0
  95. package/dist/hooks/use-overlay-history.js.map +1 -1
  96. package/dist/i18n/defaults.d.ts +13 -1
  97. package/dist/i18n/defaults.js +15 -1
  98. package/dist/i18n/defaults.js.map +1 -1
  99. package/dist/i18n/german.d.ts +81 -0
  100. package/dist/i18n/{locales/de.js → german.js} +110 -9
  101. package/dist/i18n/german.js.map +1 -0
  102. package/dist/i18n/kit-labels.d.ts +13 -1
  103. package/dist/i18n/kit-labels.js +5 -0
  104. package/dist/i18n/kit-labels.js.map +1 -1
  105. package/dist/i18n/languages.d.ts +243 -0
  106. package/dist/i18n/languages.js +70 -0
  107. package/dist/i18n/languages.js.map +1 -0
  108. package/dist/i18n/locales/de-CH.d.ts +26 -8
  109. package/dist/i18n/locales/de-CH.js +7 -3
  110. package/dist/i18n/locales/de-CH.js.map +1 -1
  111. package/dist/i18n/locales/en.d.ts +13 -1
  112. package/dist/i18n/locales/en.js +8 -0
  113. package/dist/i18n/locales/en.js.map +1 -1
  114. package/dist/i18n/locales/es.d.ts +13 -1
  115. package/dist/i18n/locales/es.js +127 -27
  116. package/dist/i18n/locales/es.js.map +1 -1
  117. package/dist/i18n/locales/fr.d.ts +13 -1
  118. package/dist/i18n/locales/fr.js +101 -1
  119. package/dist/i18n/locales/fr.js.map +1 -1
  120. package/dist/i18n/locales/hu.d.ts +13 -1
  121. package/dist/i18n/locales/hu.js +105 -1
  122. package/dist/i18n/locales/hu.js.map +1 -1
  123. package/dist/i18n/locales/it.d.ts +13 -1
  124. package/dist/i18n/locales/it.js +134 -34
  125. package/dist/i18n/locales/it.js.map +1 -1
  126. package/dist/i18n/locales/zh.d.ts +13 -1
  127. package/dist/i18n/locales/zh.js +101 -1
  128. package/dist/i18n/locales/zh.js.map +1 -1
  129. package/dist/i18n/review.d.ts +102 -0
  130. package/dist/i18n/review.js +158 -0
  131. package/dist/i18n/review.js.map +1 -0
  132. package/dist/i18n/swiss.d.ts +3 -3
  133. package/dist/i18n/swiss.js.map +1 -1
  134. package/dist/index.d.ts +17 -4
  135. package/dist/index.js +97 -1
  136. package/dist/index.js.map +1 -1
  137. package/dist/{kit-labels-C4uB_zmg.d.ts → kit-labels-D1J2_jyD.d.ts} +236 -9
  138. package/dist/lib/floating-stack.d.ts +31 -0
  139. package/dist/lib/floating-stack.js +42 -0
  140. package/dist/lib/floating-stack.js.map +1 -0
  141. package/dist/lib/server-wake.d.ts +146 -0
  142. package/dist/lib/server-wake.js +122 -0
  143. package/dist/lib/server-wake.js.map +1 -0
  144. package/dist/lib/translation-review.d.ts +232 -0
  145. package/dist/lib/translation-review.js +194 -0
  146. package/dist/lib/translation-review.js.map +1 -0
  147. package/dist/rhf/fields.d.ts +13 -1
  148. package/dist/rhf/form.d.ts +13 -1
  149. package/dist/rhf.d.ts +13 -1
  150. package/dist/search/global-search.d.ts +3 -1
  151. package/dist/search/global-search.js.map +1 -1
  152. package/dist/shell/app-shell.d.ts +13 -1
  153. package/dist/shell/top-bar-brand.d.ts +13 -1
  154. package/dist/shell/topbar-action-menu.d.ts +2 -0
  155. package/dist/shell.d.ts +13 -1
  156. package/dist/wizard/stepper-nav.d.ts +13 -1
  157. package/dist/wizard.d.ts +13 -1
  158. package/package.json +1 -1
  159. package/src/components/account-chips.tsx +302 -0
  160. package/src/components/account-settings-labels.ts +16 -2
  161. package/src/components/chip.tsx +239 -6
  162. package/src/components/confirm-dialog.tsx +82 -7
  163. package/src/components/danger-confirm.tsx +118 -33
  164. package/src/components/data-table.tsx +20 -0
  165. package/src/components/floating-panel.tsx +19 -1
  166. package/src/components/form-actions.tsx +22 -3
  167. package/src/components/legal.tsx +159 -0
  168. package/src/components/number-field.tsx +32 -26
  169. package/src/components/passkeys-setting.tsx +68 -7
  170. package/src/components/progress-bar.tsx +21 -1
  171. package/src/components/reauth-dialog.tsx +273 -0
  172. package/src/components/server-wake.tsx +156 -0
  173. package/src/components/share-card.tsx +615 -0
  174. package/src/components/toast.tsx +72 -2
  175. package/src/components/toggle-group.tsx +5 -2
  176. package/src/components/translation-review-editor.tsx +261 -0
  177. package/src/components/translation-review-labels.ts +152 -0
  178. package/src/components/translation-review-parts.tsx +269 -0
  179. package/src/components/translation-review.tsx +502 -0
  180. package/src/components/ui.tsx +89 -32
  181. package/src/components/write-lock.tsx +96 -0
  182. package/src/hooks/use-overlay-history.ts +51 -0
  183. package/src/i18n/defaults.ts +14 -0
  184. package/src/i18n/{locales/de.ts → german.ts} +120 -13
  185. package/src/i18n/kit-labels.tsx +29 -2
  186. package/src/i18n/languages.ts +285 -0
  187. package/src/i18n/locales/de-CH.ts +17 -8
  188. package/src/i18n/locales/en.ts +8 -0
  189. package/src/i18n/locales/es.ts +128 -26
  190. package/src/i18n/locales/fr.ts +103 -0
  191. package/src/i18n/locales/hu.ts +107 -0
  192. package/src/i18n/locales/it.ts +135 -33
  193. package/src/i18n/locales/zh.ts +102 -0
  194. package/src/i18n/review.ts +193 -0
  195. package/src/i18n/swiss.ts +3 -3
  196. package/src/index.ts +86 -1
  197. package/src/lib/floating-stack.ts +66 -0
  198. package/src/lib/server-wake.ts +291 -0
  199. package/src/lib/translation-review.ts +465 -0
  200. package/src/search/global-search.tsx +3 -1
  201. package/dist/i18n/locales/de-CH-informal.d.ts +0 -61
  202. package/dist/i18n/locales/de-CH-informal.js +0 -8
  203. package/dist/i18n/locales/de-CH-informal.js.map +0 -1
  204. package/dist/i18n/locales/de-informal.d.ts +0 -82
  205. package/dist/i18n/locales/de-informal.js +0 -37
  206. package/dist/i18n/locales/de-informal.js.map +0 -1
  207. package/dist/i18n/locales/de.d.ts +0 -66
  208. package/dist/i18n/locales/de.js.map +0 -1
  209. package/src/i18n/locales/de-CH-informal.ts +0 -10
  210. package/src/i18n/locales/de-informal.ts +0 -61
@@ -19,12 +19,12 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
19
19
  feedbackAttachment: {
20
20
  attachmentAdd: "Allega immagine",
21
21
  attachmentCapture: "Cattura schermata",
22
- attachmentPaste: "…oppure incolla uno screenshot dagli appunti.",
22
+ attachmentPaste: "…oppure incolli uno screenshot dagli appunti.",
23
23
  attachmentRemove: "Rimuovi allegato",
24
24
  attachmentList: "Allegati",
25
25
  attachmentScreenshot: "Screenshot",
26
26
  attachmentRemoveFile: (name) => `Rimuovi ${name}`,
27
- attachmentLimit: (max) => `Massimo ${n(max)} ${max === 1 ? "allegato" : "allegati"}: rimuovine uno per aggiungerne un altro.`,
27
+ attachmentLimit: (max) => `Massimo ${n(max)} ${max === 1 ? "allegato" : "allegati"}: ne rimuova uno per aggiungerne un altro.`,
28
28
  },
29
29
  feedbackDialog: {
30
30
  title: "Invia feedback",
@@ -41,13 +41,13 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
41
41
  thread: "Commenti",
42
42
  empty: "Ancora nessun commento",
43
43
  loading: "Caricamento dei commenti…",
44
- you: "Tu",
44
+ you: "Lei",
45
45
  staff: "Team",
46
46
  attachments: "Allegati",
47
47
  },
48
48
  feedbackComposer: {
49
- field: "Scrivi un commento",
50
- placeholder: "Scrivi un commento…",
49
+ field: "Scriva un commento",
50
+ placeholder: "Scriva un commento…",
51
51
  send: "Invia",
52
52
  sendHint: (modifier) => `${modifier} + Invio per inviare`,
53
53
  sendHintEnter: "Invio per inviare, Maiusc + Invio per andare a capo",
@@ -76,22 +76,23 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
76
76
  disabledText: "Non attiva",
77
77
  enable: "Configura l’autenticazione a due fattori",
78
78
  scanHint:
79
- "Scansiona questo codice con la tua app di autenticazione, poi inserisci il codice che mostra.",
79
+ "Scansioni questo codice con la Sua app di autenticazione, poi inserisca il codice che mostra.",
80
80
  codeLabel: "Codice di verifica",
81
81
  verify: "Verifica e attiva",
82
82
  disableSection: "Disattiva l’autenticazione a due fattori",
83
83
  password: "Password attuale",
84
84
  disable: "Disattiva",
85
- qrAlt: "Codice QR per la tua app di autenticazione",
86
- secretHint: "Non riesci a scansionarlo? Inserisci invece questa chiave nell’app:",
85
+ qrAlt: "Codice QR per la Sua app di autenticazione",
86
+ secretHint: "Non riesce a scansionarlo? Inserisca invece questa chiave nell’app:",
87
87
  copySecret: "Copia chiave",
88
88
  },
89
89
  passkeys: {
90
90
  title: "Passkey",
91
- description: "Accedi con impronta, volto o PIN del dispositivo invece che con una password.",
91
+ description: "Acceda con impronta, volto o PIN del dispositivo invece che con una password.",
92
+ descriptionAlongside: "Acceda con impronta, volto o PIN del dispositivo. La Sua password continua a funzionare.",
92
93
  empty: "Ancora nessuna passkey",
93
94
  loading: "Caricamento delle passkey…",
94
- list: "Le tue passkey",
95
+ list: "Le Sue passkey",
95
96
  nameLabel: "Nome (facoltativo)",
96
97
  namePlaceholder: "ad es. Portatile, Telefono",
97
98
  add: "Aggiungi passkey",
@@ -117,12 +118,12 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
117
118
  addRow: "Aggiungi riga",
118
119
  removeRow: (row) => `Rimuovi riga ${row}`,
119
120
  clear: "Svuota tabella",
120
- pasteHint: "Incolla un blocco da un foglio di calcolo in qualsiasi cella",
121
+ pasteHint: "Incolli un blocco da un foglio di calcolo in qualsiasi cella",
121
122
  cell: (column, row) => `${column}, riga ${row}`,
122
123
  rowNumber: "Riga",
123
124
  rowActions: "Azioni riga",
124
125
  keyboardHint:
125
- "I tasti freccia spostano tra le celle. Digita per sostituire una cella, F2 per modificarla, Esc per annullare la modifica. Invio scende e aggiunge una riga alla fine.",
126
+ "I tasti freccia spostano tra le celle. Digiti per sostituire una cella, F2 per modificarla, Esc per annullare la modifica. Invio scende e aggiunge una riga alla fine.",
126
127
  lineError: (line) => `Impossibile leggere la riga ${line}`,
127
128
  points: (count) => (count === 1 ? "1 punto" : `${count} punti`),
128
129
  problems: (count) =>
@@ -148,7 +149,7 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
148
149
  dataTable: {
149
150
  columns: "Colonne",
150
151
  selectAllRows: "Seleziona tutte le righe",
151
- sortHint: "Fai clic per ordinare · Maiusc+clic per aggiungere un ordinamento",
152
+ sortHint: "Faccia clic per ordinare · Maiusc+clic per aggiungere un ordinamento",
152
153
  filter: "Filtra",
153
154
  close: "Chiudi",
154
155
  selectRow: "Seleziona riga",
@@ -207,13 +208,13 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
207
208
  nextMonth: "Mese successivo",
208
209
  // Already formatted in the provider's locale ("lunedì 14 settembre 2026").
209
210
  day: (date) => date,
210
- chooseStart: "Scegli una data di inizio",
211
- chooseEnd: "Scegli una data di fine",
211
+ chooseStart: "Scelga una data di inizio",
212
+ chooseEnd: "Scelga una data di fine",
212
213
  // "Data" is feminine and the formatted day cannot agree with a participle, so the
213
214
  // date follows a label instead of being the subject.
214
- startSelected: (date) => `Data di inizio: ${date}. Scegli una data di fine.`,
215
+ startSelected: (date) => `Data di inizio: ${date}. Scelga una data di fine.`,
215
216
  rangeSelected: (from, to) =>
216
- `Periodo selezionato: da ${from} a ${to}. Scegli una data di inizio per ricominciare.`,
217
+ `Periodo selezionato: da ${from} a ${to}. Scelga una data di inizio per ricominciare.`,
217
218
  },
218
219
  monthPicker: {
219
220
  previousYear: "Anno precedente",
@@ -255,7 +256,7 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
255
256
  selectedCount: (count) => `${n(count)} ${plural(count, "selezionato", "selezionati")}`,
256
257
  loadError: "Impossibile caricare i risultati",
257
258
  resultCount: (count) => `${n(count)} ${plural(count, "risultato", "risultati")}`,
258
- minChars: (count) => `Digita almeno ${n(count)} ${plural(count, "carattere", "caratteri")}`,
259
+ minChars: (count) => `Digiti almeno ${n(count)} ${plural(count, "carattere", "caratteri")}`,
259
260
  },
260
261
  multiSelect: {
261
262
  search: "Cerca",
@@ -320,7 +321,7 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
320
321
  cancel: "Annulla",
321
322
  prompt: "Questa operazione non può essere annullata.",
322
323
  password: "Password",
323
- phrase: (phrase) => `Digita «${phrase}» per confermare`,
324
+ phrase: (phrase) => `Digiti «${phrase}» per confermare`,
324
325
  },
325
326
  tabs: {
326
327
  add: "Aggiungi scheda",
@@ -359,8 +360,8 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
359
360
  filePicker: {
360
361
  dropzone: "Caricamento file",
361
362
  browse: "Sfoglia",
362
- empty: "Trascina qui un file",
363
- emptyMultiple: "Trascina qui i file",
363
+ empty: "Trascini qui un file",
364
+ emptyMultiple: "Trascini qui i file",
364
365
  hint: (accept) => (accept ? `Accettati: ${accept}` : "Qualsiasi tipo di file"),
365
366
  busy: "Caricamento…",
366
367
  rejectedPick: (count) =>
@@ -397,7 +398,7 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
397
398
  cancelDismissLabel: "Continua a modificare",
398
399
  reviewTitle: "Riepilogo",
399
400
  edit: "Modifica",
400
- missingRequired: "Compila tutti i campi obbligatori.",
401
+ missingRequired: "Compili tutti i campi obbligatori.",
401
402
  genericError: "Si è verificato un errore",
402
403
  },
403
404
  tour: {
@@ -405,7 +406,7 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
405
406
  back: "Indietro",
406
407
  skip: "Salta",
407
408
  done: "Fine",
408
- awaitClickHint: "Fai clic sull’elemento evidenziato per continuare",
409
+ awaitClickHint: "Faccia clic sull’elemento evidenziato per continuare",
409
410
  step: (current, total) => `${n(current)} / ${n(total)}`,
410
411
  },
411
412
  commandPalette: {
@@ -416,13 +417,13 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
416
417
  empty: "Nessun risultato",
417
418
  loading: "Ricerca in corso…",
418
419
  dialog: "Ricerca",
419
- error: "Ricerca non riuscita. Riprova.",
420
+ error: "Ricerca non riuscita. Riprovi.",
420
421
  },
421
422
  globalSearch: {
422
423
  trigger: "Cerca",
423
424
  placeholder: "Cerca o vai a…",
424
425
  shortcut: (keys) => `Cerca (${keys})`,
425
- suggestions: "Prova",
426
+ suggestions: "Provi",
426
427
  results: "Risultati",
427
428
  },
428
429
  sparkline: {
@@ -444,8 +445,8 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
444
445
  },
445
446
  signaturePad: {
446
447
  label: "Firma",
447
- instructions: "Firma nel riquadro con il mouse, il dito o una penna.",
448
- typedFallbackHint: "Se non puoi disegnare, scrivi invece il tuo nome.",
448
+ instructions: "Firmi nel riquadro con il mouse, il dito o una penna.",
449
+ typedFallbackHint: "Se non può disegnare, scriva invece il Suo nome.",
449
450
  empty: "Ancora nessun tratto",
450
451
  signed: "Firma tracciata",
451
452
  undo: "Annulla l’ultimo tratto",
@@ -483,7 +484,7 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
483
484
  seriesChart: {
484
485
  resetZoom: "Reimposta zoom",
485
486
  zoomHint:
486
- "Trascina per ingrandire: una selezione più o meno quadrata ingrandisce entrambi gli assi, una lunga e sottile solo il proprio. Fai doppio clic per ripristinare.",
487
+ "Trascini per ingrandire: una selezione più o meno quadrata ingrandisce entrambi gli assi, una lunga e sottile solo il proprio. Faccia doppio clic per ripristinare.",
487
488
  empty: "Nessun dato",
488
489
  legend: "Serie",
489
490
  points: "Valori del grafico",
@@ -498,6 +499,7 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
498
499
  confirmDialog: {
499
500
  confirm: "Conferma",
500
501
  cancel: "Annulla",
502
+ typed: (text) => `Digiti «${text}» per confermare`,
501
503
  },
502
504
  floatingPanel: {
503
505
  close: "Chiudi",
@@ -534,7 +536,7 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
534
536
  lineItems: {
535
537
  add: "Aggiungi riga",
536
538
  remove: (row) => `Rimuovi riga ${row}`,
537
- confirmRemove: (row) => `Rimuovere la riga ${row}? Premi di nuovo per confermare`,
539
+ confirmRemove: (row) => `Rimuovere la riga ${row}? Prema di nuovo per confermare`,
538
540
  row: (row) => `Riga ${row}`,
539
541
  cell: (column, row) => `${column}, riga ${row}`,
540
542
  totals: "Totale",
@@ -549,14 +551,14 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
549
551
  },
550
552
  errorBoundary: {
551
553
  title: "Si è verificato un errore",
552
- message: "Impossibile mostrare questa parte della pagina. Riprova o ricarica la pagina.",
554
+ message: "Impossibile mostrare questa parte della pagina. Riprovi o ricarichi la pagina.",
553
555
  retry: "Riprova",
554
556
  details: "Dettagli dell’errore",
555
557
  reload: "Ricarica",
556
558
  updateTitle: "È disponibile una nuova versione",
557
- updateMessage: "Una parte dell’app è cambiata da quando questa pagina è stata caricata. Ricarica per ottenere la nuova versione.",
558
- offlineTitle: "Sei offline",
559
- offlineMessage: "Impossibile caricare questa pagina senza connessione. Riconnettiti, poi ricarica la pagina.",
559
+ updateMessage: "Una parte dell’app è cambiata da quando questa pagina è stata caricata. Ricarichi per ottenere la nuova versione.",
560
+ offlineTitle: "Nessuna connessione",
561
+ offlineMessage: "Impossibile caricare questa pagina senza connessione. Si riconnetta, poi ricarichi la pagina.",
560
562
  copyReport: "Copia il rapporto di errore",
561
563
  reported: "L’errore è stato segnalato automaticamente.",
562
564
  reportedAs: (reference) => `Segnalato con riferimento ${reference}`,
@@ -583,6 +585,106 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
583
585
  noPreview: "Nessuna anteprima disponibile per questo file",
584
586
  openInNewTab: "Apri in una nuova scheda",
585
587
  },
588
+ writeLock: {
589
+ reason: "Può visualizzarlo, ma non modificarlo.",
590
+ },
591
+ accountState: {
592
+ // Agreeing with "account" (masculine): the chip is the state of an account.
593
+ active: "Attivo",
594
+ inactive: "Non attivo",
595
+ invited: "Invitato",
596
+ registered: "Registrato",
597
+ unverified: "Non verificato",
598
+ passwordChange: "Deve cambiare la password",
599
+ },
600
+ shareCard: {
601
+ dialogTitle: "Condividi",
602
+ close: "Chiudi",
603
+ email: "Indirizzo email",
604
+ emailOptional: "Indirizzo email (facoltativo)",
605
+ // example.com is reserved for examples (RFC 2606); a localised domain is real.
606
+ emailPlaceholder: "nome@example.com",
607
+ invalidEmail: "Inserisca un indirizzo email completo.",
608
+ role: "Ruolo",
609
+ roleOf: (name) => `Ruolo di ${name}`,
610
+ add: "Condividi",
611
+ whoHasAccess: "Chi ha accesso",
612
+ nobodyYet: "Nessun altro ha ancora accesso.",
613
+ pending: "In attesa",
614
+ openInvite: "Link di invito aperto",
615
+ copyLink: "Copia link",
616
+ team: "Team",
617
+ teamHint: (name) => `Tutti i membri di ${name} avranno accesso.`,
618
+ remove: "Rimuovi accesso",
619
+ removeConfirm: (name) => `Rimuovere l’accesso di ${name}?`,
620
+ revokePending: "Ritira invito",
621
+ revokePendingConfirm: (name) => `Ritirare l’invito per ${name}?`,
622
+ failed: "Non ha funzionato. Riprovi.",
623
+ loading: "Caricamento…",
624
+ },
625
+ reauthDialog: {
626
+ title: "Confermi la Sua identità",
627
+ description: "Inserisca la password attuale per continuare.",
628
+ password: "Password attuale",
629
+ submit: "Continua",
630
+ cancel: "Annulla",
631
+ },
632
+ serverWake: {
633
+ slow: "Caricamento in corso: ci vuole più del solito.",
634
+ waking: (appName) =>
635
+ `Il server va in sospensione quando nessuno usa ${appName ?? "l’app"}, quindi la prima richiesta dopo una pausa deve riavviarlo. Può volerci un momento: non si perde nulla, la pagina si completa da sola.`,
636
+ },
637
+ legal: {
638
+ navLabel: "Note legali",
639
+ },
640
+ translationReview: {
641
+ statusMissing: "Mancante",
642
+ statusUnreviewed: "Non rivisto",
643
+ statusChanged: "Modificato dopo la revisione",
644
+ statusNeedsChange: "Da modificare",
645
+ statusApproved: "Approvato",
646
+ statusFilter: "Stato",
647
+ all: "Tutti",
648
+ filterCount: (label, count) => `${label} · ${n(count)}`,
649
+ source: "Testi",
650
+ allSources: "Tutti i testi",
651
+ namespace: "Area",
652
+ allNamespaces: "Tutte le aree",
653
+ search: "Cerca nelle chiavi e nei testi",
654
+ placeholdersOnly: (count) => `Solo problemi di segnaposto (${n(count)})`,
655
+ placeholderChip: "Segnaposto",
656
+ key: "Chiave",
657
+ statusColumn: "Stato",
658
+ empty: "Nessun testo corrisponde a questi filtri.",
659
+ missingText: "Mancante in questa lingua",
660
+ progress: (approved, total) => `${n(approved)} di ${n(total)} ${plural(approved, "approvato", "approvati")}`,
661
+ localeProgress: (approved, total) => `${n(approved)}/${n(total)}`,
662
+ locales: "Lingue",
663
+ approve: "Approva",
664
+ flag: "Da modificare",
665
+ suggest: "Proponi una traduzione",
666
+ reset: "Segna come non rivisto",
667
+ cancel: "Annulla",
668
+ approveSelected: "Approva i selezionati",
669
+ resetSelected: "Segna i selezionati come non rivisti",
670
+ selectShown: "Seleziona tutti quelli mostrati",
671
+ changedSince: "Questo testo è stato modificato dopo la revisione. Lo rilegga, per favore.",
672
+ reviewedWording: "Formulazione al momento della revisione",
673
+ reviewedReference: "Riferimento al momento della revisione",
674
+ placeholderMismatch: (reference, text) =>
675
+ `I segnaposto differiscono dal riferimento — riferimento: ${reference}; questo testo: ${text}. L’app vi inserisce dei valori, quindi devono restare esattamente come sono.`,
676
+ lastApproved: (name, date) => `Approvato da ${name} il ${date}`,
677
+ lastFlagged: (name, date) => `Segnato da modificare da ${name} il ${date}`,
678
+ erasedReviewer: "un account eliminato",
679
+ suggestion: "Formulazione migliore",
680
+ translation: "Traduzione",
681
+ note: "Nota (facoltativa)",
682
+ notePlaceholder: "Cosa non va, o di cosa tenere conto",
683
+ readOnly: "Può leggere questa lingua, ma non rivederla.",
684
+ scope: (areas) => `La Sua revisione è limitata a: ${areas}.`,
685
+ exportCorrections: (count) => `Esporta le correzioni (${n(count)})`,
686
+ failed: "Non ha funzionato. Riprovi.",
687
+ },
586
688
  };
587
689
  }
588
690
 
@@ -87,6 +87,7 @@ export function uiKitLabelsZh(numberLocale = "zh-CN"): UiKitLabels {
87
87
  passkeys: {
88
88
  title: "通行密钥",
89
89
  description: "使用指纹、面容或设备 PIN 登录,无需密码。",
90
+ descriptionAlongside: "使用指纹、面容或设备 PIN 登录,密码仍可照常使用。",
90
91
  empty: "暂无通行密钥",
91
92
  loading: "正在加载通行密钥…",
92
93
  list: "已注册的通行密钥",
@@ -485,6 +486,7 @@ export function uiKitLabelsZh(numberLocale = "zh-CN"): UiKitLabels {
485
486
  confirmDialog: {
486
487
  confirm: "确认",
487
488
  cancel: "取消",
489
+ typed: (text) => `输入“${text}”以确认`,
488
490
  },
489
491
  floatingPanel: {
490
492
  close: "关闭",
@@ -570,6 +572,106 @@ export function uiKitLabelsZh(numberLocale = "zh-CN"): UiKitLabels {
570
572
  noPreview: "此文件无法预览",
571
573
  openInNewTab: "在新标签页中打开",
572
574
  },
575
+ writeLock: {
576
+ reason: "仅可查看,无法修改。",
577
+ },
578
+ accountState: {
579
+ active: "已启用",
580
+ inactive: "已停用",
581
+ invited: "已邀请",
582
+ registered: "已注册",
583
+ unverified: "未验证",
584
+ passwordChange: "需修改密码",
585
+ },
586
+ shareCard: {
587
+ dialogTitle: "共享",
588
+ close: "关闭",
589
+ email: "电子邮箱地址",
590
+ emailOptional: "电子邮箱地址(可选)",
591
+ emailPlaceholder: "name@example.com",
592
+ invalidEmail: "请输入完整的电子邮箱地址。",
593
+ role: "角色",
594
+ roleOf: (name) => `${name} 的角色`,
595
+ add: "共享",
596
+ whoHasAccess: "有权访问的人",
597
+ nobodyYet: "目前还没有其他人有权访问。",
598
+ pending: "待接受",
599
+ openInvite: "公开邀请链接",
600
+ copyLink: "复制链接",
601
+ team: "团队",
602
+ teamHint: (name) => `${name} 的所有成员都将获得访问权限。`,
603
+ remove: "移除访问权限",
604
+ removeConfirm: (name) => `移除 ${name} 的访问权限?`,
605
+ revokePending: "撤回邀请",
606
+ revokePendingConfirm: (name) => `撤回对 ${name} 的邀请?`,
607
+ failed: "操作未成功,请重试。",
608
+ loading: "加载中…",
609
+ },
610
+ reauthDialog: {
611
+ title: "验证身份",
612
+ description: "请输入当前密码以继续。",
613
+ password: "当前密码",
614
+ submit: "继续",
615
+ cancel: "取消",
616
+ },
617
+ serverWake: {
618
+ slow: "仍在加载,比平时耗时更长。",
619
+ // A Latin product name gets a space either side, as everywhere in this catalogue.
620
+ waking: (appName) =>
621
+ `无人使用${appName ? ` ${appName} ` : "本应用"}时,服务器会进入休眠,因此暂停后的第一个请求需要重新启动它。这可能需要一点时间——不会丢失任何内容,页面会自动加载完成。`,
622
+ },
623
+ legal: {
624
+ navLabel: "法律信息",
625
+ },
626
+ translationReview: {
627
+ statusMissing: "缺失",
628
+ statusUnreviewed: "未审校",
629
+ statusChanged: "审校后已更改",
630
+ statusNeedsChange: "需要修改",
631
+ statusApproved: "已通过",
632
+ statusFilter: "状态",
633
+ all: "全部",
634
+ filterCount: (label, count) => `${label} · ${n(count)}`,
635
+ source: "文本",
636
+ allSources: "全部文本",
637
+ namespace: "区域",
638
+ allNamespaces: "全部区域",
639
+ search: "搜索键名和文本",
640
+ placeholdersOnly: (count) => `仅显示占位符问题(${n(count)})`,
641
+ placeholderChip: "占位符",
642
+ key: "键名",
643
+ statusColumn: "状态",
644
+ empty: "没有符合这些筛选条件的文本。",
645
+ missingText: "此语言中缺失",
646
+ progress: (approved, total) => `已通过 ${n(approved)} / ${n(total)}`,
647
+ localeProgress: (approved, total) => `${n(approved)}/${n(total)}`,
648
+ locales: "语言",
649
+ approve: "通过",
650
+ flag: "需要修改",
651
+ suggest: "建议译文",
652
+ reset: "标记为未审校",
653
+ cancel: "取消",
654
+ approveSelected: "通过所选项",
655
+ resetSelected: "将所选项标记为未审校",
656
+ selectShown: "选择所有显示项",
657
+ changedSince: "此文本在审校后已更改,请重新阅读。",
658
+ reviewedWording: "审校时的措辞",
659
+ reviewedReference: "审校时的参考文本",
660
+ placeholderMismatch: (reference, text) =>
661
+ `占位符与参考文本不一致——参考文本:${reference};此文本:${text}。应用会在这些位置填入内容,因此必须保持原样。`,
662
+ // A Latin name gets a space either side, as everywhere in this catalogue.
663
+ lastApproved: (name, date) => `${name} 于 ${date} 通过`,
664
+ lastFlagged: (name, date) => `${name} 于 ${date} 标记为需要修改`,
665
+ erasedReviewer: "已删除的账户",
666
+ suggestion: "更好的措辞",
667
+ translation: "译文",
668
+ note: "备注(可选)",
669
+ notePlaceholder: "哪里有问题,或需要注意什么",
670
+ readOnly: "此语言仅可查看,无法审校。",
671
+ scope: (areas) => `审校范围仅限于:${areas}。`,
672
+ exportCorrections: (count) => `导出更正(${n(count)})`,
673
+ failed: "操作未成功,请重试。",
674
+ },
573
675
  };
574
676
  }
575
677
 
@@ -0,0 +1,193 @@
1
+ import type { UiKitLabels } from "./kit-labels";
2
+
3
+ /**
4
+ * The kit's words as a flat `key → text` list, for an app's translation review.
5
+ *
6
+ * keksdose reviews its own locale bundles on its /translations page — one verdict per
7
+ * locale and key, stored with the text the reviewer saw, so a later change re-opens it.
8
+ * The kit's words appear on the same screens but live in TypeScript, not in the app's
9
+ * bundles, and 94 of them are functions (`(count) => "3 results"`), which a bundle
10
+ * flattener skips. This turns a label tree into rows that page can join on.
11
+ *
12
+ * - A string label is one row under its dot path: `common.close`. An array of words
13
+ * (weekday names) is one row per entry: `miniCalendar.weekdays.0`.
14
+ * - A function label is called with fixed samples. Text arguments are i18next-style
15
+ * placeholders (`{{name}}`), so a translation that drops one is caught by the same
16
+ * placeholder check the app runs on its own strings. Counts are real numbers, twice
17
+ * where the wording may depend on them — 1 and 3 — so a reviewer sees singular and
18
+ * plural. The key names the sample: `combobox.resultCount(1)`,
19
+ * `shareCard.removeConfirm(name)`, `serverWake.waking()`.
20
+ *
21
+ * Keys depend only on the samples, never on the locale, so the rows of `de-CH` and of the
22
+ * English reference line up key by key. Pass exactly the tree the app hands
23
+ * `UiKitProvider` — its overrides included — and review what users see:
24
+ *
25
+ * kitLabelStrings(UI_KIT_LABELS_DE_CH) // the rows for de-CH
26
+ * kitLabelStrings(DEFAULT_UI_KIT_LABELS) // the English reference
27
+ *
28
+ * A label that throws on its sample becomes a row starting with "⚠", so one broken
29
+ * override shows up on the page instead of taking the page down.
30
+ */
31
+ export function kitLabelStrings(labels: UiKitLabels): Record<string, string> {
32
+ const out: Record<string, string> = {};
33
+ const walk = (node: unknown, path: string) => {
34
+ if (typeof node === "string") {
35
+ out[path] = node;
36
+ } else if (typeof node === "function") {
37
+ for (const args of KIT_LABEL_SAMPLES[path] ?? [[]]) {
38
+ out[`${path}(${args.map(sampleName).filter((a) => a !== "").join(", ")})`] = render(
39
+ node as (...args: unknown[]) => unknown,
40
+ args,
41
+ );
42
+ }
43
+ } else if (node !== null && typeof node === "object") {
44
+ for (const [key, value] of Object.entries(node)) walk(value, path ? `${path}.${key}` : key);
45
+ }
46
+ };
47
+ walk(labels, "");
48
+ return out;
49
+ }
50
+
51
+ function render(label: (...args: unknown[]) => unknown, args: readonly unknown[]): string {
52
+ try {
53
+ return String(label(...args));
54
+ } catch (error) {
55
+ return `⚠ ${error instanceof Error ? error.message : String(error)}`;
56
+ }
57
+ }
58
+
59
+ /** How a sample argument is written in the key: a placeholder by its name, a number as
60
+ * itself, an empty string as `""`, a missing optional argument not at all. */
61
+ function sampleName(arg: unknown): string {
62
+ if (arg === undefined) return "";
63
+ if (typeof arg === "string") return /^\{\{(\w+)\}\}$/.exec(arg)?.[1] ?? JSON.stringify(arg);
64
+ return String(arg);
65
+ }
66
+
67
+ const one = [[1], [3]] as const;
68
+
69
+ /**
70
+ * The sample arguments of every function label in {@link UiKitLabels}, by dot path.
71
+ * `src/i18n/__tests__/review.test.ts` fails when a function label has no entry here, so
72
+ * a new one cannot ship un-reviewable.
73
+ */
74
+ export const KIT_LABEL_SAMPLES: Readonly<Record<string, readonly (readonly unknown[])[]>> = {
75
+ "common.fieldValue": [["{{field}}", "{{value}}"]],
76
+ "dataTable.filterResults": [
77
+ [1, 1],
78
+ [3, 12],
79
+ ],
80
+ "dataTable.sortedAscending": [["{{column}}"]],
81
+ "dataTable.sortedDescending": [["{{column}}"]],
82
+ "dataTable.sortCleared": [["{{column}}"]],
83
+ "dataTable.pageChanged": [[2, 5]],
84
+ "dataTable.pageRange": [[1, 25, 1240]],
85
+ "dataTable.rowCount": [[1], [1240]],
86
+ "dataTable.columnsCount": [[3, 8]],
87
+ "miniCalendar.day": [["{{date}}"]],
88
+ "miniCalendar.startSelected": [["{{date}}"]],
89
+ "miniCalendar.rangeSelected": [["{{from}}", "{{to}}"]],
90
+ "calendarHeatmap.day": [["{{date}}", "{{value}}"]],
91
+ "calendarHeatmap.truncated": one,
92
+ "monthPicker.month": [["{{monthYear}}"]],
93
+ "combobox.create": [["{{query}}"]],
94
+ "combobox.selectedCount": one,
95
+ "combobox.resultCount": one,
96
+ "combobox.minChars": one,
97
+ "multiSelect.selectedCount": one,
98
+ "chipInput.added": [["{{value}}"]],
99
+ "chipInput.removed": [["{{value}}"]],
100
+ "chipInput.atLimit": one,
101
+ "chipInput.duplicate": [["{{value}}"]],
102
+ "tabs.remove": [["{{tab}}"]],
103
+ "appShell.toggleGroup": [["{{group}}"]],
104
+ "topBar.role": [["{{role}}"]],
105
+ "file.size": [[2_500_000]],
106
+ "wizard.step": [[2, 4]],
107
+ "tour.step": [[2, 4]],
108
+ "globalSearch.shortcut": [["{{keys}}"]],
109
+ "pieChart.slice": [["{{label}}", "{{value}}", "{{percent}}"]],
110
+ "sparkline.rising": [["{{first}}", "{{last}}"]],
111
+ "sparkline.falling": [["{{first}}", "{{last}}"]],
112
+ "sparkline.flat": [["{{value}}"]],
113
+ "sparkline.single": [["{{value}}"]],
114
+ "sparkline.named": [["{{name}}", "{{summary}}"]],
115
+ "statTile.increase": [["{{amount}}"]],
116
+ "statTile.decrease": [["{{amount}}"]],
117
+ "statTile.better": [["{{change}}"]],
118
+ "statTile.worse": [["{{change}}"]],
119
+ "signaturePad.viewTyped": [["{{name}}"]],
120
+ "passwordStrength.announcement": [["{{level}}"]],
121
+ "passwordStrength.ruleLength": [[12]],
122
+ "passwordStrength.optional": [["{{rule}}"]],
123
+ "passwordStrength.tooLong": [[72]],
124
+ "dangerConfirm.phrase": [["{{phrase}}"]],
125
+ "iconPicker.resultCount": one,
126
+ "filePicker.rejectedType": [["{{name}}"]],
127
+ "filePicker.rejectedTypeOnly": [["{{accept}}", "{{name}}"]],
128
+ "filePicker.rejectedSize": [["{{name}}", "{{maxSize}}"]],
129
+ "filePicker.rejectedCount": [
130
+ ["{{name}}", 1],
131
+ ["{{name}}", 3],
132
+ ],
133
+ "filePicker.rejectedInvalid": [["{{name}}"]],
134
+ "filePicker.rejectedMany": one,
135
+ "filePicker.rejectedPick": one,
136
+ "filePicker.selected": [
137
+ [1, "{{firstName}}"],
138
+ [3, "{{firstName}}"],
139
+ ],
140
+ "filePicker.remove": [["{{name}}"]],
141
+ "filePicker.removed": [["{{name}}"]],
142
+ "filePicker.hint": [["{{accept}}"], [""]],
143
+ "measuredGrid.removeRow": [[3]],
144
+ "measuredGrid.cell": [["{{column}}", 3]],
145
+ "measuredGrid.lineError": [[3]],
146
+ "measuredGrid.points": one,
147
+ "measuredGrid.problems": one,
148
+ "feedbackAttachment.attachmentRemoveFile": [["{{name}}"]],
149
+ "feedbackAttachment.attachmentLimit": one,
150
+ "feedbackComposer.sendHint": [["{{modifier}}"]],
151
+ "accountSettings.passkeys.renameItem": [["{{name}}"]],
152
+ "accountSettings.passkeys.renameField": [["{{name}}"]],
153
+ "accountSettings.passkeys.deleteItem": [["{{name}}"]],
154
+ "accountSettings.passkeys.deleteConfirm": [["{{name}}"]],
155
+ "accountSettings.passkeys.created": [["{{date}}"]],
156
+ "accountSettings.passkeys.lastUsed": [["{{date}}"]],
157
+ "confirmDialog.typed": [["{{text}}"]],
158
+ "floatingPanel.badge": one,
159
+ "bulkActionBar.selected": one,
160
+ "lineItems.remove": [[3]],
161
+ "lineItems.confirmRemove": [[3]],
162
+ "lineItems.row": [[3]],
163
+ "lineItems.cell": [["{{column}}", 3]],
164
+ "progressBar.overLimit": [["{{amount}}"]],
165
+ "signedAmount.positive": [["{{amount}}"]],
166
+ "signedAmount.negative": [["{{amount}}"]],
167
+ "errorBoundary.reportedAs": [["{{reference}}"]],
168
+ "authedImage.failedImage": [["{{alt}}"]],
169
+ "imageGrid.item": [[2, 5]],
170
+ "imageGrid.actions": [["{{name}}"]],
171
+ "lightbox.counter": [[2, 5]],
172
+ "lightbox.position": [[2, 5]],
173
+ "shareCard.roleOf": [["{{name}}"]],
174
+ "shareCard.teamHint": [["{{name}}"]],
175
+ "shareCard.removeConfirm": [["{{name}}"]],
176
+ "shareCard.revokePendingConfirm": [["{{name}}"]],
177
+ "serverWake.waking": [["{{appName}}"], [undefined]],
178
+ "translationReview.filterCount": [
179
+ ["{{status}}", 1],
180
+ ["{{status}}", 3],
181
+ ],
182
+ "translationReview.placeholdersOnly": one,
183
+ "translationReview.progress": [
184
+ [1, 1],
185
+ [3, 12],
186
+ ],
187
+ "translationReview.localeProgress": [[3, 12]],
188
+ "translationReview.placeholderMismatch": [["{{reference}}", "{{text}}"]],
189
+ "translationReview.lastApproved": [["{{name}}", "{{date}}"]],
190
+ "translationReview.lastFlagged": [["{{name}}", "{{date}}"]],
191
+ "translationReview.scope": [["{{areas}}"]],
192
+ "translationReview.exportCorrections": [[0], [1], [3]],
193
+ };
package/src/i18n/swiss.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Swiss Standard German respelling, shared by the `de-CH` and `de-CH-informal`
3
- * translations. Internal: it lives outside `src/i18n/locales/` because every file there
4
- * becomes a public `@eifi1/ui-kit/i18n/<code>` subpath.
2
+ * Swiss Standard German respelling, applied to the internal German source (`german.ts`)
3
+ * to make the `de-CH` catalogue. Internal: it lives outside `src/i18n/locales/` because
4
+ * every file there becomes a public `@eifi1/ui-kit/i18n/<code>` subpath.
5
5
  *
6
6
  * "ss" for every "ß" (Schliessen, Grösse) is the one systematic difference in UI text.
7
7
  * Function labels are wrapped: their RESULT is respelled, so an argument the app passes