Initial commit of Descrybe v2 without local scratch artifacts.

Drop one-shot tmp/axe scripts and agent i18n scratch so the Gitea tree is deployable.
This commit is contained in:
2026-08-09 22:47:43 +02:00
commit 8580c996c3
1285 changed files with 325780 additions and 0 deletions
+238
View File
@@ -0,0 +1,238 @@
/** Supplemental UI strings merged into gen-locale-packs.mjs (auth/settings/dashboard extras). */
export const EXTRA = {
es: {
"common.askAdmin": "Pregunta a un administrador de la empresa",
"common.you": "Tú",
"common.active": "Activo",
"common.pending": "Pendiente",
"common.email": "Correo electrónico",
"common.password": "Contraseña",
"common.name": "Tu nombre",
"common.viewPricing": "Ver precios",
"common.backToSignIn": "Volver a iniciar sesión",
"common.signingOut": "Cerrando sesión…",
"common.signOutAndContinue": "Cerrar sesión y continuar",
"common.staySignedIn": "Seguir conectado",
"nav.section.feeds": "Feeds",
"nav.section.marketing": "Marketing",
"nav.feeds": "Feeds",
"nav.seo": "SEO",
"nav.admin": "Admin",
"auth.login.title": "Iniciar sesión",
"auth.login.description": "Usa tu correo y contraseña de Descrybe.",
"auth.login.submit": "Iniciar sesión",
"auth.login.submitting": "Iniciando sesión…",
"auth.login.failed": "Error al iniciar sesión",
"auth.login.passwordNotSet":
"Esta cuenta aún necesita una contraseña. Abre el enlace de invitación o pide a un administrador que emita uno nuevo.",
"auth.login.setPasswordFirstTitle": "Establece la contraseña primero:",
"auth.login.setPasswordFirstBody":
"usa el enlace de invitación de tu correo. Si el enlace fue a una dirección antigua (cambio de correo), pide a un administrador de la empresa que emita una nueva invitación para establecer contraseña a {email}.",
"auth.login.yourEmail": "tu correo",
"auth.login.platformAdminsReissue": "Los administradores de plataforma pueden reemitir desde",
"auth.login.adminUsersLink": "Admin → Usuarios",
"auth.login.haveToken": "¿Tienes un token? Abrir aceptar invitación",
"auth.login.noAccount": "¿Sin cuenta?",
"auth.login.createCompany": "Crear empresa",
"auth.login.haveInvite": "¿Tienes una invitación o un enlace para establecer contraseña?",
"auth.login.acceptInvite": "Aceptar invitación",
"auth.register.title": "Crear empresa",
"auth.register.description": "Registra una empresa y su usuario administrador.",
"auth.register.companyName": "Nombre de la empresa",
"auth.register.submit": "Crear cuenta",
"auth.register.submitting": "Creando…",
"auth.register.failed": "Error en el registro",
"auth.register.haveAccount": "¿Ya tienes una cuenta?",
"auth.register.signIn": "Iniciar sesión",
"auth.invite.title": "Aceptar invitación",
"auth.invite.setPasswordTitle": "Establecer contraseña",
"auth.invite.description":
"Establece tu contraseña para unirte a la empresa. Tu administrador asignó Miembro (trabajo diario) o Admin (equipo y facturación).",
"auth.invite.setPasswordDescription":
"Elige una contraseña para tu cuenta Descrybe migrada (al menos 8 caracteres).",
"auth.invite.checking": "Comprobando invitación…",
"auth.invite.forEmail": "Invitación para {email}.",
"auth.invite.linkRecognized":
"Enlace de invitación reconocido. Introduce una contraseña abajo para continuar — el secreto no se muestra en esta página.",
"auth.invite.resetLinkRecognized":
"Enlace de restablecimiento reconocido. Introduce una contraseña abajo para continuar — el secreto no se muestra en esta página.",
"auth.invite.tokenLabel": "Token de invitación",
"auth.invite.resetTokenLabel": "Token de restablecimiento",
"auth.invite.tokenHelp":
"Pega el token del correo de invitación. Se muestra enmascarado en este campo.",
"auth.invite.passwordHint": "Al menos 8 caracteres. Sin otras reglas de complejidad.",
"auth.invite.submit": "Aceptar invitación",
"auth.invite.setPasswordSubmit": "Establecer contraseña",
"auth.invite.accepting": "Aceptando…",
"auth.invite.saving": "Guardando…",
"auth.invite.verifyFailed": "No se pudo verificar la invitación",
"auth.invite.verifySetPasswordFailed":
"No se pudo verificar el enlace para establecer contraseña",
"auth.invite.acceptFailed": "No se pudo aceptar la invitación",
"auth.invite.setPasswordFailed": "No se pudo establecer la contraseña",
"auth.invite.expired":
"Esta invitación no es válida o ha caducado. Pide a tu administrador de la empresa que envíe una nueva invitación y abre el nuevo enlace (o pega el nuevo token abajo).",
"auth.invite.setPasswordExpired":
"Este enlace para establecer contraseña no es válido o ha caducado. Pide a un administrador de la empresa o de la plataforma que lo reemita y abre el nuevo enlace (o pega el nuevo token abajo).",
"auth.invite.emailMismatchDefault":
"Has iniciado sesión con un correo distinto al de esta invitación.",
"auth.invite.expiredFooter":
"¿Enlace caducado? Pide a un administrador que lo reemita — no hay API de reenvío autoservicio. Administradores de plataforma:",
"auth.invite.adminUsersLink": "Admin → Usuarios",
"auth.invite.doneTitle": "Ya formas parte del equipo",
"auth.invite.doneSetPasswordTitle": "Contraseña guardada",
"auth.invite.doneDescription":
"Tu cuenta está lista. A continuación, abre el panel para trabajar con feeds y productos, o revisa la configuración de la empresa.",
"auth.invite.doneSetPasswordDescription":
"Inicia sesión con tu correo y la nueva contraseña para abrir tu espacio de trabajo.",
"auth.invite.openDashboard": "Abrir panel",
"auth.invite.companySettings": "Configuración de la empresa",
"auth.invite.goToSignIn": "Ir a iniciar sesión",
"auth.invite.afterSignInNote":
"Tras iniciar sesión llegas a tu espacio de trabajo — se omite el recorrido de configuración inicial.",
"auth.invite.mismatchTitle": "Cuenta incorrecta para esta invitación",
"auth.invite.mismatchDescription":
"Este enlace es para un correo distinto al de la sesión actual. Cierra sesión para continuar como el usuario invitado, o permanece conectado y pide a un administrador que reemita la invitación.",
"auth.invite.mismatchDetail":
"Sesión iniciada como {session}, pero esta invitación es para {invite}.",
"auth.invite.mismatchFallback": "El correo de la sesión no coincide con esta invitación.",
"auth.invite.switchAccountTitle": "Cambiar de cuenta:",
"auth.invite.switchAccountBody":
"cierra sesión y completa este formulario con el correo invitado{emailSuffix}.",
"auth.invite.reissueTitle": "Vía de reemisión:",
"auth.invite.reissueBody":
"si cambió tu correo real de acceso (desfase de correo), pide a un administrador de la empresa que revoque esta invitación y envíe una nueva al correo con el que inicias sesión. Los administradores de plataforma también pueden reemitir enlaces para establecer contraseña desde Admin → Usuarios.",
"settings.accessDenied":
"No tienes permiso para abrir la configuración de la empresa. Pide ayuda a un administrador de la empresa.",
"settings.profileHeading": "Perfil",
"settings.personalInfo": "Información personal",
"settings.personalInfoHelp": "Actualiza tus datos personales",
"settings.firstName": "Nombre",
"settings.firstNamePlaceholder": "Tu nombre",
"settings.lastName": "Apellidos",
"settings.lastNamePlaceholder": "Tus apellidos",
"settings.email": "Correo electrónico",
"settings.profileUpdated": "Perfil actualizado.",
"settings.profileUpdateFailed": "No se pudo actualizar el perfil",
"settings.role.member": "Miembro",
"settings.role.admin": "Admin",
"settings.teamHeading": "Miembros del equipo",
"settings.inviteUser": "Invitar usuario",
"settings.teamAdminOnly":
"Solo los administradores de la empresa pueden invitar, ascender, degradar o eliminar compañeros.",
"settings.shareAcceptLink": "Compartir enlace de aceptación",
"settings.shareAcceptLinkHelp":
"El correo saliente no está configurado. Copia este enlace de un solo uso y envíaselo al invitado. Establecerá una contraseña (al menos 8 caracteres) y se unirá con el rol que elegiste.",
"settings.acceptLinkLabel": "Enlace de aceptación de invitación de un solo uso",
"settings.copyLink": "Copiar enlace",
"settings.linkCopied": "Enlace de aceptación copiado.",
"settings.table.email": "Correo electrónico",
"settings.table.role": "Rol",
"settings.table.status": "Estado",
"settings.table.joined": "Alta / caduca",
"settings.table.actions": "Acciones",
"settings.teamForbidden":
"No tienes permiso para ver la lista del equipo. Pide ayuda a un administrador de la empresa.",
"settings.noTeammates": "Aún no hay compañeros",
"settings.noTeammatesHelp":
"Invita a colegas como Miembro (productos y feeds) o Admin (equipo y configuración de la empresa). Las invitaciones pendientes aparecen aquí hasta que se acepten.",
"settings.noTeammatesMemberHelp":
"Aún no hay compañeros en la lista. Pide a un administrador de la empresa que envíe invitaciones.",
"settings.memberActions": "Acciones del miembro",
"settings.makeAdmin": "Hacer admin",
"settings.makeMember": "Hacer miembro",
"settings.removeMember": "Eliminar",
"settings.revokeInvite": "Revocar invitación",
"settings.needOneAdmin": "Las empresas necesitan al menos un administrador",
"settings.expires": "Caduca el {date}",
"settings.invalidEmail": "Introduce una dirección de correo válida.",
"settings.inviteCreatedNoMail":
"Invitación creada para {email} como {role}. Copia el enlace de aceptación abajo y compártelo — el correo saliente no está configurado.",
"settings.inviteSent":
"Invitación enviada a {email} como {role}. Debe abrir el correo y aceptar antes de que caduque.",
"settings.inviteFailed": "No se pudo enviar la invitación",
"settings.revokeConfirm": "¿Revocar esta invitación?",
"settings.revoked": "Invitación revocada.",
"settings.revokeFailed": "No se pudo revocar la invitación",
"settings.removeConfirm": "¿Eliminar a {email} de esta empresa?",
"settings.memberRemoved": "{email} eliminado.",
"settings.removeFailed": "No se pudo eliminar al usuario",
"settings.roleChangeConfirm": "¿{action} a {email} a {role}?",
"settings.roleChanged": "{email} ahora es {role}.",
"settings.roleChangeFailed": "No se pudo actualizar el rol",
"settings.promote": "Ascender",
"settings.demote": "Degradar",
"settings.inviteTitle": "Invitar compañero",
"settings.inviteDescription":
"Recibirá un enlace para establecer una contraseña (al menos 8 caracteres) y unirse a esta empresa.",
"settings.inviteEmail": "Correo electrónico",
"settings.inviteEmailPlaceholder": "colega@ejemplo.com",
"settings.inviteRole": "Rol",
"settings.inviteRoleHint":
"Los miembros gestionan productos y feeds. Los administradores también pueden invitar compañeros y cambiar la configuración de la empresa.",
"settings.sendInvite": "Enviar invitación",
"dashboard.demoEmptyHint":
"La zona de pruebas demo está vacía — cambia a A1 o conecta un feed para ver estadísticas reales del catálogo.",
"dashboard.workflowHint": "Importar → enriquecer → publicar. Salta al siguiente paso para {name}.",
"dashboard.overviewHint": "Totales en vivo para {name}",
"dashboard.demoEmptyMessage":
"Cambia a A1 (u otra empresa con datos) en el encabezado, o conecta un feed aquí para poblar esta zona de pruebas.",
"dashboard.emptyTitle": "Aún no hay datos de catálogo",
"dashboard.emptyMessage": "Conecta un feed o sube un CSV para empezar a crear tu catálogo.",
"dashboard.connectFeedAnyway": "Conectar feed de todos modos",
"dashboard.connectFeedShort": "Conectar feed",
"dashboard.uploadCsv": "Subir CSV",
"dashboard.goToBilling": "Ir a Facturación",
"dashboard.freePlanTitle": "Estás en el plan Free",
"dashboard.freePlanMessageWithLimit":
"{used} de {max} productos usados. El mapeo de feeds, la limpieza básica y las etiquetas energéticas de la UE (EPREL) están incluidos; actualiza para títulos y descripciones con IA, y más capacidad.",
"dashboard.freePlanMessage":
"El mapeo de feeds, la limpieza básica y las etiquetas energéticas de la UE (EPREL) están incluidos; actualiza para títulos y descripciones con IA, y más capacidad.",
"dashboard.outOfCreditsTitle": "Te has quedado sin créditos de IA",
"dashboard.outOfCreditsMessage":
"Compra más créditos o actualiza tu plan para seguir procesando.",
"dashboard.productLimitTitle": "Límite de productos alcanzado",
"dashboard.productLimitMessage":
"Tu plan {plan} permite {max} productos ({count} en el catálogo). Actualiza para procesar más.",
"dashboard.productLimitMessageFull":
"Se alcanzó el límite de productos de tu plan {plan}. Actualiza para procesar más.",
"dashboard.comparePlans": "Comparar planes",
"dashboard.viewPlans": "Ver planes",
"dashboard.trialTitle": "Prueba · {plan}",
"dashboard.trialMessageDated": "La prueba termina el {date}. {credits} créditos restantes.",
"dashboard.trialMessage": "{credits} créditos restantes en tu prueba.",
"dashboard.lowCreditsTitle": "Créditos bajos",
"dashboard.lowCreditsMessage":
"Quedan {remaining} de {total} créditos. Recarga o actualiza antes de que se detengan los trabajos.",
"dashboard.latestJobs": "Últimos trabajos de procesamiento",
"dashboard.noJobsEmpty": "Aún no hay trabajos — importa productos primero.",
"dashboard.noJobsReady": "No hay trabajos recientes. Inicia uno desde Productos cuando estés listo.",
"dashboard.startJob": "Iniciar un trabajo",
"dashboard.quickLinksHint": "Feeds, productos, trabajos y exportación.",
"dashboard.feedsImportMap": "Importar y mapear",
"dashboard.productsBrowse": "Explorar y procesar",
"dashboard.jobsMonitor": "Supervisar tareas",
"dashboard.exportsTemplates": "Plantillas y descarga",
"activation.step.enable-fields.title": "Activar campos",
"activation.step.enable-fields.body":
"Activa las columnas de producto estándar que Descrybe mapea y procesa.",
"activation.step.connect-source.title": "Añadir o conectar un origen",
"activation.step.connect-source.body":
"Añade un feed CSV/XML o conecta una tienda para que entren productos.",
"activation.step.map.title": "Mapear campos de origen",
"activation.step.map.body":
"Asocia las columnas del proveedor a los campos de Descrybe y guarda el mapeo.",
"activation.step.sync-sample.title": "Sincronizar una muestra",
"activation.step.sync-sample.body":
"Extrae una muestra pequeña para verificar el mapeo antes de una ejecución completa.",
"activation.step.process.title": "Procesar productos",
"activation.step.process.body":
"Ejecuta el procesamiento sobre productos sincronizados para generar contenido de catálogo limpio.",
"activation.step.export.title": "Exportar",
"activation.step.export.body":
"Crea un feed de exportación para publicar productos limpios como XML o CSV.",
"stats.feeds": "Feeds",
"processing.step.eprel": "EPREL",
"toast.support.replyRe": "Re: {subject}"
}
};