@eifi1/ui-kit 0.41.0 → 0.42.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 (143) hide show
  1. package/README.md +19 -6
  2. package/dist/admin/admin-area-labels.d.ts +55 -0
  3. package/dist/admin/admin-area-labels.js +33 -0
  4. package/dist/admin/admin-area-labels.js.map +1 -0
  5. package/dist/admin/admin-forbidden.d.ts +35 -0
  6. package/dist/admin/admin-forbidden.js +36 -0
  7. package/dist/admin/admin-forbidden.js.map +1 -0
  8. package/dist/admin/admin-overview.d.ts +93 -0
  9. package/dist/admin/admin-overview.js +69 -0
  10. package/dist/admin/admin-overview.js.map +1 -0
  11. package/dist/admin/admin-sections.d.ts +63 -0
  12. package/dist/admin/admin-sections.js +64 -0
  13. package/dist/admin/admin-sections.js.map +1 -0
  14. package/dist/admin/admin-tool-links.d.ts +48 -0
  15. package/dist/admin/admin-tool-links.js +31 -0
  16. package/dist/admin/admin-tool-links.js.map +1 -0
  17. package/dist/billing/billing-banner.d.ts +25 -2
  18. package/dist/billing/billing-banner.js +5 -2
  19. package/dist/billing/billing-banner.js.map +1 -1
  20. package/dist/billing/billing-labels.d.ts +32 -0
  21. package/dist/billing/billing-labels.js +9 -0
  22. package/dist/billing/billing-labels.js.map +1 -1
  23. package/dist/billing/billing-overview.d.ts +33 -0
  24. package/dist/billing/billing-overview.js +6 -0
  25. package/dist/billing/billing-overview.js.map +1 -1
  26. package/dist/billing/billing-standing.d.ts +8 -0
  27. package/dist/billing/billing-standing.js.map +1 -1
  28. package/dist/billing/cancel-subscription.d.ts +46 -0
  29. package/dist/billing/cancel-subscription.js +57 -0
  30. package/dist/billing/cancel-subscription.js.map +1 -0
  31. package/dist/billing/plan-card.d.ts +45 -1
  32. package/dist/billing/plan-card.js +53 -2
  33. package/dist/billing/plan-card.js.map +1 -1
  34. package/dist/billing/plan-switch.d.ts +10 -1
  35. package/dist/billing/plan-switch.js +22 -13
  36. package/dist/billing/plan-switch.js.map +1 -1
  37. package/dist/billing/subscription-actions.d.ts +37 -4
  38. package/dist/billing/subscription-actions.js +10 -3
  39. package/dist/billing/subscription-actions.js.map +1 -1
  40. package/dist/components/account-chips.d.ts +42 -1
  41. package/dist/components/account-chips.js +33 -0
  42. package/dist/components/account-chips.js.map +1 -1
  43. package/dist/components/empty-state.d.ts +2 -1
  44. package/dist/components/empty-state.js.map +1 -1
  45. package/dist/eslint/index.js +1 -1
  46. package/dist/i18n/defaults.js +5 -1
  47. package/dist/i18n/defaults.js.map +1 -1
  48. package/dist/i18n/german.js +79 -0
  49. package/dist/i18n/german.js.map +1 -1
  50. package/dist/i18n/kit-labels.d.ts +9 -0
  51. package/dist/i18n/kit-labels.js.map +1 -1
  52. package/dist/i18n/locales/en.js +93 -1
  53. package/dist/i18n/locales/en.js.map +3 -3
  54. package/dist/i18n/locales/es.js +76 -0
  55. package/dist/i18n/locales/es.js.map +1 -1
  56. package/dist/i18n/locales/fr.js +75 -0
  57. package/dist/i18n/locales/fr.js.map +1 -1
  58. package/dist/i18n/locales/hu.js +76 -0
  59. package/dist/i18n/locales/hu.js.map +1 -1
  60. package/dist/i18n/locales/it.js +76 -0
  61. package/dist/i18n/locales/it.js.map +1 -1
  62. package/dist/i18n/locales/zh.js +75 -0
  63. package/dist/i18n/locales/zh.js.map +1 -1
  64. package/dist/i18n/review.js +20 -1
  65. package/dist/i18n/review.js.map +1 -1
  66. package/dist/index.d.ts +18 -2
  67. package/dist/index.js +23 -1
  68. package/dist/index.js.map +1 -1
  69. package/dist/settings/settings-layout.d.ts +7 -1
  70. package/dist/settings/settings-layout.js +35 -27
  71. package/dist/settings/settings-layout.js.map +1 -1
  72. package/dist/shell/account-menu-language.d.ts +46 -0
  73. package/dist/shell/account-menu-language.js +64 -0
  74. package/dist/shell/account-menu-language.js.map +1 -0
  75. package/dist/shell/admin-menu.d.ts +46 -0
  76. package/dist/shell/admin-menu.js +60 -0
  77. package/dist/shell/admin-menu.js.map +1 -0
  78. package/dist/shell/app-shell.d.ts +10 -0
  79. package/dist/shell/app-shell.js +22 -4
  80. package/dist/shell/app-shell.js.map +1 -1
  81. package/dist/shell/dev-switchers.d.ts +53 -0
  82. package/dist/shell/dev-switchers.js +102 -0
  83. package/dist/shell/dev-switchers.js.map +1 -0
  84. package/dist/shell/sync-status-indicator.d.ts +86 -0
  85. package/dist/shell/sync-status-indicator.js +170 -0
  86. package/dist/shell/sync-status-indicator.js.map +1 -0
  87. package/dist/shell/top-bar-actions.d.ts +49 -0
  88. package/dist/shell/top-bar-actions.js +31 -0
  89. package/dist/shell/top-bar-actions.js.map +1 -0
  90. package/dist/shell/top-bar-parts-labels.d.ts +84 -0
  91. package/dist/shell/top-bar-parts-labels.js +48 -0
  92. package/dist/shell/top-bar-parts-labels.js.map +1 -0
  93. package/dist/shell/topbar-action-menu.d.ts +13 -1
  94. package/dist/shell/topbar-action-menu.js +5 -2
  95. package/dist/shell/topbar-action-menu.js.map +1 -1
  96. package/dist/shell/topbar-controls.d.ts +16 -3
  97. package/dist/shell/topbar-controls.js +5 -1
  98. package/dist/shell/topbar-controls.js.map +1 -1
  99. package/dist/shell/tour-menu.d.ts +58 -0
  100. package/dist/shell/tour-menu.js +73 -0
  101. package/dist/shell/tour-menu.js.map +1 -0
  102. package/dist/shell.d.ts +14 -0
  103. package/dist/shell.js +19 -0
  104. package/dist/shell.js.map +1 -1
  105. package/package.json +1 -1
  106. package/src/admin/admin-area-labels.ts +85 -0
  107. package/src/admin/admin-forbidden.tsx +75 -0
  108. package/src/admin/admin-overview.tsx +166 -0
  109. package/src/admin/admin-sections.tsx +137 -0
  110. package/src/admin/admin-tool-links.tsx +84 -0
  111. package/src/billing/billing-banner.tsx +32 -4
  112. package/src/billing/billing-labels.ts +53 -0
  113. package/src/billing/billing-overview.ts +37 -0
  114. package/src/billing/billing-standing.ts +8 -0
  115. package/src/billing/cancel-subscription.tsx +102 -0
  116. package/src/billing/plan-card.tsx +97 -1
  117. package/src/billing/plan-switch.tsx +16 -0
  118. package/src/billing/subscription-actions.tsx +64 -15
  119. package/src/components/account-chips.tsx +81 -1
  120. package/src/components/empty-state.tsx +2 -1
  121. package/src/i18n/defaults.ts +4 -0
  122. package/src/i18n/german.ts +92 -0
  123. package/src/i18n/kit-labels.tsx +9 -0
  124. package/src/i18n/locales/en.ts +19 -0
  125. package/src/i18n/locales/es.ts +86 -0
  126. package/src/i18n/locales/fr.ts +86 -0
  127. package/src/i18n/locales/hu.ts +84 -0
  128. package/src/i18n/locales/it.ts +87 -0
  129. package/src/i18n/locales/zh.ts +79 -0
  130. package/src/i18n/review.ts +19 -0
  131. package/src/index.ts +30 -2
  132. package/src/settings/settings-layout.tsx +58 -34
  133. package/src/shell/account-menu-language.tsx +116 -0
  134. package/src/shell/admin-menu.tsx +117 -0
  135. package/src/shell/app-shell.tsx +44 -3
  136. package/src/shell/dev-switchers.tsx +171 -0
  137. package/src/shell/sync-status-indicator.tsx +301 -0
  138. package/src/shell/top-bar-actions.tsx +79 -0
  139. package/src/shell/top-bar-parts-labels.ts +133 -0
  140. package/src/shell/topbar-action-menu.tsx +15 -2
  141. package/src/shell/topbar-controls.tsx +20 -3
  142. package/src/shell/tour-menu.tsx +144 -0
  143. package/src/shell.ts +24 -0
@@ -1729,6 +1729,12 @@ export function germanLabels(numberLocale: string): UiKitLabels {
1729
1729
  "Ihre Zahlung wird verarbeitet. Ihr Tarif beginnt, sobald sie bestätigt ist; diese Seite aktualisiert sich von selbst.",
1730
1730
  choosePlan: "Tarif wählen",
1731
1731
  updatePayment: "Zahlungsmethode aktualisieren",
1732
+ // 0.42 (§16.7 A): for an admin who isn't the buyer. "Das Admin-Konto", which gives the
1733
+ // reader no gender.
1734
+ paymentFailedAskBuyer: (buyer) =>
1735
+ buyer
1736
+ ? `Die Zahlung ist fehlgeschlagen. ${buyer} kann die Zahlungsmethode aktualisieren.`
1737
+ : "Die Zahlung ist fehlgeschlagen. Die Zahlungsmethode kann über das Admin-Konto aktualisiert werden, mit dem das Abonnement abgeschlossen wurde.",
1732
1738
  checkAgain: "Erneut prüfen",
1733
1739
  lockReason: "Ihr Tarif ist abgelaufen. Wählen Sie einen Tarif, um wieder Änderungen vorzunehmen.",
1734
1740
  // As `characterCount.limitReached` ("Zeichenlimit erreicht").
@@ -1763,6 +1769,20 @@ export function germanLabels(numberLocale: string): UiKitLabels {
1763
1769
  switchCredited: "Gutschrift auf die nächsten Belastungen",
1764
1770
  switchNextCharge: (date) => `Nächste Belastung am ${date}`,
1765
1771
  switchConfirm: "Tarif ändern",
1772
+ // 0.42 (§16): the portal for the buyer only, the in-app cancel, the grant warning.
1773
+ buyerHolds: (buyer) =>
1774
+ buyer
1775
+ ? `Zahlungsmethode und Rechnungen liegen bei ${buyer}: Das Abonnement wurde über dieses Konto abgeschlossen.`
1776
+ : "Zahlungsmethode und Rechnungen liegen beim Admin-Konto, mit dem das Abonnement abgeschlossen wurde.",
1777
+ cancelConfirmTitle: "Abonnement kündigen",
1778
+ cancelConfirmBody: (date) => `Ihr Abonnement endet am ${date}. Bis dahin funktioniert alles wie bisher.`,
1779
+ // §312k BGB: the confirmation button says exactly this.
1780
+ cancelConfirmAction: "Jetzt kündigen",
1781
+ keepSubscription: "Abonnement behalten",
1782
+ grantWarningTitle: "Ihr kostenloser Zugang läuft weiter",
1783
+ grantWarningBody:
1784
+ "Ihr kostenloser Zugang hat kein Enddatum. Solange er läuft, ändert ein Kauf Ihren Tarif nicht: Sie würden für einen Tarif bezahlen, der nicht gilt.",
1785
+ grantWarningAction: "Trotzdem kaufen",
1766
1786
  waitingChanges: (count) =>
1767
1787
  count === 1
1768
1788
  ? `${n(count)} Änderung wartet auf einen Tarif`
@@ -1839,5 +1859,77 @@ export function germanLabels(numberLocale: string): UiKitLabels {
1839
1859
  more: "Mehr",
1840
1860
  moreTitle: "Weitere Seiten",
1841
1861
  },
1862
+ // 0.42.0 — docs/admin-harmonization.md §3.1: the admin area's shared words. "Verwaltung"
1863
+ // as settings §5 names the page; "mit Administratorrechten" rather than "für
1864
+ // Administratoren", which would give the reader a gender (as `transferOwnership`).
1865
+ adminArea: {
1866
+ title: "Verwaltung",
1867
+ waiting: (count) => `${n(count)} offen`,
1868
+ forbiddenTitle: "Nur mit Administratorrechten",
1869
+ forbiddenBody: (appName) => `Hier wird ${appName} verwaltet. Ihr Konto kann diese Seite nicht öffnen.`,
1870
+ forbiddenHome: "Zur Startseite",
1871
+ forbiddenReviewer: "Übersetzungen prüfen",
1872
+ sections: {
1873
+ overview: { title: "Übersicht", help: "Was gerade wartet, auf einen Blick." },
1874
+ users: { title: "Benutzer", help: "Wer ein Konto hat und was jede Person darf." },
1875
+ invitations: { title: "Einladungen", help: "Die Links, mit denen neue Personen dazukommen." },
1876
+ billing: { title: "Abrechnung", help: "Tarif, Zahlung und Rechnungen." },
1877
+ activity: { title: "Aktivität", help: "Was in der Verwaltung getan wurde, das Neueste zuerst." },
1878
+ },
1879
+ tiles: {
1880
+ feedbackWaiting: "Zu sichten",
1881
+ deletionRequests: "Löschanfragen",
1882
+ invitationsPending: "Offene Einladungen",
1883
+ users: "Benutzer",
1884
+ usersNew: (count) => `${n(count)} neu in 7 Tagen`,
1885
+ },
1886
+ tools: "Werkzeuge",
1887
+ },
1888
+ // 0.42.0 — docs/top-bar-harmonization.md §3.1: the top bar's shared parts. keksdose's
1889
+ // reviewed sync words where they are not about its budgets; "Tarif" as `billing`.
1890
+ topBarParts: {
1891
+ tours: {
1892
+ menu: "Geführte Touren",
1893
+ newDot: "Neue Touren",
1894
+ thisPage: "Auf dieser Seite",
1895
+ newTours: "Neue Touren",
1896
+ allTours: "Alle Touren…",
1897
+ badgeNew: "Neu",
1898
+ completed: "Abgeschlossen",
1899
+ },
1900
+ sync: {
1901
+ blocked: (count) =>
1902
+ count === 1
1903
+ ? `${n(count)} Änderung kann von diesem Gerät nicht gesendet werden`
1904
+ : `${n(count)} Änderungen können von diesem Gerät nicht gesendet werden`,
1905
+ offline: "Offline – Änderungen werden auf diesem Gerät gespeichert und bei erneuter Verbindung synchronisiert",
1906
+ refused: "Der Server hat den letzten Abgleich abgelehnt",
1907
+ syncing: "Wird synchronisiert…",
1908
+ pending: (count) =>
1909
+ count === 1
1910
+ ? `${n(count)} Änderung wartet auf Synchronisierung`
1911
+ : `${n(count)} Änderungen warten auf Synchronisierung`,
1912
+ syncedAt: (time) => `Synchronisiert um ${time}`,
1913
+ idle: "Aktuell",
1914
+ syncHint: "Tippen, um jetzt zu synchronisieren",
1915
+ offlineHint: "offline gibt es nichts zu synchronisieren",
1916
+ withHint: (state, hint) => `${state} – ${hint}`,
1917
+ scoped: (scope, state) => `${scope}: ${state}`,
1918
+ offlineShort: "Offline",
1919
+ syncingShort: "Sync läuft…",
1920
+ waitingShort: (count) => `${n(count)} ausstehend`,
1921
+ refusedShort: "Nicht synchronisiert",
1922
+ offlineUnsaved: "Offline – Änderungen können erst nach erneuter Verbindung gespeichert werden",
1923
+ saving: "Wird gespeichert…",
1924
+ },
1925
+ dev: {
1926
+ roleHeading: "Dev · Rolle",
1927
+ switchPlan: "Tarif wechseln",
1928
+ plan: (value) => `Tarif: ${value}`,
1929
+ planHeading: "Dev · Tarif",
1930
+ backTo: (role) => `Zurück zu ${role}`,
1931
+ billingOff: "Die Abrechnung ist lokal aus: Tarife ändern nichts",
1932
+ },
1933
+ },
1842
1934
  };
1843
1935
  }
@@ -118,6 +118,8 @@ import type { PhoneInputLabels } from "../components/phone-input";
118
118
  import type { SignChipLabels } from "../components/sign-chip";
119
119
  import type { ColumnMapperLabels } from "../components/column-mapper";
120
120
  import type { NotificationsLabels } from "../notifications/notifications-labels";
121
+ import type { AdminAreaLabels } from "../admin/admin-area-labels";
122
+ import type { TopBarPartsLabels } from "../shell/top-bar-parts-labels";
121
123
 
122
124
  /**
123
125
  * EVERY string the kit renders, as one typed tree — and an optional provider that
@@ -475,6 +477,13 @@ export interface UiKitLabels {
475
477
  * device's push, the device list, and the unsubscribe page
476
478
  * (docs/notifications-harmonization.md §4.2). */
477
479
  notifications: NotificationsLabels;
480
+ /** 0.42.0: the admin area's shared words — the account menu's "Administration" row, the
481
+ * 403 page, the shared sections, the overview's tiles and the Tools list
482
+ * (docs/admin-harmonization.md §3.1). */
483
+ adminArea: AdminAreaLabels;
484
+ /** 0.42.0: the top bar's shared parts — `TourMenu`, `SyncStatusIndicator`, `DevSwitchers`
485
+ * (docs/top-bar-harmonization.md §3.1). */
486
+ topBarParts: TopBarPartsLabels;
478
487
  }
479
488
 
480
489
  /**
@@ -216,6 +216,25 @@ export function uiKitLabelsEn(numberLocale = "en-US"): UiKitLabels {
216
216
  ...d.settings,
217
217
  matchCount: (count) => (count === 1 ? "1 match" : `${n(count)} matches`),
218
218
  },
219
+ // 0.42.0: the admin area's two counts (docs/admin-harmonization.md §3.1).
220
+ adminArea: {
221
+ ...d.adminArea,
222
+ waiting: (count) => `${n(count)} waiting`,
223
+ tiles: { ...d.adminArea.tiles, usersNew: (count) => `${n(count)} new in 7 days` },
224
+ },
225
+ // 0.42.0: the top bar's three counts (docs/top-bar-harmonization.md §3.1).
226
+ topBarParts: {
227
+ ...d.topBarParts,
228
+ sync: {
229
+ ...d.topBarParts.sync,
230
+ blocked: (count) =>
231
+ count === 1
232
+ ? "1 change cannot be sent from this device"
233
+ : `${n(count)} changes cannot be sent from this device`,
234
+ pending: (count) => (count === 1 ? "1 change waiting to sync" : `${n(count)} changes waiting to sync`),
235
+ waitingShort: (count) => `${n(count)} waiting`,
236
+ },
237
+ },
219
238
  demo: {
220
239
  ...d.demo,
221
240
  rateLimited: (minutes) =>
@@ -1683,6 +1683,11 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
1683
1683
  "Su pago se está procesando. Su plan empieza en cuanto se confirme; esta página se actualiza sola.",
1684
1684
  choosePlan: "Elegir un plan",
1685
1685
  updatePayment: "Actualizar el método de pago",
1686
+ // 0.42 (§16.7 A): for an admin who isn't the buyer.
1687
+ paymentFailedAskBuyer: (buyer) =>
1688
+ buyer
1689
+ ? `El pago no se ha completado. ${buyer} puede actualizar el método de pago.`
1690
+ : "El pago no se ha completado. El administrador que contrató la suscripción puede actualizar el método de pago.",
1686
1691
  checkAgain: "Volver a comprobar",
1687
1692
  lockReason: "Su plan ha terminado. Elija un plan para volver a hacer cambios.",
1688
1693
  // As `characterCount.limitReached` ("Límite de caracteres alcanzado").
@@ -1713,6 +1718,19 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
1713
1718
  switchCredited: "Abonado a sus próximos cargos",
1714
1719
  switchNextCharge: (date) => `Próximo cargo el ${date}`,
1715
1720
  switchConfirm: "Cambiar de plan",
1721
+ // 0.42 (§16): the portal for the buyer only, the in-app cancel, the grant warning.
1722
+ buyerHolds: (buyer) =>
1723
+ buyer
1724
+ ? `El método de pago y las facturas los gestiona ${buyer}, que contrató la suscripción.`
1725
+ : "El método de pago y las facturas los gestiona el administrador que contrató la suscripción.",
1726
+ cancelConfirmTitle: "Cancelar la suscripción",
1727
+ cancelConfirmBody: (date) => `Su suscripción termina el ${date}. Hasta entonces, todo funciona como antes.`,
1728
+ cancelConfirmAction: "Cancelar ahora la suscripción",
1729
+ keepSubscription: "Mantener la suscripción",
1730
+ grantWarningTitle: "Su acceso gratuito continúa",
1731
+ grantWarningBody:
1732
+ "Su acceso gratuito no tiene fecha de fin. Mientras dure, una compra no cambia su plan: pagaría por un plan que no se aplica.",
1733
+ grantWarningAction: "Comprar de todos modos",
1716
1734
  waitingChanges: (count) => `${n(count)} ${plural(count, "cambio", "cambios")} a la espera de un plan`,
1717
1735
  // "Descartar", as `wizard.cancelConfirmLabel`.
1718
1736
  discardWaiting: "Descartar los cambios en espera",
@@ -1781,6 +1799,74 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
1781
1799
  more: "Más",
1782
1800
  moreTitle: "Más páginas",
1783
1801
  },
1802
+ // 0.42.0 — docs/admin-harmonization.md §3.1: the admin area's shared words. "Usted",
1803
+ // as the rest of the catalogue.
1804
+ adminArea: {
1805
+ title: "Administración",
1806
+ waiting: (count) => `${n(count)} ${plural(count, "pendiente", "pendientes")}`,
1807
+ forbiddenTitle: "Solo para administradores",
1808
+ forbiddenBody: (appName) =>
1809
+ `Aquí es donde los administradores gestionan ${appName}. Su cuenta no puede abrir esta página.`,
1810
+ forbiddenHome: "Ir a la página de inicio",
1811
+ forbiddenReviewer: "Revisar traducciones",
1812
+ sections: {
1813
+ overview: { title: "Resumen", help: "Lo que está pendiente, de un vistazo." },
1814
+ users: { title: "Usuarios", help: "Quién tiene una cuenta y qué puede hacer cada uno." },
1815
+ invitations: { title: "Invitaciones", help: "Los enlaces con los que entra una persona nueva." },
1816
+ billing: { title: "Facturación", help: "El plan, el pago y las facturas." },
1817
+ activity: { title: "Actividad", help: "Lo que hicieron los administradores, lo más reciente primero." },
1818
+ },
1819
+ tiles: {
1820
+ feedbackWaiting: "Por clasificar",
1821
+ deletionRequests: "Solicitudes de eliminación",
1822
+ invitationsPending: "Invitaciones pendientes",
1823
+ users: "Usuarios",
1824
+ usersNew: (count) => `${n(count)} ${plural(count, "nuevo", "nuevos")} en 7 días`,
1825
+ },
1826
+ tools: "Herramientas",
1827
+ },
1828
+ // 0.42.0 — docs/top-bar-harmonization.md §3.1: the top bar's shared parts; "plan" as
1829
+ // `billing`, "usted" as the rest of the catalogue.
1830
+ topBarParts: {
1831
+ tours: {
1832
+ menu: "Visitas guiadas",
1833
+ newDot: "Visitas nuevas",
1834
+ thisPage: "En esta página",
1835
+ newTours: "Visitas nuevas",
1836
+ allTours: "Todas las visitas…",
1837
+ badgeNew: "Nuevo",
1838
+ completed: "Completada",
1839
+ },
1840
+ sync: {
1841
+ blocked: (count) =>
1842
+ `${n(count)} ${plural(count, "cambio no se puede enviar", "cambios no se pueden enviar")} desde este dispositivo`,
1843
+ offline: "Sin conexión: los cambios se guardan en este dispositivo y se sincronizarán al volver a conectarse",
1844
+ refused: "El servidor rechazó la última sincronización",
1845
+ syncing: "Sincronizando…",
1846
+ pending: (count) =>
1847
+ `${n(count)} ${plural(count, "cambio", "cambios")} a la espera de sincronizarse`,
1848
+ syncedAt: (time) => `Sincronizado a las ${time}`,
1849
+ idle: "Al día",
1850
+ syncHint: "Toque para sincronizar ahora",
1851
+ offlineHint: "no hay nada que sincronizar sin conexión",
1852
+ withHint: (state, hint) => `${state} — ${hint}`,
1853
+ scoped: (scope, state) => `${scope}: ${state}`,
1854
+ offlineShort: "Sin conexión",
1855
+ syncingShort: "Sincronizando…",
1856
+ waitingShort: (count) => `${n(count)} en espera`,
1857
+ refusedShort: "Sin sincronizar",
1858
+ offlineUnsaved: "Sin conexión: los cambios no se pueden guardar hasta que vuelva a conectarse",
1859
+ saving: "Guardando…",
1860
+ },
1861
+ dev: {
1862
+ roleHeading: "Dev · rol",
1863
+ switchPlan: "Cambiar de plan",
1864
+ plan: (value) => `Plan: ${value}`,
1865
+ planHeading: "Dev · plan",
1866
+ backTo: (role) => `Volver a ${role}`,
1867
+ billingOff: "La facturación está desactivada en local: los planes no cambian nada",
1868
+ },
1869
+ },
1784
1870
  };
1785
1871
  }
1786
1872
 
@@ -1716,6 +1716,11 @@ export function uiKitLabelsFr(numberLocale = "fr-FR"): UiKitLabels {
1716
1716
  "Votre paiement est en cours de traitement. Votre formule démarre dès qu’il est confirmé\u202f; cette page se met à jour d’elle-même.",
1717
1717
  choosePlan: "Choisir une formule",
1718
1718
  updatePayment: "Mettre à jour le moyen de paiement",
1719
+ // 0.42 (§16.7 A): for an admin who isn't the buyer.
1720
+ paymentFailedAskBuyer: (buyer) =>
1721
+ buyer
1722
+ ? `Le paiement a échoué. ${buyer} peut mettre à jour le moyen de paiement.`
1723
+ : "Le paiement a échoué. L’administrateur qui a souscrit l’abonnement peut mettre à jour le moyen de paiement.",
1719
1724
  checkAgain: "Vérifier à nouveau",
1720
1725
  lockReason: "Votre formule a pris fin. Choisissez une formule pour pouvoir de nouveau apporter des modifications.",
1721
1726
  // As `characterCount.limitReached` ("Limite de caractères atteinte").
@@ -1747,6 +1752,20 @@ export function uiKitLabelsFr(numberLocale = "fr-FR"): UiKitLabels {
1747
1752
  switchCredited: "Crédité sur vos prochains paiements",
1748
1753
  switchNextCharge: (date) => `Prochain prélèvement le ${date}`,
1749
1754
  switchConfirm: "Changer de formule",
1755
+ // 0.42 (§16): the portal for the buyer only, the in-app cancel, the grant warning.
1756
+ buyerHolds: (buyer) =>
1757
+ buyer
1758
+ ? `Le moyen de paiement et les factures sont gérés par ${buyer}, qui a souscrit l’abonnement.`
1759
+ : "Le moyen de paiement et les factures sont gérés par l’administrateur qui a souscrit l’abonnement.",
1760
+ cancelConfirmTitle: "Résilier l’abonnement",
1761
+ cancelConfirmBody: (date) =>
1762
+ `Votre abonnement prendra fin le ${date}. D’ici là, tout fonctionne comme avant.`,
1763
+ cancelConfirmAction: "Résilier maintenant",
1764
+ keepSubscription: "Conserver l’abonnement",
1765
+ grantWarningTitle: "Votre accès gratuit continue",
1766
+ grantWarningBody:
1767
+ "Votre accès gratuit n’a pas de date de fin. Tant qu’il dure, un achat ne change pas votre formule : vous paieriez pour une formule qui ne s’applique pas.",
1768
+ grantWarningAction: "Acheter quand même",
1750
1769
  waitingChanges: (count) =>
1751
1770
  `${n(count)} ${plural(count, "modification en attente", "modifications en attente")} d’une formule`,
1752
1771
  // "Abandonner", as `wizard.cancelConfirmLabel`.
@@ -1820,6 +1839,73 @@ export function uiKitLabelsFr(numberLocale = "fr-FR"): UiKitLabels {
1820
1839
  more: "Plus",
1821
1840
  moreTitle: "Autres pages",
1822
1841
  },
1842
+ // 0.42.0 — docs/admin-harmonization.md §3.1: the admin area's shared words.
1843
+ adminArea: {
1844
+ title: "Administration",
1845
+ waiting: (count) => `${n(count)} en attente`,
1846
+ forbiddenTitle: "Réservé aux administrateurs",
1847
+ forbiddenBody: (appName) =>
1848
+ `C’est ici que les administrateurs gèrent ${appName}. Votre compte ne peut pas ouvrir cette page.`,
1849
+ forbiddenHome: "Aller à la page d’accueil",
1850
+ forbiddenReviewer: "Relire les traductions",
1851
+ sections: {
1852
+ overview: { title: "Vue d’ensemble", help: "Ce qui est en attente, en un coup d’œil." },
1853
+ users: { title: "Utilisateurs", help: "Qui a un compte, et ce que chacun peut faire." },
1854
+ invitations: { title: "Invitations", help: "Les liens qui permettent à une nouvelle personne d’entrer." },
1855
+ billing: { title: "Facturation", help: "L’offre, le paiement et les factures." },
1856
+ activity: { title: "Activité", help: "Ce que les administrateurs ont fait, du plus récent au plus ancien." },
1857
+ },
1858
+ tiles: {
1859
+ feedbackWaiting: "À trier",
1860
+ deletionRequests: "Demandes de suppression",
1861
+ invitationsPending: "Invitations en attente",
1862
+ users: "Utilisateurs",
1863
+ usersNew: (count) => `${n(count)} ${plural(count, "nouveau", "nouveaux")} en 7 jours`,
1864
+ },
1865
+ tools: "Outils",
1866
+ },
1867
+ // 0.42.0 — docs/top-bar-harmonization.md §3.1: the top bar's shared parts, keksdose's
1868
+ // reviewed sync words where they are not about its budgets; "formule" as `billing`.
1869
+ topBarParts: {
1870
+ tours: {
1871
+ menu: "Visites guidées",
1872
+ newDot: "Nouvelles visites",
1873
+ thisPage: "Sur cette page",
1874
+ newTours: "Nouvelles visites",
1875
+ allTours: "Toutes les visites…",
1876
+ badgeNew: "Nouveau",
1877
+ completed: "Terminée",
1878
+ },
1879
+ sync: {
1880
+ blocked: (count) =>
1881
+ `${n(count)} ${plural(count, "modification ne peut pas être envoyée", "modifications ne peuvent pas être envoyées")} depuis cet appareil`,
1882
+ offline: "Hors ligne — les modifications sont enregistrées sur cet appareil et seront synchronisées à la reconnexion",
1883
+ refused: "Le serveur a refusé la dernière synchronisation",
1884
+ syncing: "Synchronisation…",
1885
+ pending: (count) =>
1886
+ `${n(count)} ${plural(count, "modification", "modifications")} en attente de synchronisation`,
1887
+ syncedAt: (time) => `Synchronisé à ${time}`,
1888
+ idle: "À jour",
1889
+ syncHint: "Touchez pour synchroniser maintenant",
1890
+ offlineHint: "rien à synchroniser hors ligne",
1891
+ withHint: (state, hint) => `${state} — ${hint}`,
1892
+ scoped: (scope, state) => `${scope}\u00a0: ${state}`,
1893
+ offlineShort: "Hors ligne",
1894
+ syncingShort: "Synchronisation…",
1895
+ waitingShort: (count) => `${n(count)} en attente`,
1896
+ refusedShort: "Non synchronisé",
1897
+ offlineUnsaved: "Hors ligne — les modifications ne peuvent pas être enregistrées avant la reconnexion",
1898
+ saving: "Enregistrement…",
1899
+ },
1900
+ dev: {
1901
+ roleHeading: "Dev · rôle",
1902
+ switchPlan: "Changer de formule",
1903
+ plan: (value) => `Formule\u00a0: ${value}`,
1904
+ planHeading: "Dev · formule",
1905
+ backTo: (role) => `Revenir à ${role}`,
1906
+ billingOff: "La facturation est désactivée en local\u00a0: les formules ne changent rien",
1907
+ },
1908
+ },
1823
1909
  };
1824
1910
  }
1825
1911
 
@@ -1684,6 +1684,11 @@ export function uiKitLabelsHu(numberLocale = "hu-HU"): UiKitLabels {
1684
1684
  "A fizetése feldolgozás alatt áll. A csomagja a megerősítés után azonnal elindul; ez az oldal magától frissül.",
1685
1685
  choosePlan: "Csomag választása",
1686
1686
  updatePayment: "Fizetési mód frissítése",
1687
+ // 0.42 (§16.7 A): for an admin who isn't the buyer.
1688
+ paymentFailedAskBuyer: (buyer) =>
1689
+ buyer
1690
+ ? `A fizetés sikertelen volt. ${buyer} tudja frissíteni a fizetési módot.`
1691
+ : "A fizetés sikertelen volt. Az előfizetést megvásárló adminisztrátor tudja frissíteni a fizetési módot.",
1687
1692
  checkAgain: "Újraellenőrzés",
1688
1693
  lockReason: "A csomagja lejárt. Ha ismét módosítani szeretne, válasszon csomagot.",
1689
1694
  // As `characterCount.limitReached` ("Elérte a karakterkorlátot").
@@ -1716,6 +1721,19 @@ export function uiKitLabelsHu(numberLocale = "hu-HU"): UiKitLabels {
1716
1721
  switchCredited: "A következő terhelésekből levonva",
1717
1722
  switchNextCharge: (date) => `Következő terhelés: ${date}`,
1718
1723
  switchConfirm: "Csomag módosítása",
1724
+ // 0.42 (§16): the portal for the buyer only, the in-app cancel, the grant warning.
1725
+ buyerHolds: (buyer) =>
1726
+ buyer
1727
+ ? `A fizetési módot és a számlákat ${buyer} kezeli, aki az előfizetést megvásárolta.`
1728
+ : "A fizetési módot és a számlákat az előfizetést megvásárló adminisztrátor kezeli.",
1729
+ cancelConfirmTitle: "Előfizetés lemondása",
1730
+ cancelConfirmBody: (date) => `Az előfizetése ekkor ér véget: ${date}. Addig minden a megszokott módon működik.`,
1731
+ cancelConfirmAction: "Lemondás most",
1732
+ keepSubscription: "Előfizetés megtartása",
1733
+ grantWarningTitle: "Az ingyenes hozzáférése továbbra is él",
1734
+ grantWarningBody:
1735
+ "Az ingyenes hozzáférésének nincs lejárati dátuma. Amíg tart, a vásárlás nem változtatja meg a csomagját: olyan csomagért fizetne, amely nem érvényes.",
1736
+ grantWarningAction: "Mégis megvásárolom",
1719
1737
  // No plural after a numeral (convention 2).
1720
1738
  waitingChanges: (count) => `${n(count)} módosítás csomagra vár`,
1721
1739
  // "Elvetés", as `wizard.cancelConfirmLabel`.
@@ -1787,6 +1805,72 @@ export function uiKitLabelsHu(numberLocale = "hu-HU"): UiKitLabels {
1787
1805
  more: "Továbbiak",
1788
1806
  moreTitle: "További oldalak",
1789
1807
  },
1808
+ // 0.42.0 — docs/admin-harmonization.md §3.1: the admin area's shared words. "Ön", as
1809
+ // the rest of the catalogue.
1810
+ adminArea: {
1811
+ title: "Adminisztráció",
1812
+ waiting: (count) => `${n(count)} várakozik`,
1813
+ forbiddenTitle: "Csak adminisztrátoroknak",
1814
+ forbiddenBody: (appName) =>
1815
+ `Itt kezelik az adminisztrátorok a(z) ${appName} alkalmazást. Az Ön fiókja nem nyithatja meg ezt az oldalt.`,
1816
+ forbiddenHome: "Ugrás a kezdőlapra",
1817
+ forbiddenReviewer: "Fordítások ellenőrzése",
1818
+ sections: {
1819
+ overview: { title: "Áttekintés", help: "Ami most várakozik, egy pillantásra." },
1820
+ users: { title: "Felhasználók", help: "Kinek van fiókja, és ki mit tehet." },
1821
+ invitations: { title: "Meghívások", help: "A linkek, amelyekkel új személy csatlakozhat." },
1822
+ billing: { title: "Számlázás", help: "A csomag, a fizetés és a számlák." },
1823
+ activity: { title: "Tevékenység", help: "Mit tettek az adminisztrátorok, a legújabb elöl." },
1824
+ },
1825
+ tiles: {
1826
+ feedbackWaiting: "Osztályozásra vár",
1827
+ deletionRequests: "Törlési kérelmek",
1828
+ invitationsPending: "Függő meghívások",
1829
+ users: "Felhasználók",
1830
+ usersNew: (count) => `${n(count)} új az elmúlt 7 napban`,
1831
+ },
1832
+ tools: "Eszközök",
1833
+ },
1834
+ // 0.42.0 — docs/top-bar-harmonization.md §3.1: the top bar's shared parts; "csomag" as
1835
+ // `billing`, the formal register as the rest of the catalogue.
1836
+ topBarParts: {
1837
+ tours: {
1838
+ menu: "Bemutatók",
1839
+ newDot: "Új bemutatók",
1840
+ thisPage: "Ezen az oldalon",
1841
+ newTours: "Új bemutatók",
1842
+ allTours: "Összes bemutató…",
1843
+ badgeNew: "Új",
1844
+ completed: "Elvégezve",
1845
+ },
1846
+ sync: {
1847
+ blocked: (count) => `${n(count)} módosítás nem küldhető el erről az eszközről`,
1848
+ offline: "Offline – a módosítások ezen az eszközön maradnak, és az újracsatlakozáskor szinkronizálódnak",
1849
+ refused: "A szerver elutasította a legutóbbi szinkronizálást",
1850
+ syncing: "Szinkronizálás…",
1851
+ pending: (count) => `${n(count)} módosítás szinkronizálásra vár`,
1852
+ syncedAt: (time) => `Szinkronizálva: ${time}`,
1853
+ idle: "Naprakész",
1854
+ syncHint: "Koppintson a szinkronizáláshoz",
1855
+ offlineHint: "offline nincs mit szinkronizálni",
1856
+ withHint: (state, hint) => `${state} – ${hint}`,
1857
+ scoped: (scope, state) => `${scope}: ${state}`,
1858
+ offlineShort: "Offline",
1859
+ syncingShort: "Szinkronizálás…",
1860
+ waitingShort: (count) => `${n(count)} várakozik`,
1861
+ refusedShort: "Nincs szinkronizálva",
1862
+ offlineUnsaved: "Offline – a módosítások az újracsatlakozásig nem menthetők",
1863
+ saving: "Mentés…",
1864
+ },
1865
+ dev: {
1866
+ roleHeading: "Dev · szerepkör",
1867
+ switchPlan: "Csomag váltása",
1868
+ plan: (value) => `Csomag: ${value}`,
1869
+ planHeading: "Dev · csomag",
1870
+ backTo: (role) => `Vissza: ${role}`,
1871
+ billingOff: "A számlázás helyben ki van kapcsolva: a csomagok semmin nem változtatnak",
1872
+ },
1873
+ },
1790
1874
  };
1791
1875
  }
1792
1876
 
@@ -1699,6 +1699,11 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
1699
1699
  "Il Suo pagamento è in elaborazione. Il Suo piano inizia non appena viene confermato; questa pagina si aggiorna da sola.",
1700
1700
  choosePlan: "Scegli un piano",
1701
1701
  updatePayment: "Aggiorna il metodo di pagamento",
1702
+ // 0.42 (§16.7 A): for an admin who isn't the buyer.
1703
+ paymentFailedAskBuyer: (buyer) =>
1704
+ buyer
1705
+ ? `Il pagamento non è andato a buon fine. ${buyer} può aggiornare il metodo di pagamento.`
1706
+ : "Il pagamento non è andato a buon fine. L’amministratore che ha sottoscritto l’abbonamento può aggiornare il metodo di pagamento.",
1702
1707
  checkAgain: "Verifica di nuovo",
1703
1708
  lockReason: "Il Suo piano è terminato. Scelga un piano per apportare di nuovo modifiche.",
1704
1709
  // As `characterCount.limitReached` ("Limite di caratteri raggiunto").
@@ -1729,6 +1734,20 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
1729
1734
  switchCredited: "Accreditato sui prossimi addebiti",
1730
1735
  switchNextCharge: (date) => `Prossimo addebito il ${date}`,
1731
1736
  switchConfirm: "Cambia piano",
1737
+ // 0.42 (§16): the portal for the buyer only, the in-app cancel, the grant warning.
1738
+ buyerHolds: (buyer) =>
1739
+ buyer
1740
+ ? `Il metodo di pagamento e le fatture sono gestiti da ${buyer}, che ha sottoscritto l’abbonamento.`
1741
+ : "Il metodo di pagamento e le fatture sono gestiti dall’amministratore che ha sottoscritto l’abbonamento.",
1742
+ cancelConfirmTitle: "Disdici l’abbonamento",
1743
+ cancelConfirmBody: (date) =>
1744
+ `Il Suo abbonamento termina il ${date}. Fino ad allora tutto funziona come prima.`,
1745
+ cancelConfirmAction: "Disdici ora",
1746
+ keepSubscription: "Mantieni l’abbonamento",
1747
+ grantWarningTitle: "Il Suo accesso gratuito continua",
1748
+ grantWarningBody:
1749
+ "Il Suo accesso gratuito non ha una data di fine. Finché dura, un acquisto non cambia il Suo piano: pagherebbe per un piano che non si applica.",
1750
+ grantWarningAction: "Acquista comunque",
1732
1751
  waitingChanges: (count) =>
1733
1752
  `${n(count)} ${plural(count, "modifica in attesa", "modifiche in attesa")} di un piano`,
1734
1753
  // "Scarta", as `wizard.cancelConfirmLabel`.
@@ -1799,6 +1818,74 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
1799
1818
  more: "Altro",
1800
1819
  moreTitle: "Altre pagine",
1801
1820
  },
1821
+ // 0.42.0 — docs/admin-harmonization.md §3.1: the admin area's shared words. "Lei", as
1822
+ // the rest of the catalogue.
1823
+ adminArea: {
1824
+ title: "Amministrazione",
1825
+ waiting: (count) => `${n(count)} in attesa`,
1826
+ forbiddenTitle: "Solo per gli amministratori",
1827
+ forbiddenBody: (appName) =>
1828
+ `Qui gli amministratori gestiscono ${appName}. Il Suo account non può aprire questa pagina.`,
1829
+ forbiddenHome: "Vai alla pagina iniziale",
1830
+ forbiddenReviewer: "Rivedi le traduzioni",
1831
+ sections: {
1832
+ overview: { title: "Panoramica", help: "Ciò che è in attesa, a colpo d’occhio." },
1833
+ users: { title: "Utenti", help: "Chi ha un account e cosa può fare ciascuno." },
1834
+ invitations: { title: "Inviti", help: "I link con cui entra una persona nuova." },
1835
+ billing: { title: "Fatturazione", help: "Il piano, il pagamento e le fatture." },
1836
+ activity: { title: "Attività", help: "Ciò che hanno fatto gli amministratori, dal più recente." },
1837
+ },
1838
+ tiles: {
1839
+ feedbackWaiting: "Da smistare",
1840
+ deletionRequests: "Richieste di eliminazione",
1841
+ invitationsPending: "Inviti in sospeso",
1842
+ users: "Utenti",
1843
+ usersNew: (count) => `${n(count)} ${plural(count, "nuovo", "nuovi")} in 7 giorni`,
1844
+ },
1845
+ tools: "Strumenti",
1846
+ },
1847
+ // 0.42.0 — docs/top-bar-harmonization.md §3.1: the top bar's shared parts, keksdose's
1848
+ // reviewed sync words where they are not about its budgets; "piano" as `billing`.
1849
+ topBarParts: {
1850
+ tours: {
1851
+ menu: "Tour guidati",
1852
+ newDot: "Nuovi tour",
1853
+ thisPage: "In questa pagina",
1854
+ newTours: "Nuovi tour",
1855
+ allTours: "Tutti i tour…",
1856
+ badgeNew: "Nuovo",
1857
+ completed: "Completato",
1858
+ },
1859
+ sync: {
1860
+ blocked: (count) =>
1861
+ `${n(count)} ${plural(count, "modifica non può essere inviata", "modifiche non possono essere inviate")} da questo dispositivo`,
1862
+ offline: "Offline: le modifiche vengono salvate su questo dispositivo e sincronizzate alla riconnessione",
1863
+ refused: "Il server ha rifiutato l’ultima sincronizzazione",
1864
+ syncing: "Sincronizzazione…",
1865
+ pending: (count) =>
1866
+ `${n(count)} ${plural(count, "modifica", "modifiche")} in attesa di sincronizzazione`,
1867
+ syncedAt: (time) => `Sincronizzato alle ${time}`,
1868
+ idle: "Aggiornato",
1869
+ syncHint: "Tocchi per sincronizzare ora",
1870
+ offlineHint: "offline non c’è nulla da sincronizzare",
1871
+ withHint: (state, hint) => `${state} — ${hint}`,
1872
+ scoped: (scope, state) => `${scope}: ${state}`,
1873
+ offlineShort: "Offline",
1874
+ syncingShort: "Sincronizzazione…",
1875
+ waitingShort: (count) => `${n(count)} in attesa`,
1876
+ refusedShort: "Non sincronizzato",
1877
+ offlineUnsaved: "Offline: le modifiche non possono essere salvate finché non si riconnette",
1878
+ saving: "Salvataggio…",
1879
+ },
1880
+ dev: {
1881
+ roleHeading: "Dev · ruolo",
1882
+ switchPlan: "Cambia piano",
1883
+ plan: (value) => `Piano: ${value}`,
1884
+ planHeading: "Dev · piano",
1885
+ backTo: (role) => `Torna a ${role}`,
1886
+ billingOff: "La fatturazione è disattivata in locale: i piani non cambiano nulla",
1887
+ },
1888
+ },
1802
1889
  };
1803
1890
  }
1804
1891