{
"forms": {
"upload_dir_error": "Error al crear el directorio de subida",
"file_create_error": "Error al crear el archivo",
"multipart_stream_error": "Error en el stream multipart",
"file_write_error": "Error al escribir el archivo",
"required": "Este campo es obligatorio",
"too_short": "Demasiado corto (mín {})",
"too_long": "Demasiado largo (máx {})",
"email_invalid": "Formato de dirección de correo electrónico no válido",
"url_invalid": "Por favor introduce una URL válida",
"phone_invalid": "Número de teléfono inválido (dígitos, +, espacios, guiones, 7-15 dígitos)",
"hash_error": "Error de hash: {}",
"password_empty": "La contraseña no puede estar vacía",
"filter_invalid_value": "El filtro static/media recibió un valor no válido ({}) en lugar de una ruta de archivo.",
"number_invalid": "Número no válido",
"number_required": "Requerido",
"integer_required": "Debe ser un número entero",
"decimal_required": "Debe estar en formato decimal",
"min_value": "Mín {} requerido",
"max_value": "Máx {} superado",
"precision_max": "Precisión máxima {} dígitos después de la coma",
"precision_min": "Precisión mínima {} dígitos después de la coma",
"color_invalid": "Color no válido (formato: #RRGGBB o #RGB)",
"color_no_hash": "El color debe comenzar con #",
"color_bad_hex": "Contiene caracteres no hexadecimales",
"slug_invalid": "Slug no válido",
"slug_no_dash": "El slug no debe comenzar ni terminar con un guion",
"uuid_invalid": "Formato UUID no válido (esperado: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)",
"json_invalid": "JSON no válido: {}",
"ipv4_only": "Solo se aceptan direcciones IPv4",
"ipv6_only": "Solo se aceptan direcciones IPv6",
"ip_invalid": "Dirección IP no válida",
"date_invalid": "Formato de fecha no válido",
"date_too_old": "Demasiado antiguo (mín: {})",
"date_too_far": "Demasiado lejano (máx: {})",
"time_invalid": "Formato de hora no válido",
"file_required": "Por favor selecciona al menos un archivo",
"file_extension_blocked": "Archivo '{}' no permitido. Extensiones: {}",
"finalize_error": "Error al finalizar el campo '{}': {}",
"template_missing": "Plantilla faltante: {}",
"render_js_error": "Error al renderizar JS: {}",
"tera_not_configured": "Tera no configurado",
"config_not_found": "Configuración no encontrada en las extensiones",
"hint_slug": "Formato: letras-números-guiones",
"hint_uuid": "Formato: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"hint_json": "Se requiere un formato JSON válido",
"hint_ip_v4": "Formato IPv4: 192.168.1.1",
"hint_ip_v6": "Formato IPv6: 2001:0db8:85a3::8a2e:0370:7334",
"hint_ip": "Formato IPv4 o IPv6",
"validation_overflow": "Stack overflow detectado: recursión infinita en la validación",
"choice_invalid": "Opción no válida",
"choice_invalid_value": "Opción no válida: {}",
"select_required": "Por favor selecciona una opción",
"checkbox_required": "Por favor selecciona al menos una opción",
"multipart_error": "Error multipart",
"body_error": "Error al leer el body",
"aegis_query_error": "Error al analizar la query string: {}",
"aegis_urlencoded_error": "Error al analizar el body urlencoded: {}",
"aegis_json_error": "Error al analizar el body JSON: {}",
"auth_required": "Autenticación requerida",
"role_insufficient": "Rol insuficiente",
"time_too_old": "Demasiado temprano (mín: {})",
"time_too_far": "Demasiado tarde (máx: {})",
"datetime_too_old": "Demasiado temprano (mín: {})",
"datetime_too_far": "Demasiado tarde (máx: {})",
"duration_invalid": "Duración no válida (se espera número de segundos)",
"duration_too_short": "Duración mínima: {} segundos",
"duration_too_long": "Duración máxima: {} segundos",
"file_max_count": "Máximo {} archivos permitidos",
"file_too_large": "Archivo '{}' demasiado grande ({}MB > {}MB máx)",
"file_invalid_image": "El archivo '{}' no es una imagen válida",
"image_too_wide": "La imagen '{}' es demasiado ancha ({}px > {}px)",
"image_too_tall": "La imagen '{}' es demasiado alta ({}px > {}px)",
"boolean_required": "Debes aceptar este campo",
"slug_unicode_invalid": "Solo se permiten letras, números, guiones y guiones bajos",
"unique_field_taken": "Este {} ya está en uso.",
"unique_value_taken": "El valor del campo '{}' ya está en uso.",
"unique_constraint_violated": "Se ha violado una restricción de unicidad.",
"db_error": "Error de base de datos: {}",
"text_field_too_large": "Campo de texto demasiado grande (max 1 MB)",
"upload_too_large": "Archivo demasiado grande (max {}MB)"
},
"csrf": {
"missing": "Token CSRF faltante",
"invalid": "Token CSRF no válido",
"invalid_or_missing": "Token CSRF no válido o faltante",
"forbidden": "Token CSRF no válido",
"session_write_error": "Error de escritura de sesión"
},
"error": {
"source": "Fuente: {}",
"AppError": "Error de aplicación",
"build": "Error de compilación: {}",
"internal": "Error interno",
"forbidden": "Acceso prohibido",
"not_found": "Recurso no encontrado",
"validation": "Error de validación: {}",
"database": "Error de base de datos: {}",
"io": "Error IO: {}",
"template": "Error de plantilla: {}",
"custom": "Error personalizado: {}",
"title": {
"not_found": "Página no encontrada",
"forbidden": "Acceso prohibido",
"validation": "Error de validación",
"database": "Error de base de datos",
"template": "Error de renderizado de plantilla",
"internal": "Error interno del servidor"
},
"path_not_found": "La ruta solicitada '{}' no fue encontrada",
"internal_occurred": "Ocurrió un error interno",
"context_occurred": "Error AppError ocurrido"
},
"title": {
"template": "Error de plantilla en '{}'"
},
"build": {
"subscriber_already_installed": "Ya hay un subscriber de tracing instalado; la configuración de log de Runique está inactiva (RUST_LOG / with_log no tienen efecto)",
"external_outputs_ignored": "`with_log(|l| l.external())` está definido; las salidas de log configuradas se ignoran (la aplicación posee el subscriber)",
"validation_failed": "La validación del build falló: {}",
"check_failed": "El build falló con {} error(es) de verificación",
"template_failed": "La carga de la plantilla falló: {}",
"db_missing": "Se requiere conexión a la base de datos cuando la feature 'orm' está activada",
"component_not_ready": "El componente '{}' no está listo"
},
"server": {
"operational": "Runique está operativo",
"launched": "Servidor iniciado en {}",
"connected_db": "Conectado a la base de datos {} -> {}",
"stop_hint": "ctrl + c para detener",
"shutting_down": "Deteniendo el servidor Runique...",
"acme_not_compiled": "ACME_ENABLED=true pero la feature `acme` no está compilada.",
"acme_add_feature": "Añade la feature `acme` a tu Cargo.toml."
},
"middleware": {
"bad_request": "Solicitud incorrecta",
"slot_collision": "Colisión de slot de middleware Runique: '{}' y '{}' reclaman ambos el slot {}. Registre menos middlewares personalizados o asigne a este un slot explícito."
},
"html": {
"404_title": "404",
"404_text": "Página no encontrada",
"500_title": "500",
"500_text": "Error interno del servidor",
"500_notice": "Nuestro equipo ha sido notificado y está trabajando en el problema.",
"429_title": "429",
"429_text": "Demasiadas solicitudes. Por favor espere un momento antes de intentarlo de nuevo.",
"503_title": "503",
"503_text": "Servicio temporalmente no disponible por sobrecarga. Por favor inténtelo de nuevo en breve.",
"back_home": "Volver al inicio",
"critical_error_title": "Error crítico",
"critical_error_text": "El sistema de gestión de errores ha encontrado un error.",
"critical_error_contact": "Esta situación no debería ocurrir nunca. Por favor contacta al administrador del sistema."
},
"debug": {
"stack_trace_title": "Traza de error detallada",
"stack_trace_tip": "El error más alto (nivel 0) suele ser la causa raíz. Los errores siguientes muestran cómo se propagó el error en el código."
},
"flash": {
"welcome": "Bienvenido {}, ¡tu cuenta ha sido creada!",
"fix_errors": "Por favor corrige los errores",
"success_demo": "Este es un mensaje de éxito.",
"info_demo": "Este es un mensaje informativo.",
"warning_demo": "Este es un mensaje de advertencia.",
"error_demo": "Este es un mensaje de error."
},
"cli": {
"creating_project": "Creando el proyecto '{}'...",
"admin_detected": "Admin detectado → generando código admin",
"add_admin_hint": "Añade .with_admin(...) en tu builder para activar el panel de administración.",
"daemon_error": "[Daemon] Error: {}",
"cargo_run_failed": "El servidor de aplicaciones no se inició correctamente (cargo run)",
"file_not_found": "Archivo no encontrado: {}\\nAsegúrate de estar en la raíz de tu proyecto Runique.",
"admin_not_found": "Archivo admin no encontrado: {}\\nCrea src/admin.rs con la macro admin!{}.",
"name_empty": "El nombre del proyecto no puede estar vacío",
"name_invalid": "El nombre del proyecto solo debe contener letras, números, _ o -",
"name_dash": "El nombre del proyecto no puede comenzar con -",
"folder_exists": "La carpeta '{}' ya existe",
"cargo_run_expect": "Error al lanzar cargo run",
"project_created": "¡Proyecto '{}' creado con éxito!",
"getting_started": "Para comenzar:",
"cd_hint": "cd {}",
"cargo_run_hint": "cargo run",
"fmt_failed": "cargo fmt falló — formateo omitido: {}"
},
"daemon": {
"unable_read": "No se puede leer: {}",
"parse_error": "Error de análisis: {}",
"no_resource": "No hay recursos en admin!{} — nada que generar",
"operational": "Daemon operativo → src/admins/admin.rs",
"generation_error": "Error de generación: {}",
"generated_header": "GENERADO AUTOMÁTICAMENTE — NO EDITAR MANUALMENTE",
"generated_notice": "Producido por `runique start` desde src/admin.rs. Cualquier cambio será sobrescrito."
},
"macro": {
"named_fields_only": "Solo structs con campos nombrados",
"structs_only": "Solo funciona en structs",
"forms_field_required": "La struct '{}' debe tener un campo 'Forms'",
"field_no_name": "Campo sin nombre",
"model_form_named_only": "DeriveModelForm: solo structs con campos nombrados",
"model_form_structs_only": "DeriveModelForm: solo structs"
},
"parser": {
"multiple_admin_blocks": "admin!: solo se permite un bloque admin! por archivo (primer bloque en la línea {}, segundo en la línea {}) — fusiónelos",
"title_required": "admin!: 'title' es obligatorio",
"list_display_exclude_exclusive": "admin!: 'list_display' y 'list_exclude' son mutuamente excluyentes"
},
"TemplateMessage": {
"debug_info_title": "Información de depuración",
"debug_field_title": "Título",
"debug_field_count": "Cantidad de campos",
"debug_error_count": "Errores",
"debug_main_message": "Mensaje principal",
"debug_root_cause": "Causa raíz",
"debug_details": "Detalles adicionales",
"debug_request_info": "Información de la solicitud",
"debug_http_method": "Método HTTP",
"debug_path": "Ruta",
"debug_query_params": "Parámetros de consulta",
"debug_http_headers": "Encabezados HTTP",
"debug_template_info": "Información del template",
"debug_template_name": "Nombre del template",
"debug_error_line": "Línea del error",
"debug_template_source": "Código fuente del template",
"debug_available_templates": "Templates disponibles",
"debug_stack_trace_title": "Traza de error detallada",
"debug_stack_trace_tip": "El error superior (nivel 0) suele ser la causa raíz. Los errores siguientes muestran cómo se propagó el error en el código.",
"debug_environment": "Entorno",
"debug_debug_mode": "Modo debug",
"debug_enabled": "Activado",
"debug_disabled": "Desactivado",
"debug_rust_version": "Versión de Rust",
"debug_app_version": "Versión de la app",
"debug_status_code": "Código de estado",
"debug_header_name": "Nombre",
"debug_header_value": "Valor"
},
"admin": {
"group": "Grupo",
"groups": "Grupos",
"resource": "Recurso",
"resources": "Recursos",
"can_create": "Crear",
"can_read": "Leer",
"can_update": "Modificar",
"can_delete": "Eliminar",
"can_update_own": "Modificar",
"can_delete_own": "Eliminar",
"name": "Nombre",
"username": "Nombre de usuario",
"email": "Email",
"staff": "Staff",
"superuser": "Superusuario",
"active": "Activo",
"user": {
"username_too_short": "El nombre de usuario es demasiado corto (min 3 car.)",
"invalid_email": "Formato de dirección de correo electrónico no válido"
},
"login": {
"title": "Inicio de sesión",
"subtitle": "Inicie sesión para acceder al panel de administración",
"label_username": "Nombre de usuario",
"label_password": "Contraseña",
"btn_submit": "Iniciar sesión",
"error_session": "Error al abrir la sesión.",
"error_credentials": "Credenciales incorrectas o permisos insuficientes.",
"error_locked": "Demasiados intentos. Cuenta bloqueada temporalmente. Inténtelo de nuevo en {} segundos."
},
"logout": {
"success": "Sesión cerrada correctamente."
},
"access": {
"no_auth_handler": "No hay ningún controlador de autenticación configurado. Llame a .auth(MyAuth) en AdminConfig.",
"insufficient_rights": "Permisos insuficientes para acceder a la administración"
},
"dashboard": {
"title": "Panel de control",
"subtitle": "Resumen de la aplicación",
"card_resources": "Recursos",
"th_resource": "Recurso",
"th_key": "Clave",
"th_permissions": "Permisos",
"th_actions": "Acciones",
"btn_list": "Lista",
"btn_create": "Crear",
"see_list": "Ver la lista →",
"empty_title": "No hay recursos registrados",
"empty_desc": "Declare sus recursos en src/admin.rs con la macro admin!{{}} y luego ejecute runique start",
"kpi_resources": "Recursos",
"kpi_entries": "Entradas totales",
"kpi_largest": "Mayor",
"th_count": "Entradas"
},
"list": {
"breadcrumb_admin": "Administración",
"entries_count_one": "entrada",
"entries_count_many": "entradas",
"btn_create": "Crear",
"th_id": "id",
"th_actions": "Acciones",
"bool_true": "Sí",
"bool_false": "No",
"btn_detail": "Detalle",
"btn_edit": "Editar",
"btn_delete": "Eliminar",
"confirm_delete": "¿Realmente eliminar?",
"empty_title": "No hay entradas",
"empty_desc": "Comience creando un elemento.",
"btn_create_first": "Crear el primero",
"search_placeholder": "Buscar..."
},
"create": {
"title": "Crear",
"breadcrumb": "Crear",
"card_info": "Información",
"no_fields": "No hay campos disponibles por el momento.",
"btn_cancel": "Cancelar",
"btn_submit": "Crear",
"success": "¡Entrada creada con éxito!"
},
"edit": {
"title": "Editar",
"breadcrumb": "Editar",
"card_info": "Información",
"no_fields": "No hay campos disponibles por el momento.",
"btn_cancel": "Cancelar",
"btn_submit": "Guardar",
"success": "¡Entrada actualizada con éxito!"
},
"detail": {
"title": "Detalle",
"breadcrumb": "Detalle",
"entry_label": "Entrada",
"btn_list": "← Lista",
"btn_edit": "Editar",
"btn_delete": "Eliminar",
"confirm_delete": "¿Eliminar esta entrada?",
"btn_reset_password": "Restablecer contraseña",
"btn_reset_password_short": "Restablecer"
},
"reset_password": {
"btn": "Restablecer contraseña",
"success_email": "Reset link sent to {}.",
"success_link": "Reset link (mailer not configured): {}",
"error_no_email": "No email field found for this user.",
"error_send": "Error sending email: {}",
"email_subject": "Restablece tu contraseña",
"email_title": "Restablecimiento de contraseña",
"email_greeting": "Hola,",
"email_body": "Haz clic en el enlace para restablecer tu contraseña (válido 1 hora):",
"email_btn": "Restablecer mi contraseña",
"email_ignore": "Si no solicitaste este restablecimiento, ignora este mensaje."
},
"user_created": {
"email_subject": "Bienvenido — define tu contraseña",
"email_sent": "Correo de bienvenida enviado a {}.",
"email_greeting": "Bienvenido,",
"email_body": "Se ha creado una cuenta para ti. Haz clic en el enlace para definir tu contraseña:",
"email_btn": "Definir mi contraseña",
"email_validity": "Este enlace es válido por 1 hora. Si no esperabas este mensaje, ignóralo."
},
"delete": {
"title": "Eliminar",
"breadcrumb": "Eliminar",
"heading": "Confirmar eliminación",
"btn_cancel": "← Cancelar",
"btn_confirm": "Sí, eliminar permanentemente",
"warning": {
"title": "¡Advertencia!",
"desc": "Está a punto de eliminar la entrada",
"of": "del recurso",
"irreversible": "Esta acción es irreversible."
},
"success": "¡Entrada eliminada con éxito!",
"not_found": "Recurso no encontrado."
},
"bulk": {
"no_selection": "Ningún elemento seleccionado.",
"no_field_selected": "Ningún campo modificado.",
"delete_success": "elemento(s) eliminado(s).",
"update_success": "elemento(s) actualizado(s)."
},
"base": {
"title": "Administración",
"breadcrumb": "Admin",
"toggle": "Contraer menú",
"logout_title": "Cerrar sesión",
"theme_toggle": "Cambiar tema",
"back_to_site": "← Sitio"
},
"superuser_wizard": {
"title": "=== Crear superusuario ===",
"algo_prompt": "[1/5] Algoritmo de hash",
"algo_argon2": "Argon2 (recomendado)",
"algo_bcrypt": "Bcrypt",
"algo_scrypt": "Scrypt",
"algo_custom": "Proveedor personalizado",
"provider_path": "Ruta del proveedor",
"invalid_path": "Ruta inválida.",
"username_prompt": "[2/5] Nombre de usuario",
"username_empty": "El nombre de usuario no puede estar vacío.",
"username_taken": "Ya existe un usuario con este nombre.",
"email_prompt": "[3/5] Correo electrónico",
"email_invalid": "Correo electrónico inválido.",
"email_taken": "Ya existe un usuario con este correo.",
"password_prompt": "[4/5] Contraseña",
"password_too_short": "La contraseña debe tener al menos 10 caracteres.",
"confirm_prompt": "[5/5] Confirmar contraseña",
"password_mismatch": "Las contraseñas no coinciden. Por favor, inténtelo de nuevo.",
"review_algo": " Algoritmo : {}",
"review_username": " Usuario : {}",
"review_email": " Email : {}",
"review_password": " Contraseña : ••••••••",
"review_action": "Acción",
"confirm_create": "Confirmar y crear",
"change_algo": "Cambiar algoritmo",
"modify_password": "Modificar contraseña",
"success": "✓ Superusuario creado con éxito!",
"id_line": " ID : {}",
"username_line": " Usuario : {}",
"email_line": " Email : {}"
},
"builtin": {
"invalid_id": "Identificador inválido.",
"droit_resource_required": "Por favor, seleccione al menos un recurso.",
"droit_exists": "El permiso \"{}\" ya existe.",
"groupe_exists": "Ya existe un grupo llamado \"{}\".",
"user_username_exists": "El nombre de usuario \"{}\" ya está en uso.",
"user_email_exists": "La dirección de correo \"{}\" ya está registrada."
}
},
"makemigrations": {
"destructive_detected": "Cambios destructivos detectados:",
"destructive_require_force": "Use --force para aplicar estos cambios destructivos.",
"files_ready": "{} archivo(s) listo(s) para migrar.",
"unknown_dsl_type": "Advertencia: tipo de campo desconocido '{}' — usando '{}' por defecto. Revise si hay un error tipográfico en su modelo.",
"unknown_db_engine": "Advertencia: DB_ENGINE '{}' no reconocido — usando migraciones tipo SQLite (sin soporte nativo de enum/trigger). Valores admitidos: postgres, mysql/mariadb, sqlite."
},
"migrate": {
"applying": "Aplicando migraciones desde '{}'...",
"run_hint": "Ejecutar: sea-orm-cli migrate up",
"complete": "Reversión completa.",
"complete_up": "Migración completada.",
"available_for": "Archivos de reversión disponibles para '{}':",
"rolling_back_batch": "Revirtiendo lote: {}",
"done": "Hecho: {}",
"rolling_back": "Revirtiendo: {}",
"no_applied_dir": "No se encontró el directorio applied/.",
"by_time_header": "by_time (lotes completos):",
"none_available": "No hay archivos de reversión disponibles.",
"usage": "Uso:",
"usage_files": "runique migration down --files <table/timestamp> [<table/timestamp> ...]",
"usage_batch": "runique migration down --batch <timestamp>",
"no_down": "No se encontraron instrucciones down.",
"executing": "Ejecutando: {}"
},
"reset": {
"forgot_title": "Contraseña olvidada",
"reset_title": "Nueva contraseña",
"success_title": "Contraseña restablecida",
"email_label": "Dirección de correo electrónico",
"new_password_label": "Nueva contraseña",
"confirm_label": "Confirmar contraseña",
"email_mismatch": "La dirección de correo no coincide con el enlace.",
"invalid_link": "Enlace inválido.",
"invalid_or_expired": "El enlace de restablecimiento es inválido o ha expirado.",
"password_min_length": "La contraseña debe tener al menos {} caracteres.",
"password_weak": "La contraseña debe contener al menos una mayúscula, una minúscula, un número y un carácter especial (!@#$%...).",
"password_mismatch": "Las contraseñas no coinciden.",
"check_inbox": "Si esta dirección está asociada a una cuenta, recibirá un correo de restablecimiento.",
"email_subject": "Restablecer contraseña",
"email_body": "<p>Hola {},</p><p>Haga clic en el siguiente enlace para restablecer su contraseña (válido durante 1 hora):</p><p><a href=\"{}\">{}</a></p>"
},
"permission": {
"col": {
"id": "ID",
"can_create": "Crear",
"can_delete": "Eliminar",
"can_delete_own": "Eliminar (propio)",
"can_read": "Leer",
"can_update": "Modificar",
"can_update_own": "Modificar (propio)",
"groupes": "Grupos",
"resource_key": "Recurso",
"actions": "Acciones"
}
}
}