@cosmicdrift/kumiko-bundled-features 0.205.0 → 0.207.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +7 -7
- package/src/admin-shell/i18n.ts +36 -17
- package/src/admin-shell/web/i18n.ts +1 -1
- package/src/audit/i18n.ts +41 -25
- package/src/audit/web/i18n.ts +1 -1
- package/src/auth-email-password/i18n.ts +129 -0
- package/src/auth-mfa/i18n.ts +2 -1
- package/src/auth-mfa/web/i18n.ts +63 -0
- package/src/cap-counter/i18n.ts +10 -5
- package/src/compliance-profiles/i18n.ts +11 -3
- package/src/compliance-profiles/web/i18n.ts +10 -0
- package/src/config/i18n.ts +5 -5
- package/src/config/web/i18n.ts +9 -0
- package/src/custom-fields/web/i18n.ts +9 -0
- package/src/delivery/i18n.ts +7 -3
- package/src/delivery/web/i18n.ts +10 -0
- package/src/feature-toggles/i18n.ts +11 -3
- package/src/feature-toggles/web/i18n.ts +12 -0
- package/src/folders/web/i18n.ts +25 -0
- package/src/inbound-mail-foundation/__tests__/inbound-mail-foundation.integration.test.ts +11 -10
- package/src/inbound-mail-foundation/handlers/ingest-message.write.ts +21 -26
- package/src/jobs/i18n.ts +62 -40
- package/src/jobs/web/i18n.ts +1 -1
- package/src/managed-pages/i18n.ts +63 -23
- package/src/managed-pages/web/i18n.ts +1 -1
- package/src/notes-history/i18n.ts +1 -1
- package/src/notes-history/web/i18n.ts +8 -0
- package/src/personal-access-tokens/i18n.ts +6 -2
- package/src/personal-access-tokens/web/i18n.ts +35 -0
- package/src/sessions/i18n.ts +21 -17
- package/src/tags/i18n.ts +2 -2
- package/src/tags/web/i18n.ts +25 -0
- package/src/template-resolver/web/i18n.ts +14 -0
- package/src/tenant/i18n.ts +24 -13
- package/src/tenant/web/i18n.ts +19 -0
- package/src/tier-engine/i18n.ts +22 -2
- package/src/user/__tests__/email-unique-blind-index.integration.test.ts +140 -0
- package/src/user/__tests__/user.integration.test.ts +31 -0
- package/src/user/handlers/create.write.ts +54 -8
- package/src/user/i18n.ts +31 -14
- package/src/user/schema/user.ts +11 -0
- package/src/user-data-rights/i18n.ts +66 -18
- package/src/user-data-rights/web/i18n.ts +70 -1
- package/src/user-profile/i18n.ts +35 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cosmicdrift/kumiko-bundled-features",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.207.0",
|
|
4
4
|
"description": "Built-in features — tenant, user, auth, delivery. The stuff you'd rewrite anyway, already typed.",
|
|
5
5
|
"license": "BUSL-1.1",
|
|
6
6
|
"author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
|
|
@@ -126,12 +126,12 @@
|
|
|
126
126
|
"./step-dispatcher": "./src/step-dispatcher/index.ts"
|
|
127
127
|
},
|
|
128
128
|
"dependencies": {
|
|
129
|
-
"@cosmicdrift/kumiko-dispatcher-live": "0.
|
|
130
|
-
"@cosmicdrift/kumiko-framework": "0.
|
|
131
|
-
"@cosmicdrift/kumiko-headless": "0.
|
|
132
|
-
"@cosmicdrift/kumiko-renderer": "0.
|
|
133
|
-
"@cosmicdrift/kumiko-renderer-web": "0.
|
|
134
|
-
"@cosmicdrift/kumiko-types": "0.
|
|
129
|
+
"@cosmicdrift/kumiko-dispatcher-live": "0.207.0",
|
|
130
|
+
"@cosmicdrift/kumiko-framework": "0.207.0",
|
|
131
|
+
"@cosmicdrift/kumiko-headless": "0.207.0",
|
|
132
|
+
"@cosmicdrift/kumiko-renderer": "0.207.0",
|
|
133
|
+
"@cosmicdrift/kumiko-renderer-web": "0.207.0",
|
|
134
|
+
"@cosmicdrift/kumiko-types": "0.207.0",
|
|
135
135
|
"@mollie/api-client": "^4.5.0",
|
|
136
136
|
"@node-rs/argon2": "^2.0.2",
|
|
137
137
|
"@types/mailparser": "^3.4.6",
|
package/src/admin-shell/i18n.ts
CHANGED
|
@@ -2,35 +2,54 @@
|
|
|
2
2
|
// Pure-Data i18n keys for admin-shell (server r.translations + client pivot).
|
|
3
3
|
// Without these keys nav labels and workspace tabs render raw QNs in the shell.
|
|
4
4
|
|
|
5
|
-
type LocalizedString = { readonly de: string; readonly en: string };
|
|
5
|
+
type LocalizedString = { readonly de: string; readonly en: string; readonly es: string };
|
|
6
6
|
|
|
7
7
|
export const ADMIN_SHELL_I18N: Readonly<Record<string, LocalizedString>> = {
|
|
8
|
-
"screen:tenant-overview.title": { de: "Übersicht", en: "Overview" },
|
|
9
|
-
"screen:platform-overview.title": { de: "Übersicht", en: "Overview" },
|
|
10
|
-
"admin-shell:workspace.tenant": {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
"admin-shell:
|
|
16
|
-
"admin-shell:
|
|
17
|
-
"admin-shell:
|
|
18
|
-
"admin-shell:
|
|
8
|
+
"screen:tenant-overview.title": { de: "Übersicht", en: "Overview", es: "Resumen" },
|
|
9
|
+
"screen:platform-overview.title": { de: "Übersicht", en: "Overview", es: "Resumen" },
|
|
10
|
+
"admin-shell:workspace.tenant": {
|
|
11
|
+
de: "Administration",
|
|
12
|
+
en: "Administration",
|
|
13
|
+
es: "Administración",
|
|
14
|
+
},
|
|
15
|
+
"admin-shell:workspace.platform": { de: "Plattform", en: "Platform", es: "Plataforma" },
|
|
16
|
+
"admin-shell:nav.tenantOverview": { de: "Übersicht", en: "Overview", es: "Resumen" },
|
|
17
|
+
"admin-shell:nav.platformOverview": { de: "Übersicht", en: "Overview", es: "Resumen" },
|
|
18
|
+
"admin-shell:nav.tenants": { de: "Mandanten", en: "Tenants", es: "Organizaciones" },
|
|
19
|
+
"admin-shell:nav.tierAdmin": { de: "Tier zuweisen", en: "Assign tier", es: "Asignar tier" },
|
|
20
|
+
"admin-shell:overview.tenantTitle": {
|
|
21
|
+
de: "Administration",
|
|
22
|
+
en: "Administration",
|
|
23
|
+
es: "Administración",
|
|
24
|
+
},
|
|
25
|
+
"admin-shell:overview.platformTitle": { de: "Plattform", en: "Platform", es: "Plataforma" },
|
|
26
|
+
"admin-shell:overview.loading": { de: "Lade…", en: "Loading…", es: "Cargando…" },
|
|
19
27
|
"admin-shell:overview.pendingInvitations": {
|
|
20
28
|
de: "Ausstehende Einladungen",
|
|
21
29
|
en: "Pending invitations",
|
|
30
|
+
es: "Invitaciones pendientes",
|
|
22
31
|
},
|
|
23
|
-
"admin-shell:overview.members": { de: "Mitglieder", en: "Members" },
|
|
32
|
+
"admin-shell:overview.members": { de: "Mitglieder", en: "Members", es: "Miembros" },
|
|
24
33
|
"admin-shell:overview.missingConfig": {
|
|
25
34
|
de: "Fehlende Konfiguration",
|
|
26
35
|
en: "Missing configuration",
|
|
36
|
+
es: "Configuración incompleta",
|
|
27
37
|
},
|
|
28
38
|
"admin-shell:overview.missingConfigHint": {
|
|
29
39
|
de: "Pflichtfelder in den Einstellungen prüfen",
|
|
30
40
|
en: "Check required settings",
|
|
41
|
+
es: "Revisa los ajustes obligatorios",
|
|
42
|
+
},
|
|
43
|
+
"admin-shell:overview.tenants": { de: "Mandanten", en: "Tenants", es: "Organizaciones" },
|
|
44
|
+
"admin-shell:overview.users": { de: "Benutzer", en: "Users", es: "Usuarios" },
|
|
45
|
+
"admin-shell:overview.failedJobs": {
|
|
46
|
+
de: "Fehlgeschlagene Jobs",
|
|
47
|
+
en: "Failed jobs",
|
|
48
|
+
es: "Trabajos fallidos",
|
|
49
|
+
},
|
|
50
|
+
"admin-shell:overview.failedJobsHint": {
|
|
51
|
+
de: "Job-Runs prüfen",
|
|
52
|
+
en: "Review job runs",
|
|
53
|
+
es: "Revisa las ejecuciones de trabajos",
|
|
31
54
|
},
|
|
32
|
-
"admin-shell:overview.tenants": { de: "Mandanten", en: "Tenants" },
|
|
33
|
-
"admin-shell:overview.users": { de: "Benutzer", en: "Users" },
|
|
34
|
-
"admin-shell:overview.failedJobs": { de: "Fehlgeschlagene Jobs", en: "Failed jobs" },
|
|
35
|
-
"admin-shell:overview.failedJobsHint": { de: "Job-Runs prüfen", en: "Review job runs" },
|
|
36
55
|
};
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import type { TranslationsByLocale } from "@cosmicdrift/kumiko-renderer";
|
|
5
5
|
import { ADMIN_SHELL_I18N } from "../i18n";
|
|
6
6
|
|
|
7
|
-
const LOCALES = ["de", "en"] as const;
|
|
7
|
+
const LOCALES = ["de", "en", "es"] as const;
|
|
8
8
|
|
|
9
9
|
export const defaultTranslations: TranslationsByLocale = Object.fromEntries(
|
|
10
10
|
LOCALES.map((locale) => [
|
package/src/audit/i18n.ts
CHANGED
|
@@ -1,31 +1,47 @@
|
|
|
1
1
|
// @runtime client
|
|
2
2
|
// Server + client i18n for audit (nav labels + AuditLogScreen).
|
|
3
3
|
|
|
4
|
-
type LocalizedString = { readonly de: string; readonly en: string };
|
|
4
|
+
type LocalizedString = { readonly de: string; readonly en: string; readonly es: string };
|
|
5
5
|
|
|
6
6
|
export const AUDIT_I18N: Readonly<Record<string, LocalizedString>> = {
|
|
7
|
-
"screen:audit-log.title": { de: "Audit-Log", en: "Audit log" },
|
|
8
|
-
"screen:audit-log-detail.title": { de: "Ereignis", en: "Event" },
|
|
9
|
-
"audit:nav.auditLog": { de: "Audit", en: "Audit" },
|
|
10
|
-
"audit.log.title": { de: "Audit-Log", en: "Audit log" },
|
|
11
|
-
"audit.log.loading": { de: "Lade Ereignisse…", en: "Loading events…" },
|
|
12
|
-
"audit.log.empty": { de: "Keine Ereignisse.", en: "No events." },
|
|
13
|
-
"audit.log.newest": { de: "Neueste", en: "Newest" },
|
|
14
|
-
"audit.log.older": { de: "Ältere laden", en: "Load older" },
|
|
15
|
-
"audit.log.col.when": { de: "Zeit", en: "When" },
|
|
16
|
-
"audit.log.col.type": { de: "Ereignis", en: "Event" },
|
|
17
|
-
"audit.log.col.aggregate": { de: "Aggregate", en: "Aggregate" },
|
|
18
|
-
"audit.log.col.actor": { de: "Akteur", en: "Actor" },
|
|
19
|
-
"audit.log.filter.eventType": { de: "Ereignistyp", en: "Event type" },
|
|
20
|
-
"audit.log.filter.aggregateType": {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
"audit.log.
|
|
26
|
-
"audit.log.
|
|
27
|
-
"audit.log.
|
|
28
|
-
"audit.log.
|
|
29
|
-
"audit.log.
|
|
30
|
-
"audit.log.detail.
|
|
7
|
+
"screen:audit-log.title": { de: "Audit-Log", en: "Audit log", es: "Registro de auditoría" },
|
|
8
|
+
"screen:audit-log-detail.title": { de: "Ereignis", en: "Event", es: "Evento" },
|
|
9
|
+
"audit:nav.auditLog": { de: "Audit", en: "Audit", es: "Auditoría" },
|
|
10
|
+
"audit.log.title": { de: "Audit-Log", en: "Audit log", es: "Registro de auditoría" },
|
|
11
|
+
"audit.log.loading": { de: "Lade Ereignisse…", en: "Loading events…", es: "Cargando eventos…" },
|
|
12
|
+
"audit.log.empty": { de: "Keine Ereignisse.", en: "No events.", es: "No hay eventos." },
|
|
13
|
+
"audit.log.newest": { de: "Neueste", en: "Newest", es: "Más recientes" },
|
|
14
|
+
"audit.log.older": { de: "Ältere laden", en: "Load older", es: "Cargar más antiguos" },
|
|
15
|
+
"audit.log.col.when": { de: "Zeit", en: "When", es: "Fecha" },
|
|
16
|
+
"audit.log.col.type": { de: "Ereignis", en: "Event", es: "Evento" },
|
|
17
|
+
"audit.log.col.aggregate": { de: "Aggregate", en: "Aggregate", es: "Agregado" },
|
|
18
|
+
"audit.log.col.actor": { de: "Akteur", en: "Actor", es: "Actor" },
|
|
19
|
+
"audit.log.filter.eventType": { de: "Ereignistyp", en: "Event type", es: "Tipo de evento" },
|
|
20
|
+
"audit.log.filter.aggregateType": {
|
|
21
|
+
de: "Aggregate-Typ",
|
|
22
|
+
en: "Aggregate type",
|
|
23
|
+
es: "Tipo de agregado",
|
|
24
|
+
},
|
|
25
|
+
"audit.log.filter.from": { de: "Von", en: "From", es: "Desde" },
|
|
26
|
+
"audit.log.filter.to": { de: "Bis", en: "To", es: "Hasta" },
|
|
27
|
+
"audit.log.filter.apply": { de: "Filtern", en: "Filter", es: "Filtrar" },
|
|
28
|
+
"audit.log.filter.reset": { de: "Zurücksetzen", en: "Reset", es: "Restablecer" },
|
|
29
|
+
"audit.log.details": { de: "Details", en: "Details", es: "Detalles" },
|
|
30
|
+
"audit.log.detail.loading": {
|
|
31
|
+
de: "Lade Ereignis…",
|
|
32
|
+
en: "Loading event…",
|
|
33
|
+
es: "Cargando evento…",
|
|
34
|
+
},
|
|
35
|
+
"audit.log.detail.missing": {
|
|
36
|
+
de: "Ereignis nicht gefunden.",
|
|
37
|
+
en: "Event not found.",
|
|
38
|
+
es: "Evento no encontrado.",
|
|
39
|
+
},
|
|
40
|
+
"audit.log.detail.payload": {
|
|
41
|
+
de: "Ereignis-Payload",
|
|
42
|
+
en: "Event payload",
|
|
43
|
+
es: "Payload del evento",
|
|
44
|
+
},
|
|
45
|
+
"audit.log.detail.metadata": { de: "Metadaten", en: "Metadata", es: "Metadatos" },
|
|
46
|
+
"audit.log.detail.field.id": { de: "Ereignis-ID", en: "Event ID", es: "ID del evento" },
|
|
31
47
|
};
|
package/src/audit/web/i18n.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import type { TranslationsByLocale } from "@cosmicdrift/kumiko-renderer";
|
|
3
3
|
import { AUDIT_I18N } from "../i18n";
|
|
4
4
|
|
|
5
|
-
const LOCALES = ["de", "en"] as const;
|
|
5
|
+
const LOCALES = ["de", "en", "es"] as const;
|
|
6
6
|
|
|
7
7
|
export const defaultTranslations: TranslationsByLocale = Object.fromEntries(
|
|
8
8
|
LOCALES.map((locale) => [
|
|
@@ -263,6 +263,135 @@ export const defaultTranslations: TranslationsByLocale = {
|
|
|
263
263
|
"auth.tenant.switcher.label": "Tenant",
|
|
264
264
|
"auth.tenant.switcher.none": "No tenant",
|
|
265
265
|
},
|
|
266
|
+
es: {
|
|
267
|
+
"auth.login.title": "Iniciar sesión",
|
|
268
|
+
"auth.login.email": "Correo electrónico",
|
|
269
|
+
"auth.login.password": "Contraseña",
|
|
270
|
+
"auth.login.submit": "Iniciar sesión",
|
|
271
|
+
"auth.login.submitting": "…",
|
|
272
|
+
"auth.login.forgotPassword": "¿Olvidaste tu contraseña?",
|
|
273
|
+
"auth.login.unlockAccount": "¿Desbloquear cuenta?",
|
|
274
|
+
"auth.login.resendVerification": "Reenviar correo de confirmación",
|
|
275
|
+
"auth.login.resendSuccess": "Te hemos enviado un nuevo correo de confirmación.",
|
|
276
|
+
"auth.login.resendRateLimited": "Espera un momento e inténtalo de nuevo.",
|
|
277
|
+
"auth.login.resendError": "No se pudo enviar. Inténtalo de nuevo.",
|
|
278
|
+
"auth.errors.invalidCredentials": "Correo electrónico o contraseña incorrectos.",
|
|
279
|
+
"auth.errors.noMembership": "Esta cuenta no tiene acceso a ningún tenant.",
|
|
280
|
+
"auth.errors.accountLocked": "Cuenta bloqueada temporalmente.",
|
|
281
|
+
"auth.errors.accountLockedRetry": "Cuenta bloqueada. Vuelve a intentarlo en {minutes} minutos.",
|
|
282
|
+
"auth.errors.emailNotVerified": "El correo electrónico aún no está confirmado.",
|
|
283
|
+
"auth.errors.accountRestricted":
|
|
284
|
+
"Cuenta pausada (protección de datos, art. 18). Levanta la pausa para volver a iniciar sesión.",
|
|
285
|
+
"auth.errors.rateLimited": "Demasiados intentos de inicio de sesión. Espera un momento.",
|
|
286
|
+
"auth.errors.invalidBody": "Entrada no válida.",
|
|
287
|
+
"auth.errors.loginFailed": "Error al iniciar sesión.",
|
|
288
|
+
"auth.errors.mfaNotSupported":
|
|
289
|
+
"Esta aplicación no admite la verificación en dos pasos. Contacta con soporte.",
|
|
290
|
+
"auth.errors.mfaSetupRequired":
|
|
291
|
+
"Se requiere autenticación en dos pasos. Contacta con el administrador.",
|
|
292
|
+
"auth.errors.invalidResetToken": "El enlace no es válido o ha caducado. Solicita uno nuevo.",
|
|
293
|
+
"auth.errors.invalidVerificationToken": "El enlace de confirmación no es válido o ha caducado.",
|
|
294
|
+
"auth.errors.invalidUnlockToken":
|
|
295
|
+
"El enlace de desbloqueo no es válido o ha caducado. Solicita uno nuevo.",
|
|
296
|
+
"auth.errors.invalidSignupToken":
|
|
297
|
+
"El enlace de activación no es válido o ha caducado. Solicita uno nuevo.",
|
|
298
|
+
"auth.errors.signupEmailAlreadyRegistered":
|
|
299
|
+
"Ya existe una cuenta con este correo electrónico. Inicia sesión o restablece tu contraseña.",
|
|
300
|
+
"auth.errors.unknownError": "Algo salió mal. Inténtalo de nuevo.",
|
|
301
|
+
"auth.errors.originNotAllowed": "El acceso desde este origen no está permitido.",
|
|
302
|
+
"auth.forgotPassword.title": "Restablecer contraseña",
|
|
303
|
+
"auth.forgotPassword.intro":
|
|
304
|
+
"Introduce tu correo electrónico. Si existe una cuenta, te enviaremos un enlace para restablecer la contraseña.",
|
|
305
|
+
"auth.forgotPassword.email": "Correo electrónico",
|
|
306
|
+
"auth.forgotPassword.submit": "Solicitar enlace",
|
|
307
|
+
"auth.forgotPassword.submitting": "…",
|
|
308
|
+
"auth.forgotPassword.successTitle": "Correo enviado",
|
|
309
|
+
"auth.forgotPassword.successBody":
|
|
310
|
+
"Si el correo existe en nuestro sistema, te hemos enviado un mensaje con un enlace para restablecer la contraseña. Revisa tu bandeja de entrada.",
|
|
311
|
+
"auth.forgotPassword.backToLogin": "Volver al inicio de sesión",
|
|
312
|
+
"auth.resetPassword.title": "Establecer nueva contraseña",
|
|
313
|
+
"auth.resetPassword.intro": "Elige una nueva contraseña (al menos 8 caracteres).",
|
|
314
|
+
"auth.resetPassword.newPassword": "Nueva contraseña",
|
|
315
|
+
"auth.resetPassword.confirmPassword": "Confirmar contraseña",
|
|
316
|
+
"auth.resetPassword.mismatch": "Las contraseñas no coinciden.",
|
|
317
|
+
"auth.resetPassword.tooShort": "La contraseña debe tener al menos 8 caracteres.",
|
|
318
|
+
"auth.resetPassword.submit": "Guardar contraseña",
|
|
319
|
+
"auth.resetPassword.submitting": "…",
|
|
320
|
+
"auth.resetPassword.successTitle": "Contraseña establecida",
|
|
321
|
+
"auth.resetPassword.successBody": "Ya puedes iniciar sesión con tu nueva contraseña.",
|
|
322
|
+
"auth.resetPassword.goToLogin": "Ir a iniciar sesión",
|
|
323
|
+
"auth.resetPassword.missingToken":
|
|
324
|
+
"El enlace de restablecimiento no contiene ningún token. Solicita uno nuevo.",
|
|
325
|
+
"auth.verifyEmail.verifying": "Confirmando correo electrónico …",
|
|
326
|
+
"auth.verifyEmail.successTitle": "Correo confirmado",
|
|
327
|
+
"auth.verifyEmail.successBody": "¡Gracias! Ya puedes iniciar sesión.",
|
|
328
|
+
"auth.verifyEmail.errorTitle": "Error al confirmar",
|
|
329
|
+
"auth.verifyEmail.errorBody":
|
|
330
|
+
"El enlace no es válido o ha caducado. Solicita un nuevo correo de confirmación.",
|
|
331
|
+
"auth.verifyEmail.goToLogin": "Ir a iniciar sesión",
|
|
332
|
+
"auth.verifyEmail.missingToken": "El enlace de confirmación no contiene ningún token.",
|
|
333
|
+
"auth.requestUnlock.title": "Desbloquear cuenta",
|
|
334
|
+
"auth.requestUnlock.intro":
|
|
335
|
+
"Introduce tu correo electrónico. Si tu cuenta está bloqueada, te enviaremos un enlace de desbloqueo.",
|
|
336
|
+
"auth.requestUnlock.email": "Correo electrónico",
|
|
337
|
+
"auth.requestUnlock.submit": "Solicitar enlace",
|
|
338
|
+
"auth.requestUnlock.submitting": "…",
|
|
339
|
+
"auth.requestUnlock.successTitle": "Correo enviado",
|
|
340
|
+
"auth.requestUnlock.successBody":
|
|
341
|
+
"Si ese correo existe en nuestro sistema y está bloqueado, te hemos enviado un mensaje con un enlace de desbloqueo. Revisa tu bandeja de entrada.",
|
|
342
|
+
"auth.requestUnlock.backToLogin": "Volver al inicio de sesión",
|
|
343
|
+
"auth.requestUnlock.rateLimited":
|
|
344
|
+
"Demasiadas solicitudes. Vuelve a intentarlo en {minutes} minutos.",
|
|
345
|
+
"auth.unlockAccount.verifying": "Desbloqueando cuenta …",
|
|
346
|
+
"auth.unlockAccount.successTitle": "Cuenta desbloqueada",
|
|
347
|
+
"auth.unlockAccount.successBody": "Tu cuenta ha sido desbloqueada. Ya puedes iniciar sesión.",
|
|
348
|
+
"auth.unlockAccount.errorTitle": "Error al desbloquear",
|
|
349
|
+
"auth.unlockAccount.errorBody":
|
|
350
|
+
"El enlace no es válido o ha caducado. Solicita un nuevo enlace de desbloqueo.",
|
|
351
|
+
"auth.unlockAccount.goToLogin": "Ir a iniciar sesión",
|
|
352
|
+
"auth.unlockAccount.missingToken": "El enlace de desbloqueo no contiene ningún token.",
|
|
353
|
+
"auth.signup.title": "Crear cuenta",
|
|
354
|
+
"auth.signup.intro":
|
|
355
|
+
"Introduce tu correo electrónico. Te enviaremos un enlace de activación con el que podrás establecer tu contraseña.",
|
|
356
|
+
"auth.signup.email": "Correo electrónico",
|
|
357
|
+
"auth.signup.submit": "Enviar enlace de activación",
|
|
358
|
+
"auth.signup.submitting": "…",
|
|
359
|
+
"auth.signup.successTitle": "Correo enviado",
|
|
360
|
+
"auth.signup.successBody":
|
|
361
|
+
"Te hemos enviado un enlace de activación a tu correo electrónico. Haz clic en él para establecer tu contraseña e iniciar sesión.",
|
|
362
|
+
"auth.signup.resend": "Reenviar correo",
|
|
363
|
+
"auth.signup.haveAccount": "¿Ya tienes una cuenta? Inicia sesión",
|
|
364
|
+
"auth.signupComplete.title": "Establecer contraseña",
|
|
365
|
+
"auth.signupComplete.intro":
|
|
366
|
+
"Elige una contraseña (al menos 8 caracteres) para tu nueva cuenta.",
|
|
367
|
+
"auth.signupComplete.password": "Contraseña",
|
|
368
|
+
"auth.signupComplete.confirmPassword": "Confirmar contraseña",
|
|
369
|
+
"auth.signupComplete.tooShort": "La contraseña debe tener al menos 8 caracteres.",
|
|
370
|
+
"auth.signupComplete.mismatch": "Las contraseñas no coinciden.",
|
|
371
|
+
"auth.signupComplete.submit": "Activar cuenta",
|
|
372
|
+
"auth.signupComplete.submitting": "…",
|
|
373
|
+
"auth.signupComplete.missingToken":
|
|
374
|
+
"El enlace de activación no contiene ningún token. Solicita uno nuevo.",
|
|
375
|
+
"auth.inviteAccept.title": "Aceptar invitación",
|
|
376
|
+
"auth.inviteAccept.intro":
|
|
377
|
+
"Te han invitado a un espacio de trabajo. Haz clic en 'Aceptar' para unirte.",
|
|
378
|
+
"auth.inviteAccept.loggedInAs": "Has iniciado sesión — haz clic en 'Aceptar' para unirte.",
|
|
379
|
+
"auth.inviteAccept.email": "Correo electrónico",
|
|
380
|
+
"auth.inviteAccept.password": "Contraseña",
|
|
381
|
+
"auth.inviteAccept.acceptButton": "Aceptar",
|
|
382
|
+
"auth.inviteAccept.submit": "Aceptar e iniciar sesión",
|
|
383
|
+
"auth.inviteAccept.submitting": "…",
|
|
384
|
+
"auth.inviteAccept.useOtherAccount": "Iniciar sesión con otra cuenta",
|
|
385
|
+
"auth.inviteAccept.toggleNew": "Todavía no tengo una cuenta",
|
|
386
|
+
"auth.inviteAccept.toggleExisting": "Ya tengo una cuenta",
|
|
387
|
+
"auth.inviteAccept.missingToken":
|
|
388
|
+
"El enlace de invitación no contiene ningún token o no es válido.",
|
|
389
|
+
"auth.inviteAccept.goToLogin": "Ir a iniciar sesión",
|
|
390
|
+
"auth.user.menu.label": "Cuenta",
|
|
391
|
+
"auth.user.menu.logout": "Cerrar sesión",
|
|
392
|
+
"auth.tenant.switcher.label": "Tenant",
|
|
393
|
+
"auth.tenant.switcher.none": "Sin tenant",
|
|
394
|
+
},
|
|
266
395
|
};
|
|
267
396
|
|
|
268
397
|
// Kanonische Implementierung lebt jetzt im Renderer (neben
|
package/src/auth-mfa/i18n.ts
CHANGED
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
// engine requires every registered r.screen to declare. Distinct from
|
|
3
3
|
// web/i18n.ts (the client's free-form UI-string bundle) — see
|
|
4
4
|
// personal-access-tokens/i18n.ts for the same split.
|
|
5
|
-
type LocalizedString = { readonly de: string; readonly en: string };
|
|
5
|
+
type LocalizedString = { readonly de: string; readonly en: string; readonly es: string };
|
|
6
6
|
|
|
7
7
|
export const AUTH_MFA_FEATURE_I18N: Readonly<Record<string, LocalizedString>> = {
|
|
8
8
|
"screen:auth-mfa-enable.title": {
|
|
9
9
|
de: "Zwei-Faktor-Authentifizierung",
|
|
10
10
|
en: "Two-factor authentication",
|
|
11
|
+
es: "Verificación en dos pasos",
|
|
11
12
|
},
|
|
12
13
|
};
|
package/src/auth-mfa/web/i18n.ts
CHANGED
|
@@ -131,6 +131,69 @@ export const defaultTranslations: TranslationsByLocale = {
|
|
|
131
131
|
"auth.mfa.regenerate.acknowledge": "I've saved my new recovery codes.",
|
|
132
132
|
"auth.mfa.regenerate.done": "Done",
|
|
133
133
|
},
|
|
134
|
+
es: {
|
|
135
|
+
"screen:auth-mfa-enable.title": "Verificación en dos pasos",
|
|
136
|
+
"auth.mfa.verify.title": "Verificación en dos pasos",
|
|
137
|
+
"auth.mfa.verify.subtitle": "Introduce el código de 6 dígitos de tu app de autenticación.",
|
|
138
|
+
"auth.mfa.verify.code": "Código",
|
|
139
|
+
"auth.mfa.verify.submit": "Confirmar",
|
|
140
|
+
"auth.mfa.verify.submitting": "…",
|
|
141
|
+
"auth.mfa.verify.backToLogin": "Volver al inicio de sesión",
|
|
142
|
+
"auth.mfa.errors.invalidCode": "Código no válido. Inténtalo de nuevo.",
|
|
143
|
+
"auth.mfa.errors.invalidTotpCode": "Código no válido. Inténtalo de nuevo.",
|
|
144
|
+
"auth.mfa.errors.invalidChallengeToken":
|
|
145
|
+
"Tu inicio de sesión ha caducado. Vuelve a iniciar sesión.",
|
|
146
|
+
"auth.mfa.errors.challengeExpired": "Tu inicio de sesión ha caducado. Vuelve a iniciar sesión.",
|
|
147
|
+
"auth.mfa.errors.tooManyAttempts": "Demasiados intentos fallidos. Vuelve a iniciar sesión.",
|
|
148
|
+
"auth.mfa.errors.tooManyAttemptsWithSeconds":
|
|
149
|
+
"Demasiados intentos fallidos. Inténtalo de nuevo en {seconds} segundos o vuelve a iniciar sesión.",
|
|
150
|
+
"auth.mfa.errors.verifyFailed": "Error al confirmar.",
|
|
151
|
+
"auth.mfa.errors.mfaAlreadyEnabled": "La verificación en dos pasos ya está activada.",
|
|
152
|
+
"auth.mfa.errors.mfaNotEnabled": "La verificación en dos pasos no está activada.",
|
|
153
|
+
"auth.mfa.errors.invalidSetupToken": "La configuración ha caducado. Vuelve a empezar.",
|
|
154
|
+
"auth.mfa.errors.setupFailed": "Error al configurar. Inténtalo de nuevo.",
|
|
155
|
+
"auth.mfa.errors.invalidRecoveryCode": "Código de recuperación no válido.",
|
|
156
|
+
"auth.mfa.enable.title": "Verificación en dos pasos",
|
|
157
|
+
"auth.mfa.enable.intro":
|
|
158
|
+
"Protege tu cuenta con una capa adicional usando una app de autenticación (p. ej. Google Authenticator, 1Password).",
|
|
159
|
+
"auth.mfa.enable.start": "Iniciar configuración",
|
|
160
|
+
"auth.mfa.enable.scanTitle": "Escanea el código QR",
|
|
161
|
+
"auth.mfa.enable.manualEntry": "O introdúcelo manualmente:",
|
|
162
|
+
"auth.mfa.enable.recoveryTitle": "Códigos de recuperación",
|
|
163
|
+
"auth.mfa.enable.recoveryHint":
|
|
164
|
+
"Guarda estos códigos en un lugar seguro. Solo se muestran esta vez y te permiten entrar si pierdes tu dispositivo.",
|
|
165
|
+
"auth.mfa.enable.acknowledge": "He guardado mis códigos de recuperación.",
|
|
166
|
+
"auth.mfa.enable.code": "Código de la app de autenticación",
|
|
167
|
+
"auth.mfa.enable.cancel": "Cancelar",
|
|
168
|
+
"auth.mfa.enable.confirm": "Activar",
|
|
169
|
+
"auth.mfa.enable.success": "Ya tienes activada la verificación en dos pasos.",
|
|
170
|
+
"auth.mfa.setup.title": "Se requiere verificación en dos pasos",
|
|
171
|
+
"auth.mfa.setup.subtitle":
|
|
172
|
+
"Tu cuenta requiere verificación en dos pasos. Configúrala ahora para iniciar sesión.",
|
|
173
|
+
"auth.mfa.setup.intro":
|
|
174
|
+
"Escanea el código QR con una app de autenticación (p. ej. Google Authenticator, 1Password).",
|
|
175
|
+
"auth.mfa.setup.start": "Iniciar configuración",
|
|
176
|
+
"auth.mfa.setup.confirm": "Completar configuración",
|
|
177
|
+
"auth.mfa.disable.title": "Desactivar la verificación en dos pasos",
|
|
178
|
+
"auth.mfa.disable.description":
|
|
179
|
+
"Confirma con un código de tu app de autenticación o un código de recuperación. Después, tu cuenta solo estará protegida por tu contraseña.",
|
|
180
|
+
"auth.mfa.disable.code": "Código de la app de autenticación o código de recuperación",
|
|
181
|
+
"auth.mfa.disable.confirm": "Desactivar",
|
|
182
|
+
"auth.mfa.disable.cancel": "Cancelar",
|
|
183
|
+
"auth.mfa.disable.trigger": "Desactivar la verificación en dos pasos",
|
|
184
|
+
"auth.mfa.regenerate.title": "Generar nuevos códigos de recuperación",
|
|
185
|
+
"auth.mfa.regenerate.description":
|
|
186
|
+
"Confirma con un código de tu app de autenticación. Todos los códigos de recuperación anteriores dejarán de funcionar de inmediato.",
|
|
187
|
+
"auth.mfa.regenerate.code": "Código de la app de autenticación",
|
|
188
|
+
"auth.mfa.regenerate.confirm": "Generar de nuevo",
|
|
189
|
+
"auth.mfa.regenerate.cancel": "Cancelar",
|
|
190
|
+
"auth.mfa.regenerate.trigger": "Generar nuevos códigos de recuperación",
|
|
191
|
+
"auth.mfa.regenerate.newCodesTitle": "Tus nuevos códigos de recuperación",
|
|
192
|
+
"auth.mfa.regenerate.newCodesHint":
|
|
193
|
+
"Guarda estos códigos en un lugar seguro. Los códigos antiguos dejan de funcionar de inmediato.",
|
|
194
|
+
"auth.mfa.regenerate.acknowledge": "He guardado mis nuevos códigos de recuperación.",
|
|
195
|
+
"auth.mfa.regenerate.done": "Listo",
|
|
196
|
+
},
|
|
134
197
|
};
|
|
135
198
|
|
|
136
199
|
export { mergeTranslations } from "@cosmicdrift/kumiko-renderer";
|
package/src/cap-counter/i18n.ts
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
|
-
type LocalizedString = { readonly de: string; readonly en: string };
|
|
1
|
+
type LocalizedString = { readonly de: string; readonly en: string; readonly es: string };
|
|
2
2
|
|
|
3
3
|
export const CAP_COUNTER_I18N: Readonly<Record<string, LocalizedString>> = {
|
|
4
|
-
"screen:cap-list.title": { de: "Nutzungslimits", en: "Usage caps" },
|
|
5
|
-
"cap-counter:entity:cap-counter:field:capName": { de: "Limit", en: "Cap" },
|
|
6
|
-
"cap-counter:entity:cap-counter:field:value": { de: "Wert", en: "Value" },
|
|
7
|
-
"cap-counter:entity:cap-counter:field:periodStart": {
|
|
4
|
+
"screen:cap-list.title": { de: "Nutzungslimits", en: "Usage caps", es: "Límites de uso" },
|
|
5
|
+
"cap-counter:entity:cap-counter:field:capName": { de: "Limit", en: "Cap", es: "Límite" },
|
|
6
|
+
"cap-counter:entity:cap-counter:field:value": { de: "Wert", en: "Value", es: "Valor" },
|
|
7
|
+
"cap-counter:entity:cap-counter:field:periodStart": {
|
|
8
|
+
de: "Periodenstart",
|
|
9
|
+
en: "Period start",
|
|
10
|
+
es: "Inicio del período",
|
|
11
|
+
},
|
|
8
12
|
"cap-counter:entity:cap-counter:field:lastSoftWarnedAt": {
|
|
9
13
|
de: "Letzte Soft-Warnung",
|
|
10
14
|
en: "Last soft warning",
|
|
15
|
+
es: "Última advertencia suave",
|
|
11
16
|
},
|
|
12
17
|
};
|
|
@@ -1,6 +1,14 @@
|
|
|
1
|
-
type LocalizedString = { readonly de: string; readonly en: string };
|
|
1
|
+
type LocalizedString = { readonly de: string; readonly en: string; readonly es: string };
|
|
2
2
|
|
|
3
3
|
export const COMPLIANCE_PROFILES_I18N: Readonly<Record<string, LocalizedString>> = {
|
|
4
|
-
"screen:profile-picker.title": {
|
|
5
|
-
|
|
4
|
+
"screen:profile-picker.title": {
|
|
5
|
+
de: "Compliance-Profil",
|
|
6
|
+
en: "Compliance profile",
|
|
7
|
+
es: "Perfil de cumplimiento",
|
|
8
|
+
},
|
|
9
|
+
"compliance-profiles:nav.profilePicker": {
|
|
10
|
+
de: "Compliance",
|
|
11
|
+
en: "Compliance",
|
|
12
|
+
es: "Cumplimiento",
|
|
13
|
+
},
|
|
6
14
|
};
|
|
@@ -22,4 +22,14 @@ export const defaultTranslations: TranslationsByLocale = {
|
|
|
22
22
|
"compliance.profile.catalog": "Available profiles",
|
|
23
23
|
"compliance-profiles:nav.profilePicker": "Compliance",
|
|
24
24
|
},
|
|
25
|
+
es: {
|
|
26
|
+
"compliance.profile.title": "Perfil de cumplimiento",
|
|
27
|
+
"compliance.profile.loading": "Cargando perfiles de cumplimiento…",
|
|
28
|
+
"compliance.profile.current": "Actual",
|
|
29
|
+
"compliance.profile.select": "Perfil",
|
|
30
|
+
"compliance.profile.save": "Guardar perfil",
|
|
31
|
+
"compliance.profile.saving": "Guardando…",
|
|
32
|
+
"compliance.profile.catalog": "Perfiles disponibles",
|
|
33
|
+
"compliance-profiles:nav.profilePicker": "Cumplimiento",
|
|
34
|
+
},
|
|
25
35
|
};
|
package/src/config/i18n.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
type LocalizedString = { readonly de: string; readonly en: string };
|
|
1
|
+
type LocalizedString = { readonly de: string; readonly en: string; readonly es: string };
|
|
2
2
|
|
|
3
3
|
/** Server boot keys for the auto-generated Settings-Hub (mirrors web/i18n.ts). */
|
|
4
4
|
export const CONFIG_FEATURE_I18N: Readonly<Record<string, LocalizedString>> = {
|
|
5
|
-
"config.settings.title": { de: "Einstellungen", en: "Settings" },
|
|
6
|
-
"config.settings.system": { de: "Plattform", en: "Platform" },
|
|
7
|
-
"config.settings.tenant": { de: "Organisation", en: "Organization" },
|
|
8
|
-
"config.settings.user": { de: "Persönlich", en: "Personal" },
|
|
5
|
+
"config.settings.title": { de: "Einstellungen", en: "Settings", es: "Ajustes" },
|
|
6
|
+
"config.settings.system": { de: "Plattform", en: "Platform", es: "Plataforma" },
|
|
7
|
+
"config.settings.tenant": { de: "Organisation", en: "Organization", es: "Organización" },
|
|
8
|
+
"config.settings.user": { de: "Persönlich", en: "Personal", es: "Personal" },
|
|
9
9
|
};
|
package/src/config/web/i18n.ts
CHANGED
|
@@ -28,4 +28,13 @@ export const defaultTranslations: TranslationsByLocale = {
|
|
|
28
28
|
"config.errors.invalidScope": "This scope is not allowed for this key.",
|
|
29
29
|
"config.errors.unknownKey": "Unknown configuration key.",
|
|
30
30
|
},
|
|
31
|
+
es: {
|
|
32
|
+
"config.settings.title": "Ajustes",
|
|
33
|
+
"config.settings.system": "Plataforma",
|
|
34
|
+
"config.settings.tenant": "Organización",
|
|
35
|
+
"config.settings.user": "Personal",
|
|
36
|
+
"config.errors.systemOnly": "Este valor solo puede establecerlo el sistema.",
|
|
37
|
+
"config.errors.invalidScope": "Este nivel no está permitido para esta clave.",
|
|
38
|
+
"config.errors.unknownKey": "Clave de configuración desconocida.",
|
|
39
|
+
},
|
|
31
40
|
};
|
|
@@ -27,4 +27,13 @@ export const defaultTranslations: TranslationsByLocale = {
|
|
|
27
27
|
"custom-fields.form.saving": "Saving…",
|
|
28
28
|
"custom-fields.errors.saveFailed": "Save failed.",
|
|
29
29
|
},
|
|
30
|
+
es: {
|
|
31
|
+
"custom-fields.form.createMode":
|
|
32
|
+
"Guarda primero la entrada para poder definir los campos personalizados.",
|
|
33
|
+
"custom-fields.form.loading": "Cargando…",
|
|
34
|
+
"custom-fields.form.empty": 'No hay campos personalizados definidos para "{entityName}".',
|
|
35
|
+
"custom-fields.form.save": "Guardar campos personalizados",
|
|
36
|
+
"custom-fields.form.saving": "Guardando…",
|
|
37
|
+
"custom-fields.errors.saveFailed": "Error al guardar.",
|
|
38
|
+
},
|
|
30
39
|
};
|
package/src/delivery/i18n.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
type LocalizedString = { readonly de: string; readonly en: string };
|
|
1
|
+
type LocalizedString = { readonly de: string; readonly en: string; readonly es: string };
|
|
2
2
|
|
|
3
3
|
export const DELIVERY_I18N: Readonly<Record<string, LocalizedString>> = {
|
|
4
|
-
"screen:delivery-log.title": {
|
|
5
|
-
|
|
4
|
+
"screen:delivery-log.title": {
|
|
5
|
+
de: "Delivery-Log",
|
|
6
|
+
en: "Delivery log",
|
|
7
|
+
es: "Registro de entregas",
|
|
8
|
+
},
|
|
9
|
+
"delivery:nav.deliveryLog": { de: "Zustellungen", en: "Delivery", es: "Entregas" },
|
|
6
10
|
};
|
package/src/delivery/web/i18n.ts
CHANGED
|
@@ -22,4 +22,14 @@ export const defaultTranslations: TranslationsByLocale = {
|
|
|
22
22
|
"delivery.log.col.status": "Status",
|
|
23
23
|
"delivery:nav.deliveryLog": "Delivery",
|
|
24
24
|
},
|
|
25
|
+
es: {
|
|
26
|
+
"delivery.log.title": "Registro de entregas",
|
|
27
|
+
"delivery.log.loading": "Cargando intentos de entrega…",
|
|
28
|
+
"delivery.log.empty": "No hay intentos de entrega.",
|
|
29
|
+
"delivery.log.col.type": "Tipo",
|
|
30
|
+
"delivery.log.col.channel": "Canal",
|
|
31
|
+
"delivery.log.col.recipient": "Destinatario",
|
|
32
|
+
"delivery.log.col.status": "Estado",
|
|
33
|
+
"delivery:nav.deliveryLog": "Entregas",
|
|
34
|
+
},
|
|
25
35
|
};
|
|
@@ -1,6 +1,14 @@
|
|
|
1
|
-
type LocalizedString = { readonly de: string; readonly en: string };
|
|
1
|
+
type LocalizedString = { readonly de: string; readonly en: string; readonly es: string };
|
|
2
2
|
|
|
3
3
|
export const FEATURE_TOGGLES_I18N: Readonly<Record<string, LocalizedString>> = {
|
|
4
|
-
"screen:toggle-admin.title": {
|
|
5
|
-
|
|
4
|
+
"screen:toggle-admin.title": {
|
|
5
|
+
de: "Feature-Toggles",
|
|
6
|
+
en: "Feature toggles",
|
|
7
|
+
es: "Feature toggles",
|
|
8
|
+
},
|
|
9
|
+
"feature-toggles:nav.toggleAdmin": {
|
|
10
|
+
de: "Feature-Toggles",
|
|
11
|
+
en: "Feature toggles",
|
|
12
|
+
es: "Feature toggles",
|
|
13
|
+
},
|
|
6
14
|
};
|
|
@@ -26,4 +26,16 @@ export const defaultTranslations: TranslationsByLocale = {
|
|
|
26
26
|
"feature-toggles.admin.alwaysOn": "always on",
|
|
27
27
|
"feature-toggles:nav.toggleAdmin": "Feature toggles",
|
|
28
28
|
},
|
|
29
|
+
es: {
|
|
30
|
+
"feature-toggles.admin.title": "Feature toggles",
|
|
31
|
+
"feature-toggles.admin.loading": "Cargando Feature toggles…",
|
|
32
|
+
"feature-toggles.admin.col.feature": "Función",
|
|
33
|
+
"feature-toggles.admin.col.default": "Default",
|
|
34
|
+
"feature-toggles.admin.col.override": "Override",
|
|
35
|
+
"feature-toggles.admin.col.effective": "Efectivo",
|
|
36
|
+
"feature-toggles.admin.toggle": "Alternar",
|
|
37
|
+
"feature-toggles.admin.saving": "Guardando…",
|
|
38
|
+
"feature-toggles.admin.alwaysOn": "siempre activado",
|
|
39
|
+
"feature-toggles:nav.toggleAdmin": "Feature toggles",
|
|
40
|
+
},
|
|
29
41
|
};
|
package/src/folders/web/i18n.ts
CHANGED
|
@@ -56,4 +56,29 @@ export const defaultTranslations: TranslationsByLocale = {
|
|
|
56
56
|
"folders.manager.deleteConfirmBody":
|
|
57
57
|
"The folder will be removed. Filed entries move back to Unfiled.",
|
|
58
58
|
},
|
|
59
|
+
es: {
|
|
60
|
+
"folders.section.createMode": "Guarda primero la entrada para elegir una carpeta.",
|
|
61
|
+
"folders.section.loading": "Cargando…",
|
|
62
|
+
"folders.section.label": "Carpeta",
|
|
63
|
+
"folders.section.placeholder": "Selecciona una carpeta…",
|
|
64
|
+
"folders.section.empty": "No se encontraron carpetas.",
|
|
65
|
+
"folders.section.none": "— Sin carpeta —",
|
|
66
|
+
"folders.section.newLabel": "Nueva carpeta",
|
|
67
|
+
"folders.section.create": "Crear carpeta y archivar",
|
|
68
|
+
"folders.section.working": "Guardando…",
|
|
69
|
+
|
|
70
|
+
"folders.manager.loading": "Cargando…",
|
|
71
|
+
"folders.manager.newRoot": "Nueva carpeta",
|
|
72
|
+
"folders.manager.add": "Crear",
|
|
73
|
+
"folders.manager.addChild": "Subcarpeta",
|
|
74
|
+
"folders.manager.rename": "Renombrar",
|
|
75
|
+
"folders.manager.delete": "Eliminar",
|
|
76
|
+
"folders.manager.save": "Guardar",
|
|
77
|
+
"folders.manager.cancel": "Cancelar",
|
|
78
|
+
"folders.manager.working": "Guardando…",
|
|
79
|
+
"folders.manager.deleteBlocked": "Elimina antes las subcarpetas.",
|
|
80
|
+
"folders.manager.deleteConfirmTitle": "¿Eliminar la carpeta?",
|
|
81
|
+
"folders.manager.deleteConfirmBody":
|
|
82
|
+
"La carpeta se eliminará. Las entradas archivadas volverán a Sin archivar.",
|
|
83
|
+
},
|
|
59
84
|
};
|