@eifi1/ui-kit 0.29.0 → 0.30.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 (187) hide show
  1. package/README.md +26 -4
  2. package/dist/account/account-parts.d.ts +21 -0
  3. package/dist/account/account-parts.js +40 -0
  4. package/dist/account/account-parts.js.map +1 -0
  5. package/dist/account/data-export-setting.d.ts +73 -0
  6. package/dist/account/data-export-setting.js +113 -0
  7. package/dist/account/data-export-setting.js.map +1 -0
  8. package/dist/account/delete-account-setting.d.ts +91 -0
  9. package/dist/account/delete-account-setting.js +199 -0
  10. package/dist/account/delete-account-setting.js.map +1 -0
  11. package/dist/account/email-change-setting.d.ts +136 -0
  12. package/dist/account/email-change-setting.js +277 -0
  13. package/dist/account/email-change-setting.js.map +1 -0
  14. package/dist/account/sessions-setting.d.ts +110 -0
  15. package/dist/account/sessions-setting.js +146 -0
  16. package/dist/account/sessions-setting.js.map +1 -0
  17. package/dist/admin/admin-action-confirm.d.ts +91 -0
  18. package/dist/admin/admin-action-confirm.js +276 -0
  19. package/dist/admin/admin-action-confirm.js.map +1 -0
  20. package/dist/admin/admin-action-log.d.ts +105 -0
  21. package/dist/admin/admin-action-log.js +153 -0
  22. package/dist/admin/admin-action-log.js.map +1 -0
  23. package/dist/admin/admin-parts.d.ts +40 -0
  24. package/dist/admin/admin-parts.js +45 -0
  25. package/dist/admin/admin-parts.js.map +1 -0
  26. package/dist/admin/invitations-panel.d.ts +91 -0
  27. package/dist/admin/invitations-panel.js +289 -0
  28. package/dist/admin/invitations-panel.js.map +1 -0
  29. package/dist/admin/reviewer-scope-editor.d.ts +91 -0
  30. package/dist/admin/reviewer-scope-editor.js +134 -0
  31. package/dist/admin/reviewer-scope-editor.js.map +1 -0
  32. package/dist/admin/role-select.d.ts +91 -0
  33. package/dist/admin/role-select.js +128 -0
  34. package/dist/admin/role-select.js.map +1 -0
  35. package/dist/admin/transfer-ownership-dialog.d.ts +91 -0
  36. package/dist/admin/transfer-ownership-dialog.js +83 -0
  37. package/dist/admin/transfer-ownership-dialog.js.map +1 -0
  38. package/dist/admin/user-roster.d.ts +91 -0
  39. package/dist/admin/user-roster.js +285 -0
  40. package/dist/admin/user-roster.js.map +1 -0
  41. package/dist/auth/auth-errors.d.ts +85 -6
  42. package/dist/auth/auth-errors.js +62 -2
  43. package/dist/auth/auth-errors.js.map +1 -1
  44. package/dist/auth/forgot-password-form.d.ts +10 -3
  45. package/dist/auth/forgot-password-form.js +6 -3
  46. package/dist/auth/forgot-password-form.js.map +1 -1
  47. package/dist/auth/register-form.d.ts +17 -12
  48. package/dist/auth/register-form.js +6 -4
  49. package/dist/auth/register-form.js.map +1 -1
  50. package/dist/auth/reset-password-form.d.ts +10 -3
  51. package/dist/auth/reset-password-form.js +6 -3
  52. package/dist/auth/reset-password-form.js.map +1 -1
  53. package/dist/auth/sign-in-form.d.ts +61 -9
  54. package/dist/auth/sign-in-form.js +94 -13
  55. package/dist/auth/sign-in-form.js.map +1 -1
  56. package/dist/auth/verify-email.d.ts +7 -2
  57. package/dist/auth/verify-email.js +44 -8
  58. package/dist/auth/verify-email.js.map +1 -1
  59. package/dist/chart.d.ts +16 -11
  60. package/dist/components/account-chips.d.ts +47 -7
  61. package/dist/components/account-chips.js +19 -3
  62. package/dist/components/account-chips.js.map +1 -1
  63. package/dist/components/account-settings-labels.d.ts +12 -1
  64. package/dist/components/account-settings-labels.js +4 -1
  65. package/dist/components/account-settings-labels.js.map +1 -1
  66. package/dist/components/account-settings.d.ts +61 -6
  67. package/dist/components/account-settings.js +115 -15
  68. package/dist/components/account-settings.js.map +1 -1
  69. package/dist/components/amount-input.d.ts +17 -12
  70. package/dist/components/button-group.d.ts +17 -12
  71. package/dist/components/calculator.d.ts +17 -12
  72. package/dist/components/confirm-dialog.d.ts +17 -12
  73. package/dist/components/copy-button.d.ts +14 -9
  74. package/dist/components/danger-confirm.d.ts +17 -12
  75. package/dist/components/facing-pair.d.ts +17 -12
  76. package/dist/components/file-button.d.ts +17 -12
  77. package/dist/components/file-dropzone.d.ts +17 -12
  78. package/dist/components/form-actions.d.ts +17 -12
  79. package/dist/components/iban-input.d.ts +17 -12
  80. package/dist/components/language-select.d.ts +17 -12
  81. package/dist/components/legal-page.d.ts +17 -12
  82. package/dist/components/legal.d.ts +17 -12
  83. package/dist/components/money-field.d.ts +17 -12
  84. package/dist/components/number-field.d.ts +17 -12
  85. package/dist/components/number-input.d.ts +17 -12
  86. package/dist/components/numpad-sheet.d.ts +17 -12
  87. package/dist/components/phone-input.d.ts +17 -12
  88. package/dist/components/series-chart.d.ts +17 -12
  89. package/dist/components/settings-fields.d.ts +16 -11
  90. package/dist/components/share-card.d.ts +16 -11
  91. package/dist/components/text-link.d.ts +17 -12
  92. package/dist/components/time-input.d.ts +17 -12
  93. package/dist/components/ui.d.ts +13 -8
  94. package/dist/{register-form-V1OeNlMr.d.ts → delete-account-setting-CGVMckMw.d.ts} +6616 -5645
  95. package/dist/feedback/feedback-attachment.d.ts +17 -12
  96. package/dist/feedback/feedback-context.d.ts +17 -12
  97. package/dist/feedback/feedback-crash.d.ts +17 -12
  98. package/dist/feedback/feedback-dialog.d.ts +17 -12
  99. package/dist/feedback/feedback-inbox.d.ts +17 -12
  100. package/dist/feedback/feedback-labels.d.ts +17 -12
  101. package/dist/feedback/feedback-menu.d.ts +17 -12
  102. package/dist/feedback/feedback-record.d.ts +17 -12
  103. package/dist/feedback/feedback-row-detail.d.ts +17 -12
  104. package/dist/feedback/feedback-status-undo.d.ts +17 -12
  105. package/dist/feedback/feedback-submit.d.ts +17 -12
  106. package/dist/feedback/feedback-swipe.d.ts +17 -12
  107. package/dist/feedback/feedback-table.d.ts +14 -9
  108. package/dist/feedback/feedback-thread.d.ts +17 -12
  109. package/dist/feedback.d.ts +17 -12
  110. package/dist/hooks/use-anchored-panel.d.ts +6 -2
  111. package/dist/hooks/use-anchored-panel.js +2 -1
  112. package/dist/hooks/use-anchored-panel.js.map +1 -1
  113. package/dist/hooks/use-file-drop.d.ts +17 -12
  114. package/dist/i18n/defaults.d.ts +17 -12
  115. package/dist/i18n/defaults.js +22 -0
  116. package/dist/i18n/defaults.js.map +1 -1
  117. package/dist/i18n/german.d.ts +17 -12
  118. package/dist/i18n/german.js +215 -11
  119. package/dist/i18n/german.js.map +1 -1
  120. package/dist/i18n/kit-labels.d.ts +10 -5
  121. package/dist/i18n/kit-labels.js.map +1 -1
  122. package/dist/i18n/languages.d.ts +11 -6
  123. package/dist/i18n/locales/de-CH.d.ts +17 -12
  124. package/dist/i18n/locales/en.d.ts +17 -12
  125. package/dist/i18n/locales/es.d.ts +17 -12
  126. package/dist/i18n/locales/es.js +207 -9
  127. package/dist/i18n/locales/es.js.map +1 -1
  128. package/dist/i18n/locales/fr.d.ts +17 -12
  129. package/dist/i18n/locales/fr.js +209 -6
  130. package/dist/i18n/locales/fr.js.map +1 -1
  131. package/dist/i18n/locales/hu.d.ts +17 -12
  132. package/dist/i18n/locales/hu.js +207 -11
  133. package/dist/i18n/locales/hu.js.map +1 -1
  134. package/dist/i18n/locales/it.d.ts +17 -12
  135. package/dist/i18n/locales/it.js +209 -6
  136. package/dist/i18n/locales/it.js.map +1 -1
  137. package/dist/i18n/locales/zh.d.ts +17 -12
  138. package/dist/i18n/locales/zh.js +200 -6
  139. package/dist/i18n/locales/zh.js.map +1 -1
  140. package/dist/i18n/review.d.ts +17 -12
  141. package/dist/i18n/review.js +37 -1
  142. package/dist/i18n/review.js.map +1 -1
  143. package/dist/index.d.ts +8 -3
  144. package/dist/index.js +53 -0
  145. package/dist/index.js.map +1 -1
  146. package/dist/rhf/fields.d.ts +17 -12
  147. package/dist/rhf/form.d.ts +17 -12
  148. package/dist/rhf.d.ts +17 -12
  149. package/dist/shell/app-shell.d.ts +17 -12
  150. package/dist/shell/top-bar-brand.d.ts +17 -12
  151. package/dist/shell.d.ts +11 -6
  152. package/dist/wizard/stepper-nav.d.ts +17 -12
  153. package/dist/wizard.d.ts +17 -12
  154. package/package.json +1 -1
  155. package/src/account/account-parts.ts +67 -0
  156. package/src/account/data-export-setting.tsx +218 -0
  157. package/src/account/delete-account-setting.tsx +362 -0
  158. package/src/account/email-change-setting.tsx +457 -0
  159. package/src/account/sessions-setting.tsx +283 -0
  160. package/src/admin/admin-action-confirm.tsx +495 -0
  161. package/src/admin/admin-action-log.tsx +297 -0
  162. package/src/admin/admin-parts.ts +82 -0
  163. package/src/admin/invitations-panel.tsx +516 -0
  164. package/src/admin/reviewer-scope-editor.tsx +234 -0
  165. package/src/admin/role-select.tsx +286 -0
  166. package/src/admin/transfer-ownership-dialog.tsx +172 -0
  167. package/src/admin/user-roster.tsx +573 -0
  168. package/src/auth/auth-errors.ts +165 -8
  169. package/src/auth/forgot-password-form.tsx +21 -5
  170. package/src/auth/register-form.tsx +24 -6
  171. package/src/auth/reset-password-form.tsx +19 -5
  172. package/src/auth/sign-in-form.tsx +207 -35
  173. package/src/auth/verify-email.tsx +59 -8
  174. package/src/components/account-chips.tsx +64 -7
  175. package/src/components/account-settings-labels.ts +15 -1
  176. package/src/components/account-settings.tsx +199 -23
  177. package/src/hooks/use-anchored-panel.ts +14 -3
  178. package/src/i18n/defaults.ts +22 -0
  179. package/src/i18n/german.ts +241 -5
  180. package/src/i18n/kit-labels.tsx +33 -0
  181. package/src/i18n/locales/es.ts +230 -3
  182. package/src/i18n/locales/fr.ts +232 -0
  183. package/src/i18n/locales/hu.ts +224 -5
  184. package/src/i18n/locales/it.ts +230 -0
  185. package/src/i18n/locales/zh.ts +205 -0
  186. package/src/i18n/review.ts +36 -0
  187. package/src/index.ts +93 -0
@@ -17,6 +17,15 @@ import type { UiKitLabels } from "./kit-labels";
17
17
  export function germanLabels(numberLocale: string): UiKitLabels {
18
18
  const num = new Intl.NumberFormat(numberLocale);
19
19
  const n = (value: number) => num.format(value);
20
+ // 0.30.0 — a throttled request (HTTP 429), as `englishRateLimited` in
21
+ // src/auth/auth-errors.ts: no wait → "einen Moment", under a minute → seconds, else
22
+ // minutes rounded up. kastlan's reviewed "auth.throttled" is the sentence without one.
23
+ const wait = (seconds: number) =>
24
+ seconds < 60 ? `${n(Math.ceil(seconds))} s` : `${n(Math.ceil(seconds / 60))} min`;
25
+ const rateLimited = (seconds?: number) =>
26
+ !seconds || seconds <= 0
27
+ ? "Zu viele Versuche. Bitte warten Sie einen Moment und versuchen Sie es dann noch einmal."
28
+ : `Zu viele Versuche. Versuchen Sie es in ${wait(seconds)} erneut.`;
20
29
 
21
30
  return {
22
31
  feedbackAttachment: {
@@ -162,6 +171,9 @@ export function germanLabels(numberLocale: string): UiKitLabels {
162
171
  memberSince: "Mitglied seit",
163
172
  displayName: "Anzeigename",
164
173
  save: "Speichern",
174
+ firstName: "Vorname",
175
+ lastName: "Nachname",
176
+ nameRequired: "Geben Sie Vor- und Nachnamen ein.",
165
177
  },
166
178
  password: {
167
179
  title: "Passwort ändern",
@@ -718,6 +730,8 @@ export function germanLabels(numberLocale: string): UiKitLabels {
718
730
  registered: "Registriert",
719
731
  unverified: "Nicht bestätigt",
720
732
  passwordChange: "Passwortänderung erforderlich",
733
+ deletion: "Löschung beantragt",
734
+ deletionOn: (date) => `Löschung am ${date}`,
721
735
  },
722
736
  shareCard: {
723
737
  dialogTitle: "Teilen",
@@ -883,6 +897,17 @@ export function germanLabels(numberLocale: string): UiKitLabels {
883
897
  setPasswordFailed: "Das Passwort konnte nicht vergeben werden.",
884
898
  expired: "Diese Anmeldung ist abgelaufen. Bitte melden Sie sich erneut an.",
885
899
  backToSignIn: "Zurück zur Anmeldung",
900
+ // kastlan's backup-code words ("Backup-Code" — not keksdose's
901
+ // "Wiederherstellungscode", which is the key of its end-to-end encryption).
902
+ useRecoveryCode: "Backup-Code verwenden",
903
+ useAuthenticatorCode: "Authenticator-App verwenden",
904
+ recoveryCode: "Backup-Code",
905
+ recoveryIntro:
906
+ "Geben Sie einen der Backup-Codes ein, die Sie beim Einrichten der Zwei-Faktor-Authentifizierung gespeichert haben.",
907
+ recoveryCodeHint: (length) =>
908
+ `${n(length)} Buchstaben und Ziffern. Bindestriche und Leerzeichen spielen keine Rolle.`,
909
+ recoveryCodeInvalid: "Dieser Backup-Code ist ungültig oder wurde schon verwendet.",
910
+ rateLimited,
886
911
  },
887
912
  register: {
888
913
  firstName: "Vorname",
@@ -906,6 +931,7 @@ export function germanLabels(numberLocale: string): UiKitLabels {
906
931
  invitationInvalid: "Dieser Einladungslink ist ungültig.",
907
932
  invitationExpired: "Diese Einladung ist abgelaufen. Bitten Sie um eine neue.",
908
933
  failed: "Registrierung fehlgeschlagen. Bitte versuchen Sie es erneut.",
934
+ rateLimited,
909
935
  },
910
936
  completeName: {
911
937
  title: "Namen vervollständigen",
@@ -927,6 +953,7 @@ export function germanLabels(numberLocale: string): UiKitLabels {
927
953
  sentHint: "Der Link gilt eine Stunde und funktioniert genau einmal. Sehen Sie auch im Spam-Ordner nach.",
928
954
  backToSignIn: "Zurück zur Anmeldung",
929
955
  error: "Anfrage fehlgeschlagen. Bitte versuchen Sie es später noch einmal.",
956
+ rateLimited,
930
957
  },
931
958
  resetPassword: {
932
959
  title: "Neues Passwort vergeben",
@@ -944,6 +971,7 @@ export function germanLabels(numberLocale: string): UiKitLabels {
944
971
  success: "Ihr Passwort ist geändert. Sie können sich jetzt damit anmelden.",
945
972
  sessionsEnded: "Angemeldete Geräte wurden abgemeldet – dort müssen Sie sich neu anmelden.",
946
973
  signIn: "Zur Anmeldung",
974
+ rateLimited,
947
975
  },
948
976
  verifyEmail: {
949
977
  title: "E-Mail-Adresse bestätigen",
@@ -987,12 +1015,220 @@ export function germanLabels(numberLocale: string): UiKitLabels {
987
1015
  register: "Registrieren",
988
1016
  },
989
1017
  companySwitcher: {
990
- // "Firma", as kastlan's sign-up asks for the "Firmenname".
991
- switchCompany: "Firma wechseln",
992
- heading: "Firmen",
993
- current: (name) => `Firma: ${name}`,
1018
+ // "Unternehmen" (0.30), the word kastlan's admin strings use ("Aus dem Unternehmen
1019
+ // entfernen"), so one German word names a company across the kit.
1020
+ switchCompany: "Unternehmen wechseln",
1021
+ heading: "Unternehmen",
1022
+ current: (name) => `Unternehmen: ${name}`,
994
1023
  currentMark: "(aktuell)",
995
- switching: "Firma wird gewechselt…",
1024
+ switching: "Unternehmen wird gewechselt…",
1025
+ },
1026
+ // 0.30.0 — docs/user-admin-harmonization.md: keksdose's reviewed de-CH for the admin
1027
+ // words (admin.users.*), Kurvenschmiede's for transfer, invitations and sessions,
1028
+ // kastlan's for "Unternehmen", the throttle and "Überall abmelden"; written fresh where
1029
+ // no app had the sentence. Formal "Sie". "Administratorrechte" rather than "der letzte
1030
+ // Administrator", which would give the reader a gender.
1031
+ emailChange: {
1032
+ title: "E-Mail-Adresse",
1033
+ current: "Aktuelle Adresse",
1034
+ newEmail: "Neue E-Mail-Adresse",
1035
+ password: "Aktuelles Passwort",
1036
+ passwordHint: "Mit Ihrer Adresse melden Sie sich an – deshalb braucht eine Änderung Ihr Passwort.",
1037
+ emailTagUse: (address) => `${address} verwenden`,
1038
+ emailTagHint:
1039
+ "Viele Anbieter stellen name+kennung@… an dasselbe Postfach zu, damit Post von dieser App filter- und zuordenbar wird. Prüfen Sie vorher, ob Ihrer das tut: Angemeldet wird dann mit der markierten Adresse.",
1040
+ submit: "E-Mail-Adresse ändern",
1041
+ sameAsCurrent: "Das ist bereits Ihre Adresse.",
1042
+ emailTaken: "Ein Konto mit dieser E-Mail-Adresse existiert bereits.",
1043
+ wrongPassword: "Das Passwort ist falsch.",
1044
+ pending: (newEmail) => `Bestätigen Sie den Link, den wir an ${newEmail} geschickt haben.`,
1045
+ pendingHint: (currentEmail) =>
1046
+ `Bis dahin melden Sie sich weiterhin mit ${currentEmail} an. Sehen Sie auch im Spam-Ordner nach.`,
1047
+ resend: "Link erneut senden",
1048
+ resent: "Wir haben den Link erneut gesendet.",
1049
+ cancel: "Änderung abbrechen",
1050
+ confirmed: (email) => `Ihre E-Mail-Adresse ist jetzt ${email}.`,
1051
+ passkeyNote:
1052
+ "Ihre Passkeys funktionieren weiterhin. Ihr Gerät zeigt sie eventuell noch unter der alten Adresse an.",
1053
+ rateLimited,
1054
+ failed: "Das hat nicht geklappt. Bitte erneut versuchen.",
1055
+ },
1056
+ sessions: {
1057
+ title: "Sitzungen",
1058
+ description:
1059
+ "Auf einem Gerät angemeldet, das Sie nicht mehr nutzen oder dem Sie nicht trauen? Melden Sie sich überall ab.",
1060
+ signOutEverywhere: "Überall abmelden…",
1061
+ signOutEverywherePrompt:
1062
+ "Damit enden alle Sitzungen, auch diese: Sie werden auch auf diesem Gerät abgemeldet und melden sich hier neu an.",
1063
+ confirmSignOutEverywhere: "Überall abmelden",
1064
+ list: "Wo Sie angemeldet sind",
1065
+ loading: "Sitzungen werden geladen…",
1066
+ empty: "Keine Sitzungen vorhanden.",
1067
+ current: "Dieses Gerät",
1068
+ unknownDevice: "Unbekanntes Gerät",
1069
+ // A colon: `when` is either "vor 3 Stunden" or a date.
1070
+ lastActive: (when) => `Zuletzt aktiv: ${when}`,
1071
+ ip: (address) => `IP ${address}`,
1072
+ revoke: "Abmelden",
1073
+ // Starts with `revoke`, the button's visible text, for voice control.
1074
+ revokeItem: (device) => `Abmelden: ${device}`,
1075
+ failed: "Das hat nicht geklappt. Bitte erneut versuchen.",
1076
+ },
1077
+ deleteAccount: {
1078
+ title: "Konto löschen",
1079
+ afterDays: (days) =>
1080
+ days === 1
1081
+ ? "Ihr Konto wird sofort deaktiviert und 1 Tag später endgültig gelöscht."
1082
+ : `Ihr Konto wird sofort deaktiviert und ${n(days)} Tage später endgültig gelöscht.`,
1083
+ operator: "Ihr Konto wird sofort deaktiviert und anschließend vom Betreiber endgültig gelöscht.",
1084
+ arm: "Konto löschen…",
1085
+ prompt: "Sie werden auf allen Geräten abgemeldet, und Ihr Konto kann nicht mehr verwendet werden.",
1086
+ handOver: (count) =>
1087
+ count === 1
1088
+ ? "1 Element, das andere sehen können, geht an einen Administrator über."
1089
+ : `${n(count)} Elemente, die andere sehen können, gehen an einen Administrator über.`,
1090
+ confirm: "Mein Konto löschen",
1091
+ done: "Ihr Konto ist deaktiviert. Sie werden abgemeldet.",
1092
+ wrongPassword: "Das Passwort ist falsch.",
1093
+ confirmationMismatch: "Das ist nicht die Adresse Ihres Kontos.",
1094
+ lastAdmin:
1095
+ "Ihr Konto ist das letzte mit Administratorrechten. Geben Sie zuerst einem anderen Konto Administratorrechte.",
1096
+ lastAdminOf: (companies) =>
1097
+ `Ihr Konto ist das letzte mit Administratorrechten bei ${companies}. Geben Sie dort zuerst einem anderen Konto Administratorrechte.`,
1098
+ // keksdose's "Haushalt".
1099
+ householdHasMembers:
1100
+ "Ihr Haushalt hat weitere Mitglieder, deshalb kann das Konto hier nicht gelöscht werden. Bitte schreiben Sie dem Betreiber.",
1101
+ rateLimited,
1102
+ failed: "Ihr Konto konnte nicht gelöscht werden. Bitte versuchen Sie es erneut.",
1103
+ },
1104
+ dataExport: {
1105
+ title: "Ihre Daten exportieren",
1106
+ description: "Laden Sie eine Kopie der Daten Ihres Kontos als JSON-Datei herunter.",
1107
+ download: "Meine Daten herunterladen",
1108
+ started: "Ihr Download hat begonnen.",
1109
+ saveAgain: "Nicht gestartet? Datei speichern",
1110
+ rateLimited: (seconds) =>
1111
+ seconds && seconds > 0
1112
+ ? `Sie haben Ihre Daten gerade erst exportiert. Versuchen Sie es in ${wait(seconds)} erneut.`
1113
+ : "Sie haben Ihre Daten gerade erst exportiert. Bitte versuchen Sie es in einer Minute erneut.",
1114
+ failed: "Der Export ist fehlgeschlagen. Bitte versuchen Sie es erneut.",
1115
+ },
1116
+ userRoster: {
1117
+ name: "Name",
1118
+ email: "E-Mail",
1119
+ role: "Rolle",
1120
+ state: "Status",
1121
+ created: "Erstellt",
1122
+ lastLogin: "Letzte Anmeldung",
1123
+ never: "Nie",
1124
+ actions: "Aktionen",
1125
+ actionsFor: (name) => `Aktionen für ${name}`,
1126
+ },
1127
+ roleSelect: {
1128
+ label: "Rolle",
1129
+ rolesLegend: "Rollen",
1130
+ roleOf: (name) => `Rolle von ${name}`,
1131
+ lockedLastAdmin: "Das letzte aktive Konto mit Administratorrechten behält diese Rolle.",
1132
+ lockedSelf: "Ihre eigene Rolle können Sie nicht ändern.",
1133
+ notForLastAdmin: "nicht für das letzte Administratorkonto",
1134
+ notForSelf: "nicht für Ihr eigenes Konto",
1135
+ unavailable: (role, reason) => `${role} (${reason})`,
1136
+ },
1137
+ reviewerScope: {
1138
+ languages: "Sprachen",
1139
+ hint: "Kreuzen Sie die Sprachen an, die diese Person prüft.",
1140
+ none: "Keine Sprache: Beim Speichern wird die Prüfrolle entzogen.",
1141
+ areas: "Beschränken auf",
1142
+ legalOnly: "Nur die rechtlichen Seiten",
1143
+ legalOnlyHint:
1144
+ "Impressum, Datenschutzerklärung und Nutzungsbedingungen – für eine Juristin oder einen Juristen statt für Muttersprachler.",
1145
+ failed: "Die Prüfrolle konnte nicht gespeichert werden. Bitte versuchen Sie es erneut.",
1146
+ },
1147
+ adminAction: {
1148
+ confirm: "Bestätigen",
1149
+ cancel: "Abbrechen",
1150
+ close: "Schließen",
1151
+ lastAdmin:
1152
+ "Dies ist das letzte aktive Konto mit Administratorrechten. Geben Sie zuerst einem anderen Konto Administratorrechte.",
1153
+ self: "Mit Ihrem eigenen Konto ist das nicht möglich.",
1154
+ confirmationMismatch:
1155
+ "Die Adresse passt nicht zu diesem Konto. Prüfen Sie, bei welchem Konto Sie sind.",
1156
+ otherCompanies:
1157
+ "Dieses Konto gehört auch zu anderen Unternehmen, deshalb kann nur der Plattformbetreiber das tun. Sie können es stattdessen aus diesem Unternehmen entfernen.",
1158
+ removeFromCompany: "Aus dem Unternehmen entfernen",
1159
+ failed: "Das hat nicht geklappt. Bitte erneut versuchen.",
1160
+ },
1161
+ adminActionLog: {
1162
+ title: "Admin-Aktionen",
1163
+ empty: "Noch keine Admin-Aktionen.",
1164
+ loading: "Wird geladen…",
1165
+ // "durch", not "von": it takes the accusative, so `erased` ("ein gelöschtes Konto")
1166
+ // reads right both on its own and after it.
1167
+ by: (actor) => `durch ${actor}`,
1168
+ bySelf: "durch die Person selbst",
1169
+ automatic: "automatisch",
1170
+ erased: "ein gelöschtes Konto",
1171
+ filteredTo: (target) => `Nur ${target}`,
1172
+ showAll: "Alle Aktionen zeigen",
1173
+ filterBy: (target) => `Nur Aktionen zu ${target} zeigen`,
1174
+ actions: {
1175
+ deactivate: "Deaktiviert",
1176
+ reactivate: "Reaktiviert",
1177
+ role: "Rolle geändert",
1178
+ membership_remove: "Aus dem Unternehmen entfernt",
1179
+ password_change_require: "Neues Passwort verlangt",
1180
+ password_change_withdraw: "Passwortforderung zurückgenommen",
1181
+ mail_verification: "Bestätigungsmail gesendet",
1182
+ mail_reset: "Mail zum Zurücksetzen des Passworts gesendet",
1183
+ reviewer: "Prüfrolle geändert",
1184
+ invite: "Eingeladen",
1185
+ invite_resend: "Einladung erneut gesendet",
1186
+ invite_revoke: "Einladung zurückgezogen",
1187
+ transfer: "Arbeit übergeben",
1188
+ deletion_request: "Löschung beantragt",
1189
+ deletion_cancel: "Löschung aufgehoben",
1190
+ erase: "Konto endgültig gelöscht",
1191
+ },
1192
+ },
1193
+ transferOwnership: {
1194
+ title: (name) => `Arbeit von ${name} übergeben`,
1195
+ body: "Alles, was diesem Konto gehört, geht in einem Schritt an das gewählte Konto.",
1196
+ recipient: "Übergeben an",
1197
+ choose: "Konto wählen…",
1198
+ chooseFirst: "Wählen Sie, wer die Arbeit erhält",
1199
+ confirm: "Übergeben",
1200
+ customer: "Kundenkonto",
1201
+ deactivated: "deaktiviert",
1202
+ self: "dasselbe Konto",
1203
+ unavailable: (account, reason) => `${account} (${reason})`,
1204
+ noCandidates: "Kein anderes Konto kann sie erhalten.",
1205
+ },
1206
+ invitations: {
1207
+ email: "E-Mail-Adresse",
1208
+ invalidEmail: "Bitte eine vollständige E-Mail-Adresse eingeben.",
1209
+ role: "Rolle",
1210
+ scope: "Bereich",
1211
+ scopeNone: "Keiner",
1212
+ language: "Sprache der Einladung",
1213
+ note: "Notiz",
1214
+ invite: "Einladen",
1215
+ listTitle: "Einladungen",
1216
+ empty: "Noch niemand ist eingeladen.",
1217
+ loading: "Wird geladen…",
1218
+ status: { open: "Offen", accepted: "Angenommen", expired: "Abgelaufen", revoked: "Zurückgezogen" },
1219
+ sent: (date) => `Gesendet am ${date}`,
1220
+ // kastlan's "Gültig bis".
1221
+ expires: (date) => `Gültig bis ${date}`,
1222
+ invitedBy: (name) => `von ${name}`,
1223
+ resend: (email) => `${email} einen neuen Link senden`,
1224
+ copyLink: "Einladungslink kopieren",
1225
+ revoke: (email) => `Einladung an ${email} zurückziehen`,
1226
+ consoleHint:
1227
+ "Dieser Server verschickt keine Mails – sie werden ins Server-Log geschrieben. Kopieren Sie jeden Einladungslink hier und geben Sie ihn selbst weiter: Er wird nur einmal angezeigt.",
1228
+ linkReady: (email) => `Der Einladungslink für ${email}, nur dieses eine Mal angezeigt:`,
1229
+ notSent: (email) =>
1230
+ `${email} ist eingeladen, aber die Mail konnte nicht gesendet werden. Senden Sie sie erneut.`,
1231
+ failed: "Das hat nicht geklappt. Bitte erneut versuchen.",
996
1232
  },
997
1233
  characterCount: {
998
1234
  // "Zeichen" is the same in singular and plural.
@@ -66,6 +66,17 @@ import type { VerifyEmailLabels } from "../auth/verify-email";
66
66
  import type { NotFoundLabels } from "../auth/not-found-page";
67
67
  import type { AcceptInvitationLabels } from "../auth/accept-invitation";
68
68
  import type { CompanySwitcherLabels } from "../shell/company-switcher";
69
+ import type { EmailChangeLabels } from "../account/email-change-setting";
70
+ import type { SessionsLabels } from "../account/sessions-setting";
71
+ import type { DeleteAccountLabels } from "../account/delete-account-setting";
72
+ import type { DataExportLabels } from "../account/data-export-setting";
73
+ import type { UserRosterLabels } from "../admin/user-roster";
74
+ import type { RoleSelectLabels } from "../admin/role-select";
75
+ import type { ReviewerScopeLabels } from "../admin/reviewer-scope-editor";
76
+ import type { AdminActionLabels } from "../admin/admin-action-confirm";
77
+ import type { AdminActionLogLabels } from "../admin/admin-action-log";
78
+ import type { TransferOwnershipLabels } from "../admin/transfer-ownership-dialog";
79
+ import type { InvitationsLabels } from "../admin/invitations-panel";
69
80
  import type { AccountStateLabels } from "../components/account-chips";
70
81
  import type { ShareCardLabels } from "../components/share-card";
71
82
  import type { ReauthDialogLabels } from "../components/reauth-dialog";
@@ -350,6 +361,28 @@ export interface UiKitLabels {
350
361
  acceptInvitation: AcceptInvitationLabels;
351
362
  /** 0.29.0: kastlan's switcher between a user's companies (§5.3). */
352
363
  companySwitcher: CompanySwitcherLabels;
364
+ /** 0.30.0: changing the account's address with re-verification (docs/user-admin-harmonization.md §6.2). */
365
+ emailChange: EmailChangeLabels;
366
+ /** 0.30.0: sign out everywhere, and kastlan's device list (§6.3). */
367
+ sessions: SessionsLabels;
368
+ /** 0.30.0: deletion in two stages (§6.4). */
369
+ deleteAccount: DeleteAccountLabels;
370
+ /** 0.30.0: the self-service JSON export (§6.5). */
371
+ dataExport: DataExportLabels;
372
+ /** 0.30.0: the admin user list's columns (§3). */
373
+ userRoster: UserRosterLabels;
374
+ /** 0.30.0: picking one or several roles, with the reasons a choice is locked (§4.1). */
375
+ roleSelect: RoleSelectLabels;
376
+ /** 0.30.0: a translation reviewer's languages and areas. */
377
+ reviewerScope: ReviewerScopeLabels;
378
+ /** 0.30.0: an admin action's confirmation and refusals (§4.2). */
379
+ adminAction: AdminActionLabels;
380
+ /** 0.30.0: the admin_actions list (§4.3). */
381
+ adminActionLog: AdminActionLogLabels;
382
+ /** 0.30.0: handing an account's work to another (Kurvenschmiede). */
383
+ transferOwnership: TransferOwnershipLabels;
384
+ /** 0.30.0: the invitations panel (§5). */
385
+ invitations: InvitationsLabels;
353
386
  /** 0.22.0: the screen-reader words of `Input` / `Textarea`'s `showCount` counter. */
354
387
  characterCount: CharacterCountLabels;
355
388
  /** 0.22.0: `CountrySelect`. Its list's "no results" and counts are `combobox`'s. */
@@ -14,6 +14,15 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
14
14
  const num = new Intl.NumberFormat(numberLocale);
15
15
  const n = (value: number) => num.format(value);
16
16
  const plural = (count: number, one: string, many: string) => (count === 1 ? one : many);
17
+ // 0.30.0 — a throttled request (HTTP 429), as `englishRateLimited` in
18
+ // src/auth/auth-errors.ts: no wait → "un momento", under a minute → seconds, else
19
+ // minutes rounded up.
20
+ const wait = (seconds: number) =>
21
+ seconds < 60 ? `${n(Math.ceil(seconds))} s` : `${n(Math.ceil(seconds / 60))} min`;
22
+ const rateLimited = (seconds?: number) =>
23
+ !seconds || seconds <= 0
24
+ ? "Demasiados intentos. Espere un momento e inténtelo de nuevo."
25
+ : `Demasiados intentos. Inténtelo de nuevo en ${wait(seconds)}.`;
17
26
 
18
27
  return {
19
28
  feedbackAttachment: {
@@ -153,6 +162,9 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
153
162
  memberSince: "Miembro desde",
154
163
  displayName: "Nombre visible",
155
164
  save: "Guardar",
165
+ firstName: "Nombre",
166
+ lastName: "Apellidos",
167
+ nameRequired: "Introduzca el nombre y los apellidos.",
156
168
  },
157
169
  password: {
158
170
  title: "Cambiar contraseña",
@@ -699,6 +711,8 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
699
711
  registered: "Registrada",
700
712
  unverified: "Sin verificar",
701
713
  passwordChange: "Debe cambiar la contraseña",
714
+ deletion: "Eliminación solicitada",
715
+ deletionOn: (date) => `Eliminación el ${date}`,
702
716
  },
703
717
  shareCard: {
704
718
  dialogTitle: "Compartir",
@@ -864,6 +878,15 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
864
878
  setPasswordFailed: "No se pudo establecer la contraseña.",
865
879
  expired: "Este inicio de sesión ha caducado. Inicie sesión de nuevo.",
866
880
  backToSignIn: "Volver a iniciar sesión",
881
+ useRecoveryCode: "Usar un código de respaldo",
882
+ useAuthenticatorCode: "Usar su app de autenticación",
883
+ recoveryCode: "Código de respaldo",
884
+ recoveryIntro:
885
+ "Introduzca uno de los códigos de respaldo que guardó al activar la verificación en dos pasos.",
886
+ recoveryCodeHint: (length) =>
887
+ `${n(length)} letras y dígitos. Los guiones y los espacios no importan.`,
888
+ recoveryCodeInvalid: "Este código de respaldo no es válido o ya se ha usado.",
889
+ rateLimited,
867
890
  },
868
891
  register: {
869
892
  firstName: "Nombre",
@@ -871,7 +894,7 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
871
894
  email: "Correo electrónico",
872
895
  emailTagUse: (address) => `Usar ${address}`,
873
896
  emailTagHint:
874
- "Muchos proveedores entregan nombre+etiqueta@… en el mismo buzón, así que el correo de esta aplicación es fácil de filtrar y rastrear. Compruebe que el suyo lo hace antes de confiar en ello: iniciaría sesión con la dirección etiquetada.",
897
+ "Muchos proveedores entregan nombre+etiqueta@… en el mismo buzón, así que el correo de esta aplicación es fácil de filtrar y rastrear. Compruebe que el suyo lo hace antes de confiar en ello: tendría que iniciar sesión con la dirección etiquetada.",
875
898
  invitedEmailHint: "La dirección a la que se envió su invitación.",
876
899
  invitedTagNote: "La dirección etiquetada recibe su propio correo de confirmación.",
877
900
  password: "Contraseña",
@@ -887,6 +910,7 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
887
910
  invitationInvalid: "Este enlace de invitación no es válido.",
888
911
  invitationExpired: "Esta invitación ha caducado. Pida una nueva.",
889
912
  failed: "No se pudo completar el registro. Inténtelo de nuevo.",
913
+ rateLimited,
890
914
  },
891
915
  completeName: {
892
916
  title: "Complete su nombre",
@@ -906,9 +930,10 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
906
930
  submit: "Enviar el enlace",
907
931
  sent: (email) => `Si existe una cuenta para ${email}, el enlace está en camino.`,
908
932
  sentHint:
909
- "El enlace es válido durante una hora y funciona una sola vez. Mire también en la carpeta de correo no deseado.",
933
+ "El enlace es válido durante una hora y funciona una sola vez. Revise también la carpeta de correo no deseado.",
910
934
  backToSignIn: "Volver a iniciar sesión",
911
935
  error: "La solicitud ha fallado. Inténtelo de nuevo más tarde.",
936
+ rateLimited,
912
937
  },
913
938
  resetPassword: {
914
939
  title: "Elija una nueva contraseña",
@@ -927,6 +952,7 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
927
952
  sessionsEnded:
928
953
  "Se ha cerrado la sesión en los dispositivos conectados; tendrá que volver a iniciarla en ellos.",
929
954
  signIn: "Ir a iniciar sesión",
955
+ rateLimited,
930
956
  },
931
957
  verifyEmail: {
932
958
  title: "Confirme su dirección de correo electrónico",
@@ -948,7 +974,7 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
948
974
  },
949
975
  notFound: {
950
976
  title: "Página no encontrada",
951
- body: "Esta dirección no existe (o ya no existe). Quizá sea una errata, o la página se ha movido.",
977
+ body: "Esta dirección no existe (o ya no existe). Quizá sea una errata o la página se haya movido.",
952
978
  home: "Ir a la página de inicio",
953
979
  app: "Volver a la aplicación",
954
980
  },
@@ -974,6 +1000,207 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
974
1000
  currentMark: "(actual)",
975
1001
  switching: "Cambiando de empresa…",
976
1002
  },
1003
+ // 0.30.0 — docs/user-admin-harmonization.md: Kurvenschmiede's reviewed Spanish for the
1004
+ // admin words, transfer, invitations and sessions; written fresh where it had no
1005
+ // sentence. "Usted", as the rest of this catalogue.
1006
+ emailChange: {
1007
+ title: "Dirección de correo electrónico",
1008
+ current: "Dirección actual",
1009
+ newEmail: "Nueva dirección de correo electrónico",
1010
+ password: "Contraseña actual",
1011
+ passwordHint: "Inicia sesión con su dirección, así que cambiarla requiere su contraseña.",
1012
+ emailTagUse: (address) => `Usar ${address}`,
1013
+ emailTagHint:
1014
+ "Muchos proveedores entregan nombre+etiqueta@… en el mismo buzón, así que el correo de esta aplicación es fácil de filtrar y rastrear. Compruebe que el suyo lo hace antes de confiar en ello: tendría que iniciar sesión con la dirección etiquetada.",
1015
+ submit: "Cambiar la dirección de correo electrónico",
1016
+ sameAsCurrent: "Esta ya es su dirección.",
1017
+ emailTaken: "Ya existe una cuenta con esta dirección de correo electrónico.",
1018
+ wrongPassword: "La contraseña no es correcta.",
1019
+ pending: (newEmail) => `Confirme el enlace que hemos enviado a ${newEmail}.`,
1020
+ pendingHint: (currentEmail) =>
1021
+ `Hasta entonces, seguirá iniciando sesión con ${currentEmail}. Revise también la carpeta de correo no deseado.`,
1022
+ resend: "Enviar el enlace de nuevo",
1023
+ resent: "Hemos vuelto a enviar el enlace.",
1024
+ cancel: "Cancelar el cambio",
1025
+ confirmed: (email) => `Su dirección de correo electrónico es ahora ${email}.`,
1026
+ passkeyNote:
1027
+ "Sus llaves de acceso siguen funcionando. Puede que su dispositivo aún las muestre con su dirección anterior.",
1028
+ rateLimited,
1029
+ failed: "No ha funcionado. Inténtelo de nuevo.",
1030
+ },
1031
+ sessions: {
1032
+ title: "Sesiones",
1033
+ description:
1034
+ "¿Ha iniciado sesión en un dispositivo que ya no usa o en el que no confía? Cierre sesión en todas partes.",
1035
+ signOutEverywhere: "Cerrar sesión en todas partes…",
1036
+ signOutEverywherePrompt:
1037
+ "Esto termina todas las sesiones, también esta: se cerrará la sesión en este dispositivo y tendrá que volver a iniciarla aquí.",
1038
+ confirmSignOutEverywhere: "Cerrar sesión en todas partes",
1039
+ list: "Dónde ha iniciado sesión",
1040
+ loading: "Cargando sesiones…",
1041
+ empty: "No hay sesiones que mostrar.",
1042
+ current: "Este dispositivo",
1043
+ unknownDevice: "Dispositivo desconocido",
1044
+ // A colon: `when` is either "hace 3 horas" or a date.
1045
+ lastActive: (when) => `Última actividad: ${when}`,
1046
+ ip: (address) => `IP ${address}`,
1047
+ revoke: "Cerrar sesión",
1048
+ // Starts with `revoke`, the button's visible text, for voice control.
1049
+ revokeItem: (device) => `Cerrar sesión en ${device}`,
1050
+ failed: "No ha funcionado. Inténtelo de nuevo.",
1051
+ },
1052
+ deleteAccount: {
1053
+ title: "Eliminar la cuenta",
1054
+ afterDays: (days) =>
1055
+ `Su cuenta se desactiva de inmediato y se borra definitivamente ${n(days)} ${plural(days, "día", "días")} después.`,
1056
+ operator: "Su cuenta se desactiva de inmediato, y el operador la borrará definitivamente.",
1057
+ arm: "Eliminar la cuenta…",
1058
+ prompt: "Se cerrará su sesión en todos los dispositivos y ya no podrá usar su cuenta.",
1059
+ handOver: (count) =>
1060
+ count === 1
1061
+ ? "1 elemento que otros pueden ver pasará a un administrador."
1062
+ : `${n(count)} elementos que otros pueden ver pasarán a un administrador.`,
1063
+ confirm: "Eliminar mi cuenta",
1064
+ done: "Su cuenta está desactivada. Se está cerrando su sesión.",
1065
+ wrongPassword: "La contraseña no es correcta.",
1066
+ confirmationMismatch: "Esta no es la dirección de su cuenta.",
1067
+ lastAdmin:
1068
+ "Su cuenta es la última con rol de administrador. Primero haga administrador a otra persona.",
1069
+ lastAdminOf: (companies) =>
1070
+ `Su cuenta es la última con rol de administrador en ${companies}. Primero haga administrador allí a otra persona.`,
1071
+ householdHasMembers:
1072
+ "Su hogar tiene otros miembros, así que la cuenta no se puede eliminar aquí. Escriba al operador.",
1073
+ rateLimited,
1074
+ failed: "No se pudo eliminar su cuenta. Inténtelo de nuevo.",
1075
+ },
1076
+ dataExport: {
1077
+ title: "Exportar sus datos",
1078
+ description: "Descargue una copia de los datos de su cuenta como archivo JSON.",
1079
+ download: "Descargar mis datos",
1080
+ started: "La descarga ha comenzado.",
1081
+ saveAgain: "¿No ha empezado? Guardar el archivo",
1082
+ rateLimited: (seconds) =>
1083
+ seconds && seconds > 0
1084
+ ? `Acaba de exportar sus datos. Inténtelo de nuevo en ${wait(seconds)}.`
1085
+ : "Acaba de exportar sus datos. Inténtelo de nuevo dentro de un minuto.",
1086
+ failed: "La exportación ha fallado. Inténtelo de nuevo.",
1087
+ },
1088
+ userRoster: {
1089
+ name: "Nombre",
1090
+ email: "Correo electrónico",
1091
+ role: "Rol",
1092
+ state: "Estado",
1093
+ // Agreeing with "cuenta" (feminine), like `accountState`.
1094
+ created: "Creada",
1095
+ lastLogin: "Último inicio de sesión",
1096
+ never: "Nunca",
1097
+ actions: "Acciones",
1098
+ actionsFor: (name) => `Acciones para ${name}`,
1099
+ },
1100
+ roleSelect: {
1101
+ label: "Rol",
1102
+ rolesLegend: "Roles",
1103
+ roleOf: (name) => `Rol de ${name}`,
1104
+ lockedLastAdmin: "La última cuenta de administrador activa conserva este rol.",
1105
+ lockedSelf: "No puede cambiar su propio rol.",
1106
+ notForLastAdmin: "no para el último administrador",
1107
+ notForSelf: "no para su propia cuenta",
1108
+ unavailable: (role, reason) => `${role} (${reason})`,
1109
+ },
1110
+ reviewerScope: {
1111
+ languages: "Idiomas",
1112
+ hint: "Marque los idiomas que revisa esta persona.",
1113
+ none: "Ningún idioma: al guardar se retira el rol de revisor.",
1114
+ areas: "Limitar a",
1115
+ legalOnly: "Solo las páginas legales",
1116
+ legalOnlyHint:
1117
+ "Aviso legal, política de privacidad y condiciones de uso: para un abogado más que para un hablante nativo.",
1118
+ failed: "No se pudo guardar el ámbito de revisión. Inténtelo de nuevo.",
1119
+ },
1120
+ adminAction: {
1121
+ confirm: "Confirmar",
1122
+ cancel: "Cancelar",
1123
+ close: "Cerrar",
1124
+ lastAdmin:
1125
+ "Esta es la última cuenta de administrador activa. Primero haga administrador a otra persona.",
1126
+ self: "No puede hacer esto con su propia cuenta.",
1127
+ confirmationMismatch:
1128
+ "La dirección no coincide con esta cuenta. Compruebe en qué cuenta está.",
1129
+ otherCompanies:
1130
+ "Esta cuenta también pertenece a otras empresas, así que solo el operador de la plataforma puede hacer esto. En su lugar, puede quitarla de esta empresa.",
1131
+ removeFromCompany: "Quitar de la empresa",
1132
+ failed: "No ha funcionado. Inténtelo de nuevo.",
1133
+ },
1134
+ adminActionLog: {
1135
+ title: "Acciones de administración",
1136
+ empty: "Aún no hay acciones de administración.",
1137
+ loading: "Cargando…",
1138
+ by: (actor) => `por ${actor}`,
1139
+ bySelf: "por la propia persona",
1140
+ automatic: "automáticamente",
1141
+ erased: "una cuenta borrada",
1142
+ filteredTo: (target) => `Solo ${target}`,
1143
+ showAll: "Mostrar todas las acciones",
1144
+ filterBy: (target) => `Mostrar solo las acciones sobre ${target}`,
1145
+ // Agreeing with "cuenta" (feminine), like `accountState`.
1146
+ actions: {
1147
+ deactivate: "Desactivada",
1148
+ reactivate: "Reactivada",
1149
+ role: "Rol cambiado",
1150
+ membership_remove: "Quitada de la empresa",
1151
+ password_change_require: "Nueva contraseña exigida",
1152
+ password_change_withdraw: "Exigencia de contraseña retirada",
1153
+ mail_verification: "Correo de confirmación enviado",
1154
+ mail_reset: "Correo de restablecimiento de contraseña enviado",
1155
+ reviewer: "Ámbito de revisión cambiado",
1156
+ invite: "Invitación enviada",
1157
+ invite_resend: "Invitación reenviada",
1158
+ invite_revoke: "Invitación retirada",
1159
+ transfer: "Trabajo traspasado",
1160
+ deletion_request: "Eliminación solicitada",
1161
+ deletion_cancel: "Eliminación cancelada",
1162
+ erase: "Cuenta borrada",
1163
+ },
1164
+ },
1165
+ transferOwnership: {
1166
+ title: (name) => `Traspasar el trabajo de ${name}`,
1167
+ body: "Todo lo que posee esta cuenta pasa a la cuenta elegida, en un solo paso.",
1168
+ recipient: "Traspasar a",
1169
+ choose: "Elija una cuenta…",
1170
+ chooseFirst: "Elija quién recibe el trabajo",
1171
+ confirm: "Traspasar",
1172
+ customer: "cliente",
1173
+ deactivated: "desactivada",
1174
+ self: "la misma cuenta",
1175
+ unavailable: (account, reason) => `${account} (${reason})`,
1176
+ noCandidates: "Ninguna otra cuenta puede recibirlo.",
1177
+ },
1178
+ invitations: {
1179
+ email: "Dirección de correo electrónico",
1180
+ invalidEmail: "Introduzca una dirección de correo completa.",
1181
+ role: "Rol",
1182
+ scope: "Ámbito",
1183
+ scopeNone: "Ninguno",
1184
+ language: "Idioma de la invitación",
1185
+ note: "Nota",
1186
+ invite: "Invitar",
1187
+ listTitle: "Invitaciones",
1188
+ empty: "Todavía no se ha invitado a nadie.",
1189
+ loading: "Cargando…",
1190
+ // Agreeing with "invitación" (feminine).
1191
+ status: { open: "Pendiente", accepted: "Aceptada", expired: "Caducada", revoked: "Retirada" },
1192
+ sent: (date) => `Enviada el ${date}`,
1193
+ expires: (date) => `Válida hasta el ${date}`,
1194
+ invitedBy: (name) => `por ${name}`,
1195
+ resend: (email) => `Enviar a ${email} un enlace nuevo`,
1196
+ copyLink: "Copiar enlace de invitación",
1197
+ revoke: (email) => `Retirar la invitación de ${email}`,
1198
+ consoleHint:
1199
+ "Este servidor no envía correos: se escriben en el registro del servidor. Copie aquí cada enlace de invitación y transmítalo usted mismo: solo se muestra una vez.",
1200
+ linkReady: (email) => `El enlace de invitación para ${email}, que solo se muestra esta vez:`,
1201
+ notSent: (email) => `${email} está invitado, pero no se pudo enviar el correo. Reenvíelo.`,
1202
+ failed: "No ha funcionado. Inténtelo de nuevo.",
1203
+ },
977
1204
  characterCount: {
978
1205
  count: (used, max) => `${n(used)} de ${n(max)} ${plural(max, "carácter", "caracteres")}`,
979
1206
  remaining: (left) =>