@eifi1/ui-kit 0.27.1 → 0.28.1

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 (109) hide show
  1. package/README.md +7 -5
  2. package/dist/chart.d.ts +1 -2
  3. package/dist/components/amount-input.d.ts +1 -2
  4. package/dist/components/button-group.d.ts +1 -2
  5. package/dist/components/calculator.d.ts +1 -2
  6. package/dist/components/confirm-dialog.d.ts +1 -2
  7. package/dist/components/copy-button.d.ts +1 -2
  8. package/dist/components/danger-confirm.d.ts +1 -2
  9. package/dist/components/facing-pair.d.ts +1 -2
  10. package/dist/components/file-button.d.ts +1 -2
  11. package/dist/components/file-dropzone.d.ts +1 -2
  12. package/dist/components/form-actions.d.ts +1 -2
  13. package/dist/components/iban-input.d.ts +1 -2
  14. package/dist/components/language-select.d.ts +1 -2
  15. package/dist/components/legal-page.d.ts +267 -0
  16. package/dist/components/legal-page.js +272 -0
  17. package/dist/components/legal-page.js.map +1 -0
  18. package/dist/components/legal.d.ts +70 -87
  19. package/dist/components/legal.js +232 -11
  20. package/dist/components/legal.js.map +1 -1
  21. package/dist/components/money-field.d.ts +1 -2
  22. package/dist/components/number-field.d.ts +1 -2
  23. package/dist/components/number-input.d.ts +1 -2
  24. package/dist/components/numpad-sheet.d.ts +1 -2
  25. package/dist/components/phone-input.d.ts +1 -2
  26. package/dist/components/series-chart.d.ts +1 -2
  27. package/dist/components/settings-fields.d.ts +1 -2
  28. package/dist/components/share-card.d.ts +1 -2
  29. package/dist/components/text-link.d.ts +1 -2
  30. package/dist/components/time-input.d.ts +1 -2
  31. package/dist/components/translation-review.d.ts +2 -1
  32. package/dist/components/translation-review.js.map +1 -1
  33. package/dist/components/ui.d.ts +1 -2
  34. package/dist/feedback/feedback-attachment.d.ts +1 -2
  35. package/dist/feedback/feedback-context.d.ts +1 -2
  36. package/dist/feedback/feedback-crash.d.ts +1 -2
  37. package/dist/feedback/feedback-dialog.d.ts +1 -2
  38. package/dist/feedback/feedback-inbox.d.ts +1 -2
  39. package/dist/feedback/feedback-labels.d.ts +1 -2
  40. package/dist/feedback/feedback-menu.d.ts +1 -2
  41. package/dist/feedback/feedback-record.d.ts +1 -2
  42. package/dist/feedback/feedback-row-detail.d.ts +1 -2
  43. package/dist/feedback/feedback-status-undo.d.ts +1 -2
  44. package/dist/feedback/feedback-submit.d.ts +1 -2
  45. package/dist/feedback/feedback-swipe.d.ts +1 -2
  46. package/dist/feedback/feedback-table.d.ts +1 -2
  47. package/dist/feedback/feedback-thread.d.ts +1 -2
  48. package/dist/feedback.d.ts +1 -2
  49. package/dist/hooks/use-file-drop.d.ts +1 -2
  50. package/dist/hooks/use-noindex.d.ts +26 -0
  51. package/dist/hooks/use-noindex.js +18 -0
  52. package/dist/hooks/use-noindex.js.map +1 -0
  53. package/dist/i18n/defaults.d.ts +1 -2
  54. package/dist/i18n/german.d.ts +1 -2
  55. package/dist/i18n/german.js +95 -1
  56. package/dist/i18n/german.js.map +1 -1
  57. package/dist/i18n/kit-labels.d.ts +1 -2
  58. package/dist/i18n/kit-labels.js.map +1 -1
  59. package/dist/i18n/languages.d.ts +1 -2
  60. package/dist/i18n/locales/de-CH.d.ts +1 -2
  61. package/dist/i18n/locales/en.d.ts +1 -2
  62. package/dist/i18n/locales/es.d.ts +1 -2
  63. package/dist/i18n/locales/es.js +95 -1
  64. package/dist/i18n/locales/es.js.map +1 -1
  65. package/dist/i18n/locales/fr.d.ts +1 -2
  66. package/dist/i18n/locales/fr.js +97 -1
  67. package/dist/i18n/locales/fr.js.map +1 -1
  68. package/dist/i18n/locales/hu.d.ts +1 -2
  69. package/dist/i18n/locales/hu.js +98 -1
  70. package/dist/i18n/locales/hu.js.map +1 -1
  71. package/dist/i18n/locales/it.d.ts +1 -2
  72. package/dist/i18n/locales/it.js +98 -1
  73. package/dist/i18n/locales/it.js.map +1 -1
  74. package/dist/i18n/locales/zh.d.ts +1 -2
  75. package/dist/i18n/locales/zh.js +95 -1
  76. package/dist/i18n/locales/zh.js.map +1 -1
  77. package/dist/i18n/review.d.ts +24 -5
  78. package/dist/i18n/review.js +26 -3
  79. package/dist/i18n/review.js.map +1 -1
  80. package/dist/index.d.ts +5 -4
  81. package/dist/index.js +23 -1
  82. package/dist/index.js.map +1 -1
  83. package/dist/{kit-labels-DQg82eHB.d.ts → kit-labels-Du0uHBq4.d.ts} +342 -4
  84. package/dist/lib/translation-review.d.ts +26 -3
  85. package/dist/lib/translation-review.js +10 -2
  86. package/dist/lib/translation-review.js.map +1 -1
  87. package/dist/rhf/fields.d.ts +1 -2
  88. package/dist/rhf/form.d.ts +1 -2
  89. package/dist/rhf.d.ts +1 -2
  90. package/dist/shell/app-shell.d.ts +1 -2
  91. package/dist/shell/top-bar-brand.d.ts +1 -2
  92. package/dist/shell.d.ts +1 -2
  93. package/dist/wizard/stepper-nav.d.ts +1 -2
  94. package/dist/wizard.d.ts +1 -2
  95. package/package.json +1 -1
  96. package/src/components/legal-page.tsx +601 -0
  97. package/src/components/legal.tsx +540 -46
  98. package/src/components/translation-review.tsx +2 -1
  99. package/src/hooks/use-noindex.ts +37 -0
  100. package/src/i18n/german.ts +91 -0
  101. package/src/i18n/kit-labels.tsx +4 -1
  102. package/src/i18n/locales/es.ts +91 -0
  103. package/src/i18n/locales/fr.ts +93 -0
  104. package/src/i18n/locales/hu.ts +94 -0
  105. package/src/i18n/locales/it.ts +94 -0
  106. package/src/i18n/locales/zh.ts +91 -0
  107. package/src/i18n/review.ts +57 -3
  108. package/src/index.ts +41 -2
  109. package/src/lib/translation-review.ts +43 -4
@@ -139,7 +139,8 @@ export interface TranslationReviewPanelProps {
139
139
  areas?: readonly string[] | null;
140
140
  /** An area's name for the notice ("the legal pages (Imprint, …)"). Default: the key. */
141
141
  areaLabels?: Readonly<Record<string, string>>;
142
- /** Default `keyInArea`: the key is the area or sits under it (`legal.…`, `legal:…`). */
142
+ /** Default `keyInArea`: the key is the area or sits under it (`legal.…`, `legal:…`,
143
+ * and the kit's `kit.legal.…` since 0.28). */
143
144
  inArea?: (key: string, area: string) => boolean;
144
145
  /** A source's name for the source filter, which appears once the rows come from more
145
146
  * than one (kastlan: `{ screen: "Screen", documents: "PDFs and emails" }`). Default:
@@ -0,0 +1,37 @@
1
+ import { useEffect } from "react";
2
+
3
+ /**
4
+ * Marks the current page as not for search engines: a `<meta name="robots"
5
+ * content="noindex">` in the document head while the calling component is mounted.
6
+ *
7
+ * keksdose's hook (shared/hooks/use-noindex.ts, feedback #97 and #129), for every app:
8
+ * the contract puts it on the three legal pages and on every auth page
9
+ * (docs/legal-harmonization.md §3.2). {@link LegalPage} calls it itself.
10
+ *
11
+ * It is the best-effort, client-side half. The authoritative half is the web server's
12
+ * `X-Robots-Tag: noindex` on those routes (keksdose's Caddy `@noindex`), which a crawler
13
+ * reads without running any script; this covers the dev server and any setup without
14
+ * that header.
15
+ *
16
+ * The cleanup is the point of a hook rather than a tag in `index.html`: in a single-page
17
+ * app the head outlives the page, so without it a visitor's navigation from a legal page
18
+ * into the app would carry the marker onto pages that should be indexed. Each call adds
19
+ * its OWN element and removes exactly that one, so two mounted callers (a page and a
20
+ * dialog on it) never take each other's marker away.
21
+ *
22
+ * `active = false` adds nothing — for a page component that is also rendered as a
23
+ * preview inside another page (the showcase), where the host page's indexing is not its
24
+ * business. Hooks cannot be called conditionally, so the switch is an argument.
25
+ */
26
+ export function useNoIndex(active: boolean = true): void {
27
+ useEffect(() => {
28
+ if (!active) return;
29
+ const meta = document.createElement("meta");
30
+ meta.name = "robots";
31
+ meta.content = "noindex";
32
+ document.head.appendChild(meta);
33
+ return () => {
34
+ meta.remove();
35
+ };
36
+ }, [active]);
37
+ }
@@ -757,8 +757,99 @@ export function germanLabels(numberLocale: string): UiKitLabels {
757
757
  waking: (appName) =>
758
758
  `Der Server schläft ein, wenn ${appName ?? "die App"} gerade niemand benutzt. Die erste Anfrage nach einer Pause muss ihn erst wieder starten. Das kann einen Moment dauern – es geht nichts verloren, die Seite füllt sich von selbst.`,
759
759
  },
760
+ // 0.28.0 — docs/legal-harmonization.md §4.3/§4.4: keksdose's reviewed de-CH wording,
761
+ // and Kurvenschmiede's for the browser section and the beta notice. None of it needs
762
+ // a "ß", so `swiss()` leaves it as the apps wrote it.
760
763
  legal: {
761
764
  navLabel: "Rechtliches",
765
+ links: {
766
+ impressum: "Impressum",
767
+ privacy: "Datenschutz",
768
+ terms: "Nutzungsbedingungen",
769
+ },
770
+ titles: {
771
+ impressum: "Impressum",
772
+ privacy: "Datenschutzerklärung",
773
+ terms: "Nutzungsbedingungen",
774
+ },
775
+ backHome: "Zurück zur Startseite",
776
+ accept: "Ich akzeptiere die {terms} und die {privacy}",
777
+ notice: {
778
+ beta: "Geschlossene Beta. Diese Texte sind noch nicht anwaltlich geprüft; das geschieht vor einem öffentlichen Start.",
779
+ privacy:
780
+ "Geschlossene Beta. Die rechtlichen Formulierungen unten sind noch nicht anwaltlich geprüft; das geschieht vor einem öffentlichen Start. Die technischen Angaben — was gespeichert wird, wo, und wer es lesen kann — beschreiben, was die Software heute tatsächlich tut, und sind ausdrücklich dazu da, daran überprüft zu werden.",
781
+ },
782
+ translation: {
783
+ note: (o) =>
784
+ `Dies ist eine Übersetzung zu Ihrer Information. Massgebend ist die Fassung auf ${o.bindingLanguage}.`,
785
+ show: (o) => `Fassung auf ${o.bindingLanguage} anzeigen`,
786
+ },
787
+ sections: {
788
+ impressum: {
789
+ operator: {
790
+ title: "Betreiber",
791
+ body: (o) =>
792
+ `${o.name}\n${o.postalCode} ${o.city}\n${o.country}\n\nDie vollständige Postanschrift wird auf Anfrage an alle Personen mit berechtigtem rechtlichem Interesse herausgegeben; wenden Sie sich dazu an die unten genannte Kontaktadresse.`,
793
+ },
794
+ contact: {
795
+ title: "Kontakt",
796
+ body: (o) => `E-Mail: ${o.email}`,
797
+ },
798
+ disclaimer: {
799
+ title: "Haftung für Inhalte und Links",
800
+ body: "Dies ist ein privates, nicht-kommerzielles Projekt, das im Rahmen einer geschlossenen Beta ohne Gewähr bereitgestellt wird. Für verlinkte externe Websites sind deren Betreiber verantwortlich; auf deren Inhalte haben wir keinen Einfluss.",
801
+ },
802
+ },
803
+ privacy: {
804
+ controller: {
805
+ title: "Verantwortlicher",
806
+ body: (o) =>
807
+ `Verantwortlich für die Verarbeitung personenbezogener Daten in diesem Dienst ist:\n${o.name}\n${o.postalCode} ${o.city}, ${o.country}\nE-Mail: ${o.email}\n\nDie vollständige Postanschrift wird betroffenen Personen und Aufsichtsbehörden auf Anfrage mitgeteilt.`,
808
+ },
809
+ legal_basis: {
810
+ title: "Rechtsgrundlage",
811
+ body: "Da der Betreiber in der Schweiz ansässig ist, richtet sich die Verarbeitung nach dem Schweizer Datenschutzgesetz (DSG). Soweit die EU-Datenschutz-Grundverordnung (DSGVO) auf Sie anwendbar ist, stützen wir uns auf die Vertragserfüllung zur Bereitstellung des Dienstes (Art. 6 Abs. 1 lit. b DSGVO) und unser berechtigtes Interesse am Betrieb und an der Sicherheit des Dienstes (Art. 6 Abs. 1 lit. f DSGVO).",
812
+ },
813
+ browser: {
814
+ title: "Was Ihr Browser speichert",
815
+ lead: "Keine Cookies. Die App legt Folgendes im Speicher Ihres Browsers ab:",
816
+ tail: "Nichts davon dient dazu, Sie zu verfolgen. Noch nicht gesendete Einträge werden an uns übermittelt, sobald das möglich ist; alles andere bleibt auf Ihrem Gerät. Das alles verschwindet, wenn Sie die Websitedaten löschen, und beim Abmelden werden die Anmeldetoken entfernt.",
817
+ },
818
+ rights: {
819
+ title: "Ihre Rechte",
820
+ lead: "Sie haben das Recht auf Auskunft, Berichtigung, Löschung, Einschränkung, Datenübertragbarkeit und Widerspruch.",
821
+ tail: "In der Schweiz können Sie sich an den Eidgenössischen Datenschutz- und Öffentlichkeitsbeauftragten (EDÖB) wenden; in der EU können Sie sich bei Ihrer zuständigen Aufsichtsbehörde beschweren.",
822
+ },
823
+ contact: {
824
+ title: "Kontakt zum Datenschutz",
825
+ body: (o) => `Für Datenschutzanfragen wenden Sie sich an: ${o.email}`,
826
+ },
827
+ },
828
+ terms: {
829
+ warranty: {
830
+ title: "Keine Gewährleistung",
831
+ body: "Der Dienst wird im gesetzlich zulässigen Rahmen „wie besehen“ und „wie verfügbar“ ohne jegliche Gewährleistung bereitgestellt. Als Beta kann er Fehler enthalten, sich ändern oder jederzeit unterbrochen werden – bewahren Sie eigene Sicherungskopien wichtiger Daten auf.",
832
+ },
833
+ liability: {
834
+ title: "Haftungsbeschränkung",
835
+ body: "Soweit gesetzlich zulässig, haftet der Betreiber nicht für indirekte Schäden oder Folgeschäden, die aus der Nutzung oder Nichtnutzbarkeit des Dienstes entstehen. Eine Haftung, die gesetzlich nicht ausgeschlossen werden kann, bleibt unberührt.",
836
+ },
837
+ changes: {
838
+ title: "Änderungen dieser Bedingungen",
839
+ body: "Diese Bedingungen können im Zuge der Weiterentwicklung des Dienstes angepasst werden. Wesentliche Änderungen werden per E-Mail oder in der App angekündigt; die weitere Nutzung nach einer Änderung gilt als Zustimmung.",
840
+ },
841
+ language: {
842
+ title: "Sprache",
843
+ body: (o) =>
844
+ `Diese Bedingungen sind auf ${o.bindingLanguage} verfasst. Übersetzungen in andere Sprachen dienen nur der Information; weicht eine Übersetzung ab, ist die Fassung auf ${o.bindingLanguage} massgebend.`,
845
+ },
846
+ law: {
847
+ title: "Anwendbares Recht",
848
+ body: (o) =>
849
+ `Es gilt schweizerisches Recht unter Ausschluss des Kollisionsrechts. Soweit gesetzlich zulässig, ist Gerichtsstand ${o.city} (${o.region}), ${o.country}.`,
850
+ },
851
+ },
852
+ },
762
853
  },
763
854
  characterCount: {
764
855
  // "Zeichen" is the same in singular and plural.
@@ -318,7 +318,10 @@ export interface UiKitLabels {
318
318
  /** 0.19.0: the translation-review parts (`TranslationReviewPanel`, its editor, chip,
319
319
  * progress, locale tabs and export) — keksdose's /translations, for every app. */
320
320
  translationReview: TranslationReviewLabels;
321
- /** 0.19.0: `LegalLinks`' navigation name — the legal pages' shell, for every app. */
321
+ /** 0.19.0: `LegalLinks`' navigation name. 0.28.0: every kit-owned word of the legal
322
+ * pages — the link labels, titles, back link, terms checkbox and notices, and the
323
+ * sections that are the same in every app, filled in with the app's operator
324
+ * (docs/legal-harmonization.md §4.3/§4.4). */
322
325
  legal: LegalLabels;
323
326
  /** 0.22.0: the screen-reader words of `Input` / `Textarea`'s `showCount` counter. */
324
327
  characterCount: CharacterCountLabels;
@@ -737,8 +737,99 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
737
737
  waking: (appName) =>
738
738
  `El servidor se duerme cuando nadie usa ${appName ?? "la aplicación"}, así que la primera solicitud tras una pausa tiene que volver a arrancarlo. Puede tardar un momento; no se pierde nada y la página se completará sola.`,
739
739
  },
740
+ // 0.28.0 — docs/legal-harmonization.md §4.3/§4.4: Kurvenschmiede's reviewed Spanish
741
+ // (formal "usted"), brought into line with the kit's English; it goes back to
742
+ // Kurvenschmiede for review.
740
743
  legal: {
741
744
  navLabel: "Información legal",
745
+ links: {
746
+ impressum: "Aviso legal",
747
+ privacy: "Política de privacidad",
748
+ terms: "Condiciones de uso",
749
+ },
750
+ titles: {
751
+ impressum: "Aviso legal",
752
+ privacy: "Política de privacidad",
753
+ terms: "Condiciones de uso",
754
+ },
755
+ backHome: "Volver al inicio",
756
+ accept: "Acepto las {terms} y la {privacy}",
757
+ notice: {
758
+ beta: "Beta cerrada. Estos textos aún no han sido revisados por un abogado y lo serán antes de un lanzamiento público.",
759
+ privacy:
760
+ "Beta cerrada. La redacción jurídica que sigue aún no ha sido revisada por un abogado y lo será antes de un lanzamiento público. Las descripciones técnicas —qué se guarda, dónde y quién puede leerlo— describen lo que el software hace realmente hoy y deben poder contrastarse con él.",
761
+ },
762
+ translation: {
763
+ note: (o) =>
764
+ `Esta es una traducción ofrecida para su comodidad. La versión vinculante es la versión en ${o.bindingLanguage}.`,
765
+ show: (o) => `Ver la versión en ${o.bindingLanguage}`,
766
+ },
767
+ sections: {
768
+ impressum: {
769
+ operator: {
770
+ title: "Responsable del sitio",
771
+ body: (o) =>
772
+ `${o.name}\n${o.postalCode} ${o.city}\n${o.country}\n\nLa dirección postal completa se facilita, previa solicitud, a quien tenga un interés jurídico legítimo; escriba a la dirección de contacto indicada abajo.`,
773
+ },
774
+ contact: {
775
+ title: "Contacto",
776
+ body: (o) => `Correo electrónico: ${o.email}`,
777
+ },
778
+ disclaimer: {
779
+ title: "Responsabilidad por contenidos y enlaces",
780
+ body: "Este es un proyecto privado y sin fines comerciales, que se ofrece sin garantía durante una beta cerrada. Los sitios externos que enlazamos son responsabilidad de sus respectivos operadores; no tenemos control sobre su contenido.",
781
+ },
782
+ },
783
+ privacy: {
784
+ controller: {
785
+ title: "Responsable del tratamiento",
786
+ body: (o) =>
787
+ `El responsable del tratamiento de los datos personales en este servicio es:\n${o.name}\n${o.postalCode} ${o.city}, ${o.country}\nCorreo electrónico: ${o.email}\n\nLa dirección postal completa se facilita, previa solicitud, a los interesados y a las autoridades de control.`,
788
+ },
789
+ legal_basis: {
790
+ title: "Base jurídica",
791
+ body: "Como el responsable reside en Suiza, el tratamiento se rige por la Ley Federal suiza de Protección de Datos (LPD). Cuando le sea aplicable el Reglamento General de Protección de Datos de la UE (RGPD), nos basamos en la ejecución de un contrato para prestar el servicio (art. 6.1.b RGPD) y en nuestro interés legítimo en operarlo y protegerlo (art. 6.1.f RGPD).",
792
+ },
793
+ browser: {
794
+ title: "Qué guarda su navegador",
795
+ lead: "Ninguna cookie. La aplicación guarda lo siguiente en el almacenamiento de su navegador:",
796
+ tail: "Nada de ello se usa para rastrearle. Las entradas pendientes de envío se nos envían en cuanto sea posible; todo lo demás permanece en su dispositivo. Todo ello desaparece cuando borra los datos del sitio, y al cerrar sesión se eliminan los tokens de inicio de sesión.",
797
+ },
798
+ rights: {
799
+ title: "Sus derechos",
800
+ lead: "Tiene derecho de acceso, rectificación, supresión, limitación, portabilidad y oposición.",
801
+ tail: "Si se encuentra en Suiza, puede dirigirse al Comisionado Federal de Protección de Datos e Información (FDPIC); si se encuentra en la UE, puede presentar una reclamación ante su autoridad de control local.",
802
+ },
803
+ contact: {
804
+ title: "Contacto para la protección de datos",
805
+ body: (o) => `Para cualquier solicitud sobre privacidad, escriba a: ${o.email}`,
806
+ },
807
+ },
808
+ terms: {
809
+ warranty: {
810
+ title: "Sin garantía",
811
+ body: "El servicio se ofrece «tal cual» y «según disponibilidad», sin garantías de ningún tipo, en la medida en que lo permita la ley. Al ser una beta, puede contener errores, cambiar o interrumpirse en cualquier momento; conserve usted mismo copias de seguridad de los datos importantes.",
812
+ },
813
+ liability: {
814
+ title: "Limitación de responsabilidad",
815
+ body: "En la medida en que lo permita la legislación aplicable, el operador no responde de los daños indirectos o consecuentes derivados del uso o de la imposibilidad de uso del servicio. Nada de lo aquí dispuesto limita la responsabilidad que la ley no permite limitar.",
816
+ },
817
+ changes: {
818
+ title: "Cambios en estas condiciones",
819
+ body: "Estas condiciones pueden actualizarse a medida que evolucione el servicio. Los cambios importantes se anunciarán por correo electrónico o en la aplicación; si sigue usando el servicio después de un cambio, lo acepta.",
820
+ },
821
+ language: {
822
+ title: "Idioma",
823
+ body: (o) =>
824
+ `Estas condiciones están redactadas en ${o.bindingLanguage}. Las traducciones a otros idiomas se ofrecen solo por comodidad; en caso de discrepancia, prevalece la versión en ${o.bindingLanguage}.`,
825
+ },
826
+ law: {
827
+ title: "Legislación aplicable",
828
+ body: (o) =>
829
+ `Estas condiciones se rigen por el derecho suizo, con exclusión de sus normas de conflicto de leyes. En la medida en que lo permita la ley, el fuero competente es ${o.city} (${o.region}), ${o.country}.`,
830
+ },
831
+ },
832
+ },
742
833
  },
743
834
  characterCount: {
744
835
  count: (used, max) => `${n(used)} de ${n(max)} ${plural(max, "carácter", "caracteres")}`,
@@ -753,8 +753,101 @@ export function uiKitLabelsFr(numberLocale = "fr-FR"): UiKitLabels {
753
753
  waking: (appName) =>
754
754
  `Le serveur se met en veille quand personne n’utilise ${appName ?? "l’application"}, donc la première requête après une pause doit le redémarrer. Cela peut prendre un moment — rien n’est perdu, la page se remplira d’elle-même.`,
755
755
  },
756
+ // 0.28.0 — docs/legal-harmonization.md §4.3/§4.4: keksdose's reviewed French, and
757
+ // Kurvenschmiede's for the browser section and the beta notice; spaced as this
758
+ // catalogue writes it (\u00a0 before ":", \u202f before ";" and inside « »).
756
759
  legal: {
760
+ // Not keksdose's "Mentions légales": that is the Imprint link's label, and a screen
761
+ // reader would read it twice (§4.4).
757
762
  navLabel: "Informations légales",
763
+ links: {
764
+ impressum: "Mentions légales",
765
+ privacy: "Confidentialité",
766
+ terms: "Conditions d’utilisation",
767
+ },
768
+ titles: {
769
+ impressum: "Mentions légales",
770
+ privacy: "Politique de confidentialité",
771
+ terms: "Conditions d’utilisation",
772
+ },
773
+ backHome: "Retour à l’accueil",
774
+ accept: "J’accepte les {terms} et la {privacy}",
775
+ notice: {
776
+ beta: "Bêta fermée. Ces textes n’ont pas encore été relus par un avocat et le seront avant un lancement public.",
777
+ privacy:
778
+ "Bêta fermée. Les formulations juridiques ci-dessous n’ont pas encore été relues par un avocat\u202f; cela sera fait avant un lancement public. Les descriptions techniques — ce qui est stocké, où, et qui peut le lire — décrivent ce que fait réellement le logiciel aujourd’hui et sont faites pour être vérifiées par rapport à lui.",
779
+ },
780
+ translation: {
781
+ note: (o) =>
782
+ `Ceci est une traduction fournie pour votre commodité. Seule la version en ${o.bindingLanguage} fait foi.`,
783
+ show: (o) => `Afficher la version en ${o.bindingLanguage}`,
784
+ },
785
+ sections: {
786
+ impressum: {
787
+ operator: {
788
+ title: "Exploitant",
789
+ body: (o) =>
790
+ `${o.name}\n${o.postalCode} ${o.city}\n${o.country}\n\nL’adresse postale complète est communiquée sur demande à toute personne ayant un intérêt juridique légitime\u202f; écrivez à l’adresse de contact ci-dessous.`,
791
+ },
792
+ contact: {
793
+ title: "Contact",
794
+ body: (o) => `E-mail\u00a0: ${o.email}`,
795
+ },
796
+ disclaimer: {
797
+ title: "Responsabilité pour les contenus et les liens",
798
+ body: "Il s’agit d’un projet privé et non commercial, proposé dans le cadre d’une bêta fermée, sans garantie. Les sites externes vers lesquels nous renvoyons relèvent de la responsabilité de leurs exploitants respectifs\u202f; nous n’avons aucun contrôle sur leur contenu.",
799
+ },
800
+ },
801
+ privacy: {
802
+ controller: {
803
+ title: "Responsable du traitement",
804
+ body: (o) =>
805
+ `Le responsable du traitement des données personnelles dans ce service est\u00a0:\n${o.name}\n${o.postalCode} ${o.city}, ${o.country}\nE-mail\u00a0: ${o.email}\n\nL’adresse postale complète est communiquée sur demande aux personnes concernées et aux autorités de surveillance.`,
806
+ },
807
+ legal_basis: {
808
+ title: "Base légale",
809
+ body: "L’exploitant étant établi en Suisse, le traitement est régi par la loi fédérale suisse sur la protection des données (LPD). Lorsque le Règlement général sur la protection des données de l’UE (RGPD) vous est applicable, nous nous fondons sur l’exécution d’un contrat pour fournir le service (art. 6, par. 1, let. b RGPD) et sur notre intérêt légitime à l’exploiter et à le sécuriser (art. 6, par. 1, let. f RGPD).",
810
+ },
811
+ browser: {
812
+ title: "Ce que votre navigateur enregistre",
813
+ lead: "Aucun cookie. L’app conserve les éléments suivants dans le stockage de votre navigateur\u00a0:",
814
+ tail: "Rien de tout cela ne sert à vous suivre. Les éléments en attente d’envoi nous sont transmis dès que possible\u202f; tout le reste demeure sur votre appareil. Tout cela disparaît lorsque vous effacez les données du site, et la déconnexion supprime les jetons de connexion.",
815
+ },
816
+ rights: {
817
+ title: "Vos droits",
818
+ lead: "Vous disposez d’un droit d’accès, de rectification, d’effacement, de limitation, de portabilité des données et d’opposition.",
819
+ tail: "Si vous êtes en Suisse, vous pouvez vous adresser au Préposé fédéral à la protection des données et à la transparence (PFPDT)\u202f; si vous êtes dans l’UE, vous pouvez déposer une plainte auprès de votre autorité de surveillance locale.",
820
+ },
821
+ contact: {
822
+ title: "Contact pour la protection des données",
823
+ body: (o) => `Pour toute demande relative à la confidentialité, contactez\u00a0: ${o.email}`,
824
+ },
825
+ },
826
+ terms: {
827
+ warranty: {
828
+ title: "Absence de garantie",
829
+ body: "Le service est fourni «\u202ftel quel\u202f» et «\u202fselon disponibilité\u202f», sans garantie d’aucune sorte dans la mesure permise par la loi. En tant que bêta, il peut contenir des erreurs, changer ou être interrompu à tout moment — conservez vos propres sauvegardes des données importantes.",
830
+ },
831
+ liability: {
832
+ title: "Limitation de responsabilité",
833
+ body: "Dans la mesure permise par le droit applicable, l’exploitant n’est pas responsable des dommages indirects ou consécutifs résultant de l’utilisation ou de l’impossibilité d’utiliser le service. Rien ici ne limite une responsabilité qui ne peut pas être limitée par la loi.",
834
+ },
835
+ changes: {
836
+ title: "Modifications des présentes conditions",
837
+ body: "Ces conditions peuvent être mises à jour au fil de l’évolution du service. Les modifications importantes seront annoncées par e-mail ou dans l’app\u202f; continuer à utiliser le service après une modification vaut acceptation.",
838
+ },
839
+ language: {
840
+ title: "Langue",
841
+ body: (o) =>
842
+ `Les présentes conditions sont rédigées en ${o.bindingLanguage}. Les traductions dans d’autres langues sont fournies à titre indicatif uniquement\u202f; en cas de divergence, la version en ${o.bindingLanguage} prévaut.`,
843
+ },
844
+ law: {
845
+ title: "Droit applicable",
846
+ body: (o) =>
847
+ `Les présentes conditions sont régies par le droit suisse, à l’exclusion de ses règles de conflit de lois. Dans la mesure où la loi le permet, le for est ${o.city} (${o.region}), ${o.country}.`,
848
+ },
849
+ },
850
+ },
758
851
  },
759
852
  characterCount: {
760
853
  count: (used, max) => `${n(used)} sur ${n(max)} ${plural(max, "caractère", "caractères")}`,
@@ -742,8 +742,102 @@ export function uiKitLabelsHu(numberLocale = "hu-HU"): UiKitLabels {
742
742
  waking: (appName) =>
743
743
  `A szerver elalszik, ha senki sem használja ${appName ? `a(z) ${appName} alkalmazást` : "az alkalmazást"}, ezért egy szünet utáni első kérésnek újra el kell indítania. Ez eltarthat egy ideig – semmi sem vész el, az oldal magától betöltődik.`,
744
744
  },
745
+ // 0.28.0 — docs/legal-harmonization.md §4.3/§4.4: Kurvenschmiede's reviewed Hungarian
746
+ // (formal "Ön"), brought into line with the kit's English; it goes back to
747
+ // Kurvenschmiede for review.
745
748
  legal: {
746
749
  navLabel: "Jogi információk",
750
+ links: {
751
+ impressum: "Impresszum",
752
+ privacy: "Adatvédelmi tájékoztató",
753
+ terms: "Felhasználási feltételek",
754
+ },
755
+ titles: {
756
+ impressum: "Impresszum",
757
+ privacy: "Adatvédelmi tájékoztató",
758
+ terms: "Felhasználási feltételek",
759
+ },
760
+ backHome: "Vissza a kezdőlapra",
761
+ // The accusative ending is glued to the link, as Italian glues its article: "a
762
+ // Felhasználási feltételeket és az Adatvédelmi tájékoztatót". Nothing is added around
763
+ // a placeholder, and the articles fit these two titles (a F…, az A…).
764
+ accept: "Elfogadom a következőket: {terms} és {privacy}",
765
+ notice: {
766
+ beta: "Zárt béta. Ezeket a szövegeket ügyvéd még nem ellenőrizte; erre a nyilvános indulás előtt sor kerül.",
767
+ privacy:
768
+ "Zárt béta. Az alábbi jogi szövegezést ügyvéd még nem ellenőrizte; erre a nyilvános indulás előtt sor kerül. A műszaki leírások – mit tárolunk, hol és ki olvashatja – azt írják le, amit a szoftver ma ténylegesen tesz, és arra valók, hogy a szoftverrel össze lehessen vetni őket.",
769
+ },
770
+ translation: {
771
+ note: (o) =>
772
+ `Ez a szöveg tájékoztató jellegű fordítás; az irányadó változat nyelve: ${o.bindingLanguage}.`,
773
+ show: (o) => `Megjelenítés ezen a nyelven: ${o.bindingLanguage}`,
774
+ },
775
+ sections: {
776
+ impressum: {
777
+ operator: {
778
+ title: "Üzemeltető",
779
+ body: (o) =>
780
+ `${o.name}\n${o.postalCode} ${o.city}\n${o.country}\n\nA teljes postai címet kérésre megadjuk mindenkinek, akinek jogos jogi érdeke fűződik hozzá; ehhez írjon az alábbi kapcsolattartási címre.`,
781
+ },
782
+ contact: {
783
+ title: "Kapcsolat",
784
+ body: (o) => `E-mail: ${o.email}`,
785
+ },
786
+ disclaimer: {
787
+ title: "Felelősség a tartalmakért és a hivatkozásokért",
788
+ body: "Ez egy magán, nem kereskedelmi projekt, amelyet zárt béta keretében, szavatosság nélkül kínálunk. Az általunk hivatkozott külső oldalakért azok üzemeltetői felelősek; tartalmukra nincs befolyásunk.",
789
+ },
790
+ },
791
+ privacy: {
792
+ controller: {
793
+ title: "Adatkezelő",
794
+ body: (o) =>
795
+ `A szolgáltatásban a személyes adatok kezeléséért felelős:\n${o.name}\n${o.postalCode} ${o.city}, ${o.country}\nE-mail: ${o.email}\n\nA teljes postai címet kérésre megadjuk az érintetteknek és a felügyeleti hatóságoknak.`,
796
+ },
797
+ legal_basis: {
798
+ title: "Jogalap",
799
+ body: "Mivel az üzemeltető lakóhelye Svájcban van, az adatkezelésre a svájci szövetségi adatvédelmi törvény (DSG/FADP) az irányadó. Ha Önre az EU általános adatvédelmi rendelete (GDPR) vonatkozik, a szolgáltatás nyújtására irányuló szerződés teljesítésére (GDPR 6. cikk (1) b) pont) és a szolgáltatás működtetéséhez és védelméhez fűződő jogos érdekünkre (GDPR 6. cikk (1) f) pont) támaszkodunk.",
800
+ },
801
+ browser: {
802
+ title: "Mit tárol az Ön böngészője",
803
+ lead: "Nincsenek sütik. Az alkalmazás a következőket tárolja az Ön böngészőjének tárhelyén:",
804
+ tail: "Egyiket sem használjuk az Ön követésére. A küldésre váró bejegyzéseket a böngésző elküldi nekünk, amint lehetséges; minden más az Ön eszközén marad. Mindez eltűnik, amikor törli a webhely adatait, kijelentkezéskor pedig a bejelentkezési tokenek törlődnek.",
805
+ },
806
+ rights: {
807
+ title: "Az Ön jogai",
808
+ lead: "Önt megilleti a hozzáférés, a helyesbítés, a törlés, a korlátozás, az adathordozhatóság és a tiltakozás joga.",
809
+ tail: "Ha Svájcban tartózkodik, a Szövetségi Adatvédelmi és Információs Biztoshoz (FDPIC) fordulhat; ha az EU-ban, panaszt nyújthat be a helyi felügyeleti hatóságnál.",
810
+ },
811
+ contact: {
812
+ title: "Kapcsolat adatvédelmi ügyekben",
813
+ body: (o) => `Bármilyen adatvédelmi kérés esetén írjon ide: ${o.email}`,
814
+ },
815
+ },
816
+ terms: {
817
+ warranty: {
818
+ title: "Szavatosság kizárása",
819
+ body: "A szolgáltatást a jogszabályok által megengedett mértékben „ahogy van” és „ahogy elérhető” alapon nyújtjuk, mindenféle szavatosság nélkül. Bétaváltozatként hibákat tartalmazhat, változhat vagy bármikor megszakadhat – fontos adatairól készítsen saját biztonsági másolatot.",
820
+ },
821
+ liability: {
822
+ title: "Felelősségkorlátozás",
823
+ body: "Az alkalmazandó jog által megengedett mértékben az üzemeltető nem felel a szolgáltatás használatából vagy annak lehetetlenségéből eredő közvetett vagy következményes károkért. Ez nem korlátozza azt a felelősséget, amelyet jogszabály alapján nem lehet korlátozni.",
824
+ },
825
+ changes: {
826
+ title: "A feltételek módosítása",
827
+ body: "Ezek a feltételek a szolgáltatás fejlődésével módosulhatnak. A lényeges változásokat e-mailben vagy az alkalmazásban jelentjük be; aki a változás után tovább használja a szolgáltatást, elfogadja azt.",
828
+ },
829
+ language: {
830
+ title: "Nyelv",
831
+ body: (o) =>
832
+ `Ezek a feltételek ${o.bindingLanguage} nyelven készültek. A más nyelvű fordítások csak tájékoztató jellegűek; eltérés esetén az eredeti, ${o.bindingLanguage} nyelvű változat az irányadó.`,
833
+ },
834
+ law: {
835
+ title: "Irányadó jog",
836
+ body: (o) =>
837
+ `Ezekre a feltételekre a svájci jog az irányadó, a kollíziós szabályok kizárásával. A jogszabályok által megengedett mértékben az illetékes bíróság székhelye ${o.city} (${o.region}), ${o.country}.`,
838
+ },
839
+ },
840
+ },
747
841
  },
748
842
  characterCount: {
749
843
  // A noun after a numeral stays singular: "80 karakter".
@@ -741,8 +741,102 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
741
741
  waking: (appName) =>
742
742
  `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.`,
743
743
  },
744
+ // 0.28.0 — docs/legal-harmonization.md §4.3/§4.4: keksdose's reviewed Italian, and
745
+ // Kurvenschmiede's for the browser section and the beta notice; formal, "Lei" and
746
+ // "Suo" capitalised, like the rest of this catalogue.
744
747
  legal: {
745
748
  navLabel: "Note legali",
749
+ links: {
750
+ impressum: "Impressum",
751
+ privacy: "Privacy",
752
+ terms: "Condizioni d’uso",
753
+ },
754
+ titles: {
755
+ impressum: "Impressum",
756
+ privacy: "Informativa sulla privacy",
757
+ terms: "Condizioni d’uso",
758
+ },
759
+ backHome: "Torna alla pagina iniziale",
760
+ // The elided article stays glued to the link: "e l’Informativa", no space (§4.4).
761
+ accept: "Accetto le {terms} e l’{privacy}",
762
+ notice: {
763
+ beta: "Beta chiusa. Questi testi non sono ancora stati verificati da un avvocato e lo saranno prima di un lancio pubblico.",
764
+ privacy:
765
+ "Beta chiusa. Le formulazioni legali qui sotto non sono ancora state verificate da un avvocato; lo saranno prima di un lancio pubblico. Le descrizioni tecniche — cosa viene memorizzato, dove e chi può leggerlo — descrivono ciò che il software fa davvero oggi e sono pensate per essere verificate rispetto a esso.",
766
+ },
767
+ translation: {
768
+ note: (o) =>
769
+ `Questa è una traduzione fornita per Sua comodità. Fa fede la versione in ${o.bindingLanguage}.`,
770
+ show: (o) => `Mostra la versione in ${o.bindingLanguage}`,
771
+ },
772
+ sections: {
773
+ impressum: {
774
+ operator: {
775
+ title: "Gestore",
776
+ body: (o) =>
777
+ `${o.name}\n${o.postalCode} ${o.city}\n${o.country}\n\nL’indirizzo postale completo viene fornito su richiesta a chiunque abbia un legittimo interesse giuridico; scriva all’indirizzo di contatto qui sotto.`,
778
+ },
779
+ contact: {
780
+ title: "Contatto",
781
+ body: (o) => `Email: ${o.email}`,
782
+ },
783
+ disclaimer: {
784
+ title: "Responsabilità per contenuti e link",
785
+ body: "Questo è un progetto privato e non commerciale, offerto nell’ambito di una beta chiusa, senza garanzia. I siti esterni a cui rimandiamo sono di responsabilità dei rispettivi gestori; non abbiamo alcun controllo sui loro contenuti.",
786
+ },
787
+ },
788
+ privacy: {
789
+ controller: {
790
+ title: "Titolare del trattamento",
791
+ // "Titolare", as the title says: in the GDPR's Italian the "responsabile del
792
+ // trattamento" is the processor (Art. 28), not the controller.
793
+ body: (o) =>
794
+ `Il titolare del trattamento dei dati personali in questo servizio è:\n${o.name}\n${o.postalCode} ${o.city}, ${o.country}\nEmail: ${o.email}\n\nL’indirizzo postale completo viene fornito su richiesta agli interessati e alle autorità di controllo.`,
795
+ },
796
+ legal_basis: {
797
+ title: "Base giuridica",
798
+ body: "Poiché il gestore risiede in Svizzera, il trattamento è disciplinato dalla Legge federale svizzera sulla protezione dei dati (LPD). Dove il Regolamento generale sulla protezione dei dati dell’UE (GDPR) si applica a Lei, ci basiamo sull’esecuzione di un contratto per fornire il servizio (art. 6, par. 1, lett. b GDPR) e sul nostro legittimo interesse a gestirlo e proteggerlo (art. 6, par. 1, lett. f GDPR).",
799
+ },
800
+ browser: {
801
+ title: "Che cosa salva il Suo browser",
802
+ lead: "Nessun cookie. L’app salva quanto segue nella memoria del Suo browser:",
803
+ tail: "Niente di tutto ciò viene usato per tracciarLa. Le voci in attesa di invio ci vengono trasmesse non appena possibile; tutto il resto rimane sul Suo dispositivo. Tutto questo scompare quando cancella i dati del sito, e uscendo dall’account vengono rimossi i token di accesso.",
804
+ },
805
+ rights: {
806
+ title: "I Suoi diritti",
807
+ lead: "Ha diritto di accesso, rettifica, cancellazione, limitazione, portabilità dei dati e opposizione.",
808
+ tail: "Se si trova in Svizzera può rivolgersi all’Incaricato federale della protezione dei dati e della trasparenza (IFPDT); se si trova nell’UE può presentare reclamo alla Sua autorità di controllo locale.",
809
+ },
810
+ contact: {
811
+ title: "Contatto per la protezione dei dati",
812
+ body: (o) => `Per qualsiasi richiesta sulla privacy, si rivolga a: ${o.email}`,
813
+ },
814
+ },
815
+ terms: {
816
+ warranty: {
817
+ title: "Nessuna garanzia",
818
+ body: "Il servizio è fornito «così com’è» e «come disponibile», senza garanzie di alcun tipo nei limiti consentiti dalla legge. Come beta può contenere errori, cambiare o essere interrotto in qualsiasi momento: conservi copie di backup dei dati importanti.",
819
+ },
820
+ liability: {
821
+ title: "Limitazione di responsabilità",
822
+ body: "Nei limiti consentiti dalla legge applicabile, il gestore non è responsabile per danni indiretti o consequenziali derivanti dall’uso o dall’impossibilità di usare il servizio. Nulla di quanto qui previsto limita la responsabilità che non può essere limitata per legge.",
823
+ },
824
+ changes: {
825
+ title: "Modifiche a queste condizioni",
826
+ body: "Queste condizioni possono essere aggiornate con l’evoluzione del servizio. Le modifiche sostanziali saranno annunciate via email o nell’app; l’uso continuato dopo una modifica ne implica l’accettazione.",
827
+ },
828
+ language: {
829
+ title: "Lingua",
830
+ body: (o) =>
831
+ `Le presenti condizioni sono redatte in ${o.bindingLanguage}. Le traduzioni in altre lingue sono fornite solo per comodità; in caso di divergenza prevale la versione in ${o.bindingLanguage}.`,
832
+ },
833
+ law: {
834
+ title: "Legge applicabile",
835
+ body: (o) =>
836
+ `Queste condizioni sono disciplinate dal diritto svizzero, con esclusione delle norme sui conflitti di legge. Nei limiti consentiti dalla legge, il foro competente è ${o.city} (${o.region}), ${o.country}.`,
837
+ },
838
+ },
839
+ },
746
840
  },
747
841
  characterCount: {
748
842
  count: (used, max) => `${n(used)} di ${n(max)} ${plural(max, "carattere", "caratteri")}`,