{
    "common": {
        "delete_title": "¿Eliminar registro?",
        "delete_text": "Se eliminará «{name}». Solo es posible si no está en uso.",
        "delete_yes": "Sí, eliminar",
        "delete_no": "Cancelar",
        "delete_error": "No se pudo eliminar.",
        "deleted_ok": "Eliminado correctamente.",
        "delete_btn": "Eliminar",
        "code_auto_hint": "El código se genera automáticamente al guardar.",
        "label_predeterminado": "Predeterminado",
        "th_id": "ID",
        "th_code": "Código",
        "th_name": "Nombre",
        "th_sort": "Orden",
        "catalogs_breadcrumb": "Catálogos",
        "refresh": "Refrescar",
        "edit": "Editar",
        "cancel": "Cancelar",
        "save": "Guardar",
        "saving": "Guardando…",
        "load_error": "No se pudo cargar la información.",
        "save_error": "No se pudo guardar."
    },
    "brand": {
        "app_name": "Lavandería Tibu",
        "nav_title": "Lavandería Tibu",
        "logo_alt": "Lavandería Tibu",
        "default_page_title": "Lavandería Tibu",
        "meta_suffix": "Lavandería Tibu"
    },
    "layout": {
        "access_denied": "No tiene permiso para abrir {path}. Si necesita acceso, pida al administrador que revise su rol.",
        "sidebar": {
            "home": "Inicio",
            "sales_pos": "Recepción y ventas",
            "menu_laundry_pos_prices": "Precios del catálogo lavandería",
            "catalog": "Catálogo",
            "catalog_categories": "Categoría",
            "catalog_products": "Servicios",
            "catalog_sale_services": "Servicios (venta POS)",
            "catalog_sale_products": "Productos (venta POS)",
            "catalog_etapas": "Etapas",
            "catalog_tipos_servicio": "Tipos de servicio",
            "catalog_garment_types": "Tipo de prenda",
            "catalog_clients": "Clientes",
            "catalog_client_categories": "Clasificación clientes",
            "laundry_ops": "Lavandería (órdenes)",
            "clients_misc": "Clientes y otros listados",
            "inventory": "Inventario",
            "reports": "Reportes",
            "system_admin": "Sistema (empresa, usuarios, TIBU)",
            "legacy_products_archive": "Productos históricos (archivo)",
            "profile": "Mi perfil",
            "dashboard_semaforo": "Semáforo",
            "new_sale": "Nueva venta",
            "cash_register": "Caja (apertura/corte)",
            "ticket_history": "Historial de tickets",
            "order_list": "Lista de órdenes",
            "scan_qr": "Escanear QR",
            "warehouse_products": "Productos (almacén)",
            "day_close": "Cierre de día",
            "sales_by_product": "Ventas por producto",
            "monthly_sales": "Ventas al mes",
            "users": "Usuarios",
            "roles": "Roles y permisos",
            "tibu_areas": "Áreas TIBU"
        },
        "header": {
            "welcome": "Bienvenido,",
            "profile": "Perfil",
            "logout": "Cerrar sesión",
            "role": "Rol:"
        },
        "footer": {
            "copyright": "© {year} Todos los derechos reservados. Es un producto de Techmedia Soluciones Tecnológicas."
        }
    },
    "catalogos": {
        "etapas": {
            "nav": "Etapas",
            "page_title": "Catálogo de etapas",
            "breadcrumb": "Etapas",
            "subtitle": "Etapas de proceso TIBU (lavado, planchado, completo…) usadas en líneas y precios.",
            "empty": "Sin etapas configuradas.",
            "th_actions": "Acciones"
        },
        "tipos_servicio": {
            "nav": "Tipos de servicio",
            "page_title": "Catálogo de tipos de servicio",
            "breadcrumb": "Tipos de servicio",
            "subtitle": "Urgente, express, normal y demás tipos aplicados a órdenes y al POS.",
            "empty": "Sin tipos de servicio configurados.",
            "th_actions": "Acciones"
        },
        "legacy_products": {
            "nav": "Productos (histórico / stock)",
            "page_title": "Productos",
            "breadcrumb": "Productos",
            "subtitle": "Solo consulta y edición de filas históricas. Las ventas nuevas usan servicio y tipos de prenda en el POS (TIBU). Las altas están deshabilitadas.",
            "modal_edit": "Editar concepto anterior",
            "modal_new": "Nuevo concepto anterior",
            "new_disabled_hint": "No se pueden dar de alta productos nuevos aquí (catálogo congelado)."
        }
    },
    "tibu": {
        "shipping_status": {
            "not_requested": "Sin envío solicitado",
            "pending": "Envío pendiente",
            "in_transit": "En tránsito",
            "delivered": "Entregado",
            "failed": "Envío fallido"
        },
        "priority_level": {
            "urgent": "Urgente",
            "express": "Express",
            "normal": "Normal"
        },
        "load_type": {
            "heavy": "Carga pesada",
            "light": "Carga ligera"
        },
        "order_step": {
            "recepcion": "Recepción",
            "lavado": "Lavado",
            "secado": "Secado",
            "planchado": "Planchado",
            "terminado": "Terminado",
            "entregado": "Entregado"
        }
    },
    "dashboard": "Tablero",
    "sales": "Ventas",
    "analytics": "Analítica",
    "apps": "Aplicaciones",
    "components": "Componentes",
    "elements": "Elementos",
    "font_icons": "Iconos de fuentes",
    "widgets": "Widgets",
    "tables": "Mesas",
    "datatables": "Tablas de datos",
    "forms": "Formularios",
    "users": "Usuarios",
    "pages": "Paginas",
    "authentication": "Autenticación",
    "drag_and_drop": "Arrastrar y soltar",
    "maps": "Mapas",
    "charts": "Gráficos",
    "starter_kit": "Kit de inicio",
    "documentation": "Documentación",
    "ui_kit": "Kit de interfaz de usuario",
    "more": "Más",
    "lavanderia": {
        "dashboard": {
            "page_title": "Semáforo (TIBU)",
            "heading": "Órdenes en tiempo real",
            "breadcrumb_parent": "Lavandería",
            "breadcrumb_current": "Semáforo"
        },
        "lista": {
            "page_title": "Lista de órdenes (TIBU)",
            "heading": "Lista de órdenes de lavandería"
        },
        "operador": {
            "page_title": "Operador (TIBU)",
            "breadcrumb_parent": "Lavandería",
            "breadcrumb_current": "Panel de operador — {area}",
            "heading": "Órdenes pendientes de {area}",
            "intro": "Interfaz simplificada para tablets o celulares. Toque una orden para avanzar a la siguiente etapa.",
            "btn_lavado": "Lavado",
            "btn_secado": "Secado",
            "btn_planchado": "Planchado",
            "empty_area": "No hay órdenes pendientes en esta área.",
            "min_in_stage": "{n} min en etapa"
        },
        "escanear": {
            "page_title": "Escanear QR (TIBU)",
            "heading": "Escanear orden de lavandería",
            "breadcrumb_parent": "Lavandería",
            "breadcrumb_current": "Escanear QR",
            "scan_label": "Código QR o folio",
            "scan_placeholder": "Escanee el código QR o ingrese el folio",
            "scan_hint": "Si el escáner o la pistola fallan, ingrese el folio manualmente (ej. LMS-…).",
            "scan_btn_loading": "Escaneando…",
            "scan_btn": "Escanear (entrada/salida)",
            "found_title": "Orden encontrada",
            "stage_label": "Etapa actual",
            "advance_btn_loading": "Avanzando…",
            "advance_btn": "Iniciar / avanzar etapa",
            "found_line": "Orden encontrada: {folio}",
            "found_line_short": "Folio",
            "client_label": "Cliente",
            "service_label": "Servicio",
            "instructions_label": "Instrucciones",
            "scan_registered": "Escaneo registrado",
            "scan_registered_toast": "Escaneo registrado correctamente",
            "scan_sequence_label": "Secuencia",
            "scan_sequence_entry": "Entrada (secuencia 1)",
            "scan_sequence_exit": "Salida (secuencia 2)",
            "presence_status_label": "Estado de presencia",
            "presence_status_pending": "Pendiente",
            "presence_status_in_progress": "En proceso",
            "presence_status_completed": "Completado",
            "presence_status_skipped": "Omitido",
            "operator_area_title": "Área y operador",
            "operator_area_body": "Área: {area}. Seleccione quién registra el escaneo.",
            "operator_select_label": "Operador que escanea",
            "operator_select_placeholder": "Seleccione operador",
            "operator_select_loading": "Cargando operadores…",
            "operator_select_empty": "No hay operadores habilitados para esta área.",
            "operator_area_select_label": "Área de escaneo",
            "operator_blocked_title": "Seleccione operador",
            "operator_blocked_body": "Elija el operador que realiza el escaneo en el área indicada. Recepción registra el movimiento a nombre del operador de planta.",
            "operator_blocked_body_short": "Seleccione el operador antes de escanear.",
            "operator_area_missing": "No se pudo determinar tu área asignada.",
            "ticket_title": "Estado del ticket",
            "ticket_loading": "Consultando estado…",
            "order_no_ticket": "Escanea un código para ver el estado del ticket.",
            "ticket_folio_label": "Folio",
            "ticket_estatus_label": "Estatus",
            "ticket_current_step_label": "Etapa del flujo (orden)",
            "ticket_global_step_hint": "Este dato es la etapa general del pedido (se actualiza al avanzar la orden en recepción). El trabajo en planta se refleja en «Último escaneo» y en «Avance por área».",
            "ticket_last_scan_title": "Último proceso (área)",
            "order_status_pendiente": "Pendiente",
            "order_status_en_proceso": "En proceso",
            "order_status_terminado": "Terminado",
            "order_status_entregado": "Entregado",
            "order_status_cancelado": "Cancelado",
            "presences_title": "Avance por área",
            "recent_scans_title": "Últimos escaneos",
            "refresh_btn": "Refrescar",
            "refresh_loading": "Refrescando…"
        },
        "recepcion": {
            "page_title": "Recepción / venta (TIBU)",
            "breadcrumb_parent": "Lavandería",
            "breadcrumb_current": "Recepción / venta",
            "legacy_redirect_title": "Ventas en el POS (TIBU)",
            "legacy_redirect_body": "Esta ruta ya no usa el catálogo anterior de la tabla productos. Registre ventas en «Nueva venta (POS)» con tipo de servicio, prenda, tipo de carga y precios de la matriz (C2). El listado anterior solo se mantiene para consulta o ajustes puntuales.",
            "legacy_redirect_cta": "Ir a Nueva venta (POS)"
        },
        "area": {
            "breadcrumb_parent": "Lavandería",
            "breadcrumb_current": "Área: {area}",
            "title": "Escaneo por área (TIBU)",
            "subtitle": "Código de área: {code}. Use lector USB (modo teclado) o escriba el folio y pulse Enter.",
            "requires_two_scans": "Esta área requiere dos escaneos por orden: primero entrada, segundo salida o confirmación.",
            "scan_label": "Código QR o folio",
            "scan_placeholder": "Escanee o escriba el folio (p. ej. LMS-…)",
            "scan_help": "El foco permanece en este campo para lectores USB que envían Enter al final.",
            "scan_submit": "Registrar escaneo",
            "scan_loading": "Registrando…",
            "scan_error_generic": "No se pudo registrar el escaneo.",
            "scan_first_title": "Primer escaneo registrado",
            "scan_first_body": "Entrada al área o inicio de la etapa en esta estación.",
            "scan_second_title": "Segundo escaneo registrado",
            "scan_second_body": "Salida del área o confirmación (cuando el área exige dos lecturas).",
            "scan_registered": "Escaneo registrado",
            "seq_first": "1.er escaneo",
            "seq_second": "2.º escaneo",
            "recent_events": "Últimos eventos",
            "recent_empty": "Aún no hay eventos en esta sesión.",
            "event_ok": "OK",
            "event_fail": "Error",
            "switch_area": "Cambiar de área",
            "menu_item": "Escanear TIBU — {area}",
            "page_title": "{area} · TIBU",
            "codes": {
                "reception": "Recepción",
                "selection": "Selección (patio)",
                "heavy_wash": "Lavado pesado",
                "light_wash": "Lavado ligero",
                "ironing": "Planchado",
                "storage": "Almacenado",
                "shipping": "Envíos"
            }
        }
    },
    "ventas": {
        "pos": {
            "breadcrumb_parent": "Ventas",
            "breadcrumb_current": "Nueva venta (POS)",
            "caja_closed_title": "Caja cerrada.",
            "caja_closed_body": "No puede registrar ventas hasta abrir una caja.",
            "caja_open_link": "Abrir caja",
            "catalog_title": "Catálogo de servicios",
            "catalog_hint": "Paso 1: agregue los servicios al carrito. Luego complete el cliente y cobre a la derecha.",
            "open_catalog_modal_btn": "Agregar servicio al carrito",
            "open_catalog_modal_sub": "Categoría → servicio → cantidad",
            "flow_step_catalog": "Servicios",
            "flow_step_client": "Cliente y cobro",
            "catalog_step_categories": "1. Categoría",
            "catalog_step_services": "2. Servicio",
            "catalog_step_configure": "3. Confirmar",
            "service_added_to_cart": "{name} agregado al carrito",
            "cart_services_count": "{n} servicio en el carrito",
            "cart_services_count_plural": "{n} servicios en el carrito",
            "empty_cart_hint": "Use «Agregar servicio al carrito» (panel izquierdo) para comenzar.",
            "catalog_modal_title": "Catálogo de servicios",
            "catalog_modal_pick_category": "Elija una categoría",
            "catalog_modal_pick_service": "Servicios — {category}",
            "catalog_modal_configure": "Configurar servicio",
            "catalog_modal_back": "Volver",
            "catalog_title_legacy": "Catálogo anterior (servicios)",
            "catalog_hint_legacy": "Solo para compatibilidad con ventas antiguas por ítem de catálogo. No descuenta inventario interno TIBU.",
            "etapa": "Etapa",
            "etapa_ph": "Primero la etapa (lavado, planchado…)",
            "service_type": "Etapa",
            "service_type_ph": "Primero la etapa (lavado, planchado…)",
            "tibu_qty_pieces": "Cantidad (piezas)",
            "add_tibu_line": "Agregar línea",
            "add_content_line": "Contenido del servicio",
            "add_content_hint": "Detalle qué prendas incluye el servicio seleccionado. No se cobra; sí aparece en el ticket.",
            "add_content_select_product": "Seleccione primero un servicio en el catálogo.",
            "content_for_product": "incluye",
            "add_content_btn": "Agregar contenido",
            "content_modal_btn": "Contenido del servicio",
            "content_pending_hint": "{n} prenda(s) pendiente(s). Se agregarán al confirmar el servicio.",
            "content_modal_title": "Contenido del servicio",
            "content_modal_title_draft": "Contenido — {name}",
            "content_modal_title_cart": "Contenido de {name}",
            "content_modal_subtitle_draft": "Agregue prendas aquí; al pulsar «Agregar servicio al carrito» se guardan con la línea.",
            "content_modal_subtitle_cart": "Detalle informativo del servicio (no se cobra; aparece en el ticket).",
            "content_modal_empty": "Sin prendas registradas. Use el formulario de arriba para agregar.",
            "view_content_btn": "Ver contenido ({n})",
            "badge_content": "Informativo",
            "badge_tibu": "Lavandería",
            "badge_catalog": "Catálogo POS",
            "no_charge": "Sin cargo",
            "content_line_mode": "Solo ticket",
            "add_catalog_line": "Catálogo POS (servicio)",
            "filter_category": "Filtrar por categoría",
            "all_categories": "Todas las categorías",
            "select_product": "Servicio",
            "add_catalog_btn": "Agregar servicio al carrito",
            "optional_service_uses_product_or_header": "Opcional: usa el valor predeterminado del servicio o el tipo arriba",
            "th_billing_mode": "Modo de cobro",
            "billing_piece_unit": "Por unidad (precio del servicio)",
            "billing_weight_catalog": "Por peso ($/kg según servicio)",
            "loading_catalog": "Cargando catálogo…",
            "init_loading": "Preparando punto de venta…",
            "badge_service": "Servicio",
            "badge_product": "Servicio",
            "badge_stock": "Stock: {n}",
            "per_kg": "Por kg",
            "per_piece": "Por pieza",
            "per_kg_suffix": " / kg",
            "no_products": "No hay servicios configurados. Revise el catálogo POS en Administración.",
            "cart_title": "Cliente y carrito",
            "search_client": "Buscar cliente",
            "search_placeholder": "Nombre, email o teléfono...",
            "quick_client": "Registro rápido",
            "client": "Cliente",
            "remove": "Quitar",
            "client_name": "Nombre del cliente",
            "client_category": "Clasificación",
            "client_category_none": "Sin clasificación",
            "client_name_ph": "Ej. Juan Pérez",
            "client_email": "Correo",
            "priority": "Prioridad (SLA)",
            "priority_none": "Sin nivel específico",
            "delivery": "Entrega a domicilio",
            "delivery_date": "Fecha de entrega prometida",
            "delivery_date_hint": "Define cuándo debe quedar listo el servicio. El semáforo combina esta fecha con las horas de alerta configuradas arriba.",
            "order_tipo_servicio": "Tipo de servicio (SLA)",
            "order_tipo_servicio_placeholder": "Seleccione tipo de servicio",
            "order_tipo_servicio_hint": "Define la prioridad de la orden (urgente, express, normal). No depende de los productos del carrito.",
            "order_tipo_servicio_required": "Seleccione el tipo de servicio de la orden.",
            "semaphore_section": "Alertas del semáforo (horas antes de entrega)",
            "semaphore_yellow": "Amarillo (horas)",
            "semaphore_red": "Rojo (horas)",
            "semaphore_hint": "El tablero semáforo usa estos valores junto con la fecha de entrega. Defínelos aquí en cada orden.",
            "semaphore_required": "Indique las horas de alerta amarilla y roja del semáforo.",
            "cart_lines_title": "Servicios en la orden",
            "cart_summary_right": "{n} línea(s) en el carrito",
            "edit_line": "Editar línea",
            "delivery_address": "Dirección de entrega",
            "delivery_address_hint": "Se toma del domicilio del cliente; puede editarla para esta orden.",
            "save_client_direccion": "Guardar domicilio en el catálogo del cliente",
            "client_address_save_error": "La orden se guardó, pero no se pudo actualizar el domicilio del cliente: {msg}",
            "details_clothes": "Detalles de ropa / resumen (opcional)",
            "instructions": "Instrucciones especiales (opcional)",
            "th_concept": "Concepto",
            "th_qty": "Cant / Kg",
            "th_unit": "P.Unit",
            "th_sub": "Subtotal",
            "th_billing": "Cobro TIBU",
            "billing_standard": "Estándar (solo servicio/cantidad)",
            "billing_garment": "Por tipo de prenda",
            "billing_weight": "Por peso (TIBU)",
            "remove_line": "Quitar",
            "garment_type": "Tipo de prenda",
            "weight_kg": "Peso (kg)",
            "load_type": "Tipo de carga",
            "optional": "Opcional",
            "line_obs": "Observaciones de línea",
            "extra_cost": "Costo extra",
            "real_qty": "Cantidad real",
            "real_qty_label": "Real: {n}",
            "real_weight_kg": "Peso real (kg)",
            "bill_qty_label": "A cobrar: {n}",
            "bill_weight_label": "Peso a cobrar: {n} kg",
            "custom_price_enable": "Ajustar precio unitario",
            "custom_price": "Precio unitario a cobrar",
            "extra_cost_hint": "Se suma una vez al subtotal de esta línea. Por predeterminado viene del catálogo del servicio.",
            "default_load_applied": "Carga predeterminada aplicada",
            "default_billing_applied": "Cobro predeterminado aplicado",
            "select": "Seleccione…",
            "empty_cart": "Carrito vacío. Agregue ítems.",
            "payment": "Método de pago",
            "payment_unset": "Sin especificar",
            "pay_cash": "Efectivo",
            "pay_card": "Tarjeta",
            "pay_transfer": "Transferencia",
            "payments_title": "Cobro",
            "payments_hint": "Indique el método de pago y finalice la orden. Puede dividir el total entre varios métodos.",
            "payments_after_open_hint": "Guarde la orden (Abrir orden) para habilitar el cobro y finalizar.",
            "payment_amount": "Monto",
            "add_payment_line": "Agregar método",
            "payments_sum_label": "Suma pagos",
            "payments_sum_mismatch": "La suma de pagos ({sum}) no coincide con el total ({total}).",
            "payments_finalize_required": "Indique el método de pago antes de finalizar (debe sumar el total).",
            "total": "Total",
            "saving": "Guardando…",
            "submit": "Cobrar y confirmar venta",
            "open_order": "Abrir orden",
            "save_changes": "Guardar cambios",
            "finalize_order": "Cobrar y finalizar",
            "order_opened": "Orden abierta: {folio}",
            "changes_saved": "Cambios guardados",
            "open_order_badge": "Orden abierta:",
            "open_orders_title": "Órdenes abiertas (recepción)",
            "refresh_open_orders": "Actualizar",
            "loading_open_orders": "Cargando órdenes abiertas…",
            "no_open_orders": "No hay órdenes abiertas. Use «Nueva orden» o reabra por folio.",
            "new_order": "Nueva orden",
            "reopen_order_label": "Reabrir orden por folio",
            "reopen_order_placeholder": "Ej. LMS-20260509-ABC123",
            "reopen_order_btn": "Reabrir",
            "reopen_order_ok": "Orden reabierta: {folio}",
            "reopen_order_not_found": "No se encontró una orden pendiente en recepción con ese folio.",
            "reopen_order_stale_storage": "La orden guardada en este equipo ya no existe o ya no está en recepción. Se limpió la selección.",
            "reopen_order_error": "No se pudo reabrir la orden.",
            "reopen_order_recent_hint": "Sugerencias desde folios recientes guardados en este equipo.",
            "modal_title": "Venta registrada — {folio}",
            "qr_ready": "Código QR generado para seguimiento.",
            "qr_preview_label": "Código QR de seguimiento",
            "qr_preview_hint": "Escanee con la cámara para ver el estado de la orden.",
            "print_two": "Imprimir en el navegador (2 copias con QR)",
            "print_server": "Abrir PDF para térmica (logo, datos y QR)",
            "pdf_loading": "Generando…",
            "pdf_error": "No se pudo generar el documento.",
            "auto_ticket_next": "Abrir automáticamente el ticket del navegador (2 copias con QR) al cobrar",
            "auto_ticket_hint": "Si el navegador bloquea ventanas emergentes, use los botones de impresión abajo.",
            "ticket_popup_blocked": "El navegador bloqueó la ventana del ticket. Pulse «Imprimir en el navegador…» o permita ventanas emergentes para este sitio.",
            "close": "Cerrar",
            "quick_client_title": "Registro rápido de cliente",
            "phone": "Teléfono",
            "address": "Dirección",
            "cancel": "Cancelar",
            "save_use": "Guardar y usar",
            "client_pick_required_hint": "Busque y seleccione un cliente del catálogo (obligatorio). Puede usar «+ Cliente» para registrar uno nuevo.",
            "bags_section_title": "Etiquetas para bolsas",
            "bags_section_hint": "Indique cuántas bolsas usa la orden. Cada una tendrá un código de barras con el nombre del cliente para pegar en la bolsa.",
            "bags_qty_label": "Cantidad de bolsas",
            "bags_apply": "Generar códigos",
            "bags_applying": "Generando…",
            "bags_print_all": "Imprimir todas las etiquetas",
            "bags_print_one": "Imprimir",
            "bags_printing": "Imprimiendo…",
            "bags_thermal_ok": "Etiqueta enviada a la impresora de recepción.",
            "bags_thermal_error": "No se pudo imprimir la etiqueta.",
            "bags_empty": "Sin bolsas. Indique la cantidad y pulse «Generar códigos».",
            "bags_bag_n": "Bolsa {n}",
            "bags_save_order_first": "Guarde la orden antes de generar etiquetas de bolsas.",
            "bags_updated": "Códigos de bolsa actualizados.",
            "bags_error": "No se pudieron actualizar las bolsas.",
            "bags_print_none": "No hay bolsas para imprimir.",
            "bags_pdf_error": "No se pudo generar el PDF de etiquetas.",
            "bags_quick_print_btn": "Imprimir etiqueta",
            "bags_quick_print_hint": "Genera el código si hace falta e imprime la etiqueta con el nombre del cliente.",
            "client_saved": "Cliente registrado.",
            "client_error": "Error al guardar: {msg}",
            "sale_ok": "Venta registrada: {folio}",
            "sale_error": "Error: {msg}",
            "sale_timeout": "La operación tardó demasiado. Espere un momento e intente de nuevo.",
            "show_obs_on_ticket": "Mostrar observaciones en ticket de venta",
            "sale_print_ok": "Venta registrada. Ticket impreso correctamente.",
            "sale_print_warn": "Venta registrada; error al imprimir: {msg}",
            "print_thermal_ticket": "Imprimir ticket",
            "print_thermal_printing": "Imprimiendo…",
            "print_thermal_ok": "Ticket enviado a la impresora de recepción.",
            "print_thermal_no_printer": "No hay impresora de venta configurada para recepción. Configure una en Administración → Impresoras.",
            "preview_sync_notice": "Totales calculados con la vista previa del backend.",
            "page_title": "Nueva venta (POS)",
            "validation": {
                "cliente_required": "Indique el nombre del cliente.",
                "cliente_select_required": "Seleccione un cliente del catálogo (búsqueda o registro rápido).",
                "cliente_min": "Mínimo 2 caracteres.",
                "delivery_address": "La dirección es obligatoria si hay entrega a domicilio.",
                "garment_required": "Seleccione el tipo de prenda en las líneas con cobro por prenda.",
                "weight_required": "Indique el peso (kg) en las líneas con cobro por peso.",
                "service_type_required": "Seleccione la etapa antes de agregar líneas TIBU por tipo de prenda.",
                "etapa_required": "Seleccione la etapa antes de agregar líneas TIBU por tipo de prenda.",
                "catalog_service_required": "Configure la etapa predeterminada en el servicio del catálogo POS (Administración).",
                "content_line_required": "Indique servicio y tipo de prenda para la línea de contenido.",
                "catalog_qty_required": "Indique cantidad (≥ 1) para la línea de catálogo.",
                "catalog_product_missing": "Hay una línea de catálogo POS con servicio inválido o inactivo.",
                "finalize_need_items": "Agrega al menos una línea antes de finalizar la orden.",
                "no_piece_price": "No hay precio de pieza para esta combinación (servicio, prenda y carga). Revise la matriz o el tipo de carga.",
                "no_price_per_kg": "No hay precio por kg vigente; no puede cobrar por peso hasta configurarlo."
            }
        },
        "caja": {
            "breadcrumb_parent": "Ventas",
            "breadcrumb_current": "Caja (apertura/corte)",
            "title_state": "Estado de caja",
            "open_badge": "Abierta",
            "initial_balance": "Saldo inicial",
            "opened_at": "Abierta",
            "close_btn": "Cerrar caja (corte)",
            "close_processing": "Procesando…",
            "no_caja": "No tiene caja abierta. Abra una para registrar ventas.",
            "name_label": "Nombre",
            "name_ph": "Caja 1",
            "initial_label": "Saldo inicial ($)",
            "open_btn": "Abrir caja",
            "opening": "Abriendo…",
            "open_ok": "Caja abierta.",
            "open_error": "Error al abrir.",
            "close_ok": "Caja cerrada.",
            "close_error": "Error al cerrar la caja.",
            "cut_summary": "Ventas: {ventas} | Saldo final (todos los métodos): {saldo} | Efectivo esperado: {esperado}",
            "arqueo_title": "Arqueo (opcional)",
            "cash_counted": "Efectivo contado ($)",
            "cash_counted_help": "Si lo indica, se calcula la diferencia frente al efectivo esperado.",
            "notes_close": "Notas de cierre",
            "notes_ph": "Observaciones del turno…",
            "movements_title": "Movimientos de efectivo",
            "movements_empty": "Sin movimientos en esta sesión.",
            "movements_type": "Tipo",
            "movements_in": "Ingreso",
            "movements_out": "Egreso",
            "movements_amount": "Monto",
            "movements_reason": "Motivo",
            "movements_add": "Registrar",
            "movements_loading": "Cargando…",
            "movements_ok": "Movimiento registrado.",
            "movements_error": "No se pudo registrar el movimiento."
        },
        "tickets": {
            "breadcrumb_parent": "Ventas",
            "breadcrumb_current": "Historial de tickets",
            "title": "Historial de tickets",
            "subtitle": "Filtre órdenes y reimprima el ticket en PDF (80 mm, logo y código de barras) desde el servidor.",
            "filter_from": "Desde",
            "filter_to": "Hasta",
            "filter_client": "Cliente",
            "filter_client_ph": "Nombre (contiene)",
            "filter_folio": "Folio",
            "filter_folio_ph": "LMS-…",
            "filter_status": "Estado",
            "filter_status_all": "Todos",
            "filter_tipo_servicio": "Tipo de servicio",
            "filter_priority_level": "Tipo de servicio",
            "filter_priority_all": "Cualquiera",
            "filter_flag": "Marca prioritaria",
            "filter_flag_all": "Cualquiera",
            "filter_flag_yes": "Sí",
            "filter_flag_no": "No",
            "filter_caja": "Caja (ID)",
            "filter_caja_ph": "Opcional",
            "per_page": "Por página",
            "search": "Buscar",
            "reset": "Limpiar",
            "table_folio": "Folio",
            "table_client": "Cliente",
            "table_date": "Fecha",
            "table_delivery_date": "Entrega",
            "table_status": "Estado",
            "table_priority": "Prioridad",
            "table_caja": "Caja",
            "table_qr": "Código barras",
            "table_select": "Seleccionar",
            "table_total": "Total",
            "table_actions": "Acciones",
            "edit_order": "Editar orden",
            "priority_badge": "Urgente",
            "reprint_ticket": "Reimprimir ticket",
            "reprint_label": "Imprimir etiqueta",
            "reprint_label_ok": "Etiqueta enviada a la impresora.",
            "reprint_label_error": "No se pudo imprimir la etiqueta.",
            "reprint_ok": "Ticket enviado a impresión",
            "reprint_error": "No se pudo imprimir el ticket",
            "whatsapp_ready": "Avisar listo",
            "whatsapp_ready_hint": "Abrir WhatsApp Web con aviso de pedido listo",
            "whatsapp_no_phone": "Sin teléfono en el cliente registrado de esta orden",
            "whatsapp_ticket": "Ticket WA",
            "whatsapp_ticket_hint": "Envía el ticket como imagen. En móvil puede adjuntarse automático; en WhatsApp Web hay que pegar (Ctrl+V) o adjuntar el archivo.",
            "whatsapp_ticket_loading": "Preparando…",
            "whatsapp_ticket_ok_share": "Elija WhatsApp en el menú de compartir; la imagen irá adjunta.",
            "whatsapp_ticket_ok_copied": "Chat abierto. Pegue la imagen con Ctrl+V o adjunte el archivo descargado (📎).",
            "whatsapp_ticket_ok_download": "Chat abierto. Adjunte la imagen descargada en WhatsApp Web (📎).",
            "whatsapp_ticket_cancelled": "Envío cancelado.",
            "whatsapp_ticket_error": "No se pudo generar el ticket para WhatsApp",
            "loading": "Cargando…",
            "empty": "Sin resultados.",
            "page": "Página {n} de {m} · {t} registros",
            "prev": "Anterior",
            "next": "Siguiente",
            "pdf_error": "No se pudo generar el documento.",
            "bulk_hint": "Selección múltiple (página actual):",
            "select_page": "Seleccionar página",
            "clear_selection": "Quitar selección",
            "bulk_reprint_ticket": "Reimprimir tickets seleccionados",
            "export_csv": "Exportar CSV",
            "export_loading": "Exportando…",
            "export_ok": "CSV descargado.",
            "export_error": "No se pudo exportar.",
            "export_forbidden": "Sin permiso para exportar (reportes.ver).",
            "page_title": "Historial de tickets"
        }
    },
    "admin": {
        "garment_types": {
            "nav": "Tipos de prenda (TIBU)",
            "breadcrumb_parent": "Administración",
            "breadcrumb_current": "Tipos de prenda",
            "title": "Administración de tipos de prenda",
            "subtitle": "Catálogo TIBU de prendas: código, nombre, orden, activo y carga predeterminada. Los precios del punto de venta salen del catálogo de servicios o de la matriz de precios por pieza, no del tipo de prenda.",
            "refresh": "Refrescar",
            "new": "Nueva prenda",
            "th_code": "Código",
            "th_name": "Nombre",
            "th_sort": "Orden",
            "th_active": "Activa",
            "th_default_load": "Carga predeterminada",
            "th_actions": "Acciones",
            "yes": "Sí",
            "no": "No",
            "edit": "Editar",
            "disable": "Desactivar",
            "modal_new": "Nueva prenda",
            "modal_edit": "Editar prenda",
            "f_code": "Código",
            "f_name": "Nombre",
            "f_sort": "Orden",
            "f_active": "Activa",
            "f_default_load": "Carga predeterminada",
            "pricing_note": "Los importes y el modo de cobro en el POS se definen en el catálogo de servicios o en la matriz de precios por pieza / regla de precio por kg.",
            "cancel": "Cancelar",
            "save": "Guardar",
            "saving": "Guardando...",
            "load_error": "No se pudo cargar el listado.",
            "code_required": "El código es obligatorio.",
            "name_required": "El nombre es obligatorio.",
            "created": "Prenda creada.",
            "saved": "Prenda actualizada.",
            "disabled": "Prenda desactivada.",
            "save_error": "No se pudo guardar."
        },
        "laundry_pos_catalog": {
            "nav": "Catálogo lavandería POS",
            "breadcrumb_parent": "Administración",
            "breadcrumb_current": "Catálogo POS (lavandería)",
            "title": "Catálogo POS — categorías y servicios",
            "title_categories": "Categorías del catálogo POS",
            "title_servicio": "Servicios de venta (POS)",
            "title_producto": "Productos de venta (POS)",
            "subtitle": "Un solo catálogo para ventas en recepción: servicios por peso o por pieza y, si aplica, existencias de consumo (misma tabla que el POS). El listado antiguo queda solo como archivo en Sistema.",
            "subtitle_categories": "Agrupa servicios y productos que se muestran en recepción. Compartidas por ambos catálogos de venta.",
            "subtitle_servicio": "Servicios de lavandería (por peso o por pieza). Aparecen en el POS; no llevan inventario de mostrador.",
            "subtitle_producto": "Artículos de mostrador o consumibles. Aparecen en el POS y pueden controlar existencias por pieza.",
            "link_manage_categories": "Gestionar categorías",
            "tab_categories": "Categorías",
            "tab_products": "Servicios",
            "tab_products_producto": "Productos",
            "tab_products_servicio": "Servicios",
            "new_producto": "Nuevo producto",
            "new_servicio": "Nuevo servicio",
            "modal_new_prod_producto": "Nuevo producto de venta",
            "modal_edit_prod_producto": "Editar producto de venta",
            "modal_new_prod_servicio": "Nuevo servicio de venta",
            "modal_edit_prod_servicio": "Editar servicio de venta",
            "created_prod_producto": "Producto creado.",
            "saved_prod_producto": "Producto actualizado.",
            "disabled_prod_producto": "Producto desactivado.",
            "created_prod_servicio": "Servicio creado.",
            "saved_prod_servicio": "Servicio actualizado.",
            "disabled_prod_servicio": "Servicio desactivado.",
            "breadcrumb_categories": "Categorías POS",
            "breadcrumb_servicio": "Servicios POS",
            "breadcrumb_producto": "Productos POS",
            "refresh": "Refrescar",
            "new_category": "Nueva categoría",
            "new_product": "Nuevo servicio",
            "th_code": "Código",
            "th_name": "Nombre",
            "th_sort": "Orden",
            "th_active": "Activa",
            "th_actions": "Acciones",
            "th_tipo": "Tipo",
            "th_etapa": "Etapa",
            "th_tipo_servicio": "Tipo de servicio",
            "filter_tipo": "Tipo",
            "filter_tipo_all": "Todos",
            "filter_search": "Buscar",
            "filter_search_ph": "Nombre, código o descripción…",
            "filter_all": "Todos",
            "filter_all_categories": "Todas las categorías",
            "filter_clear": "Limpiar filtros",
            "filter_results": "Mostrando {shown} de {total} artículos",
            "products_empty": "No hay artículos con ese filtro.",
            "th_category": "Categoría",
            "th_billing_unit": "Unidad de cobro",
            "th_unit_price": "Precio unitario",
            "th_stock": "Existencias",
            "yes": "Sí",
            "no": "No",
            "edit": "Editar",
            "disable": "Desactivar",
            "modal_new_cat": "Nueva categoría",
            "modal_edit_cat": "Editar categoría",
            "modal_new_prod": "Nuevo servicio",
            "modal_edit_prod": "Editar servicio",
            "f_code": "Código",
            "f_name": "Nombre",
            "f_tipo": "Tipo",
            "tipo_servicio": "Servicio (lavandería)",
            "tipo_producto": "Producto (mostrador / retail)",
            "f_sort": "Orden",
            "f_active": "Activa",
            "f_tracks_stock": "Controlar existencias (por pieza)",
            "f_stock_quantity": "Cantidad en existencia",
            "tracks_stock_help": "Solo con cobro por pieza. Al vender en el POS se descuenta esta cantidad; al cancelar la orden se revierte.",
            "f_category": "Categoría",
            "f_tipo_servicio": "Tipo de servicio",
            "f_tipo_servicio_help": "Opcional. Solo para filtrar en este catálogo. El tipo de servicio de la orden se elige en el POS.",
            "f_semaphore_red": "Alerta roja (horas antes de entrega)",
            "f_semaphore_yellow": "Alerta amarilla (horas antes de entrega)",
            "semaphore_help": "Tablero semáforo: amarillo si faltan ≤ estas horas; rojo si faltan ≤ horas rojas. Vacío = valores globales (2 h / 3 h).",
            "f_priority_level": "Tipo de servicio",
            "f_priority_level_help": "Se aplica automáticamente al vender este artículo en el POS. Si hay varios en la orden, prevalece el tipo de mayor prioridad.",
            "f_description": "Descripción",
            "f_billing_unit": "Unidad de cobro",
            "f_unit_price": "Precio unitario",
            "f_extra_cost": "Costo extra (por línea)",
            "extra_cost_help": "Se suma una vez al subtotal de cada venta de este servicio en el POS.",
            "cancel": "Cancelar",
            "save": "Guardar",
            "saving": "Guardando…",
            "load_error": "No se pudo cargar el listado.",
            "save_error": "No se pudo guardar.",
            "saved_cat": "Categoría actualizada.",
            "created_cat": "Categoría creada.",
            "disabled_cat": "Categoría desactivada.",
            "saved_prod": "Servicio actualizado.",
            "created_prod": "Servicio creado.",
            "disabled_prod": "Servicio desactivado.",
            "unit_price_help": "Precio base usado en el POS y en órdenes nuevas.",
            "service_prices_section": "Precios por tipo de servicio",
            "service_prices_hint": "Opcional: un importe por servicio sustituye al precio unitario de arriba para ese servicio en el POS y en órdenes nuevas.",
            "service_price_amount": "Importe",
            "service_price_add": "+ Agregar precio por servicio",
            "service_price_remove": "Quitar",
            "service_price_need_type": "En precios por servicio, elige el tipo de servicio en cada fila completa.",
            "service_price_need_amount": "En precios por servicio, indica el importe en cada fila completa.",
            "service_price_duplicate": "No repitas el mismo tipo de servicio en dos filas.",
            "stock_need_qty": "Indica una cantidad en existencia (entero ≥ 0) cuando controlas inventario."
        },
        "config_empresa": {
            "nav": "Empresa y ticket",
            "breadcrumb_parent": "Administración",
            "breadcrumb_current": "Empresa y ticket térmico",
            "title": "Configuración de empresa y ticket",
            "subtitle": "Datos generales y texto del ticket térmico (PDF). Los cambios se guardan en la base de datos.",
            "save": "Guardar",
            "saving": "Guardando...",
            "reload": "Recargar",
            "saved": "Configuración guardada.",
            "load_error": "No se pudo cargar la configuración.",
            "save_error": "No se pudo guardar.",
            "forbidden": "Sin permiso para configurar empresa. Pida a un administrador el permiso «administracion.configuracion_empresa» o ejecute las migraciones pendientes.",
            "section_general": "Datos generales (requeridos al guardar)",
            "f_nombre_empresa": "Nombre / razón social",
            "f_nombre_corto": "Nombre corto (código)",
            "f_nombre_largo": "Nombre largo",
            "f_rfc": "RFC",
            "f_telefono": "Teléfono",
            "f_email": "Correo",
            "f_direccion": "Dirección (calle)",
            "f_codigo_postal": "Código postal",
            "f_ciudad": "Ciudad",
            "f_estado": "Estado",
            "f_pais": "País",
            "f_sitio_web": "Sitio web (URL o vacío)",
            "section_ticket_header": "Ticket — encabezado",
            "f_ticket_nombre": "Nombre en ticket",
            "f_ticket_rfc": "RFC en ticket (solo clave; se imprime como RFC: …)",
            "f_ticket_domicilio": "Domicilio (calle y colonia)",
            "f_ticket_cp_ciudad": "C.P. y ciudad, estado (una línea)",
            "f_ticket_telefono": "Teléfono en ticket (solo número; se imprime como TELEFONO: …)",
            "f_ticket_linea_folio": "Línea ticket/expedición",
            "ticket_linea_folio_help": "Placeholders: {folio}, {fecha_hora}, {fecha}. Ejemplo: TICKET: {folio}    EXP: {fecha_hora}",
            "section_ticket_footer": "Ticket — pie / políticas",
            "f_ticket_footer": "Texto del pie (una línea por renglón)",
            "ticket_footer_help": "Placeholders: {folio}, {fecha_hora}, {fecha}, {cliente}, {total}, {fecha_entrega}, {recepcionista}.",
            "section_legal_optional": "Términos y aviso (opcional)",
            "f_terminos": "Términos y condiciones",
            "f_politica": "Política de privacidad"
        },
        "areas": {
            "breadcrumb_parent": "Administración",
            "breadcrumb_current": "Áreas TIBU",
            "title": "Áreas operativas",
            "subtitle": "Desactivar solo apaga el flujo (is_enabled); no borra escaneos ni presencias.",
            "refresh": "Refrescar",
            "new": "Nueva área",
            "th_code": "Código",
            "th_name": "Nombre",
            "th_sort": "Orden",
            "th_active": "Catálogo activo",
            "th_enabled": "Habilitada",
            "th_double_scan": "Doble escaneo",
            "th_floor": "Piso/zona",
            "th_actions": "Acciones",
            "yes": "Sí",
            "no": "No",
            "edit": "Editar",
            "disable": "Desactivar",
            "modal_new": "Nueva área",
            "modal_edit": "Editar área",
            "f_name": "Nombre",
            "f_sort": "Orden",
            "f_active_cat": "Activa en catálogo",
            "f_enabled": "Habilitada para operación",
            "f_double": "Requiere doble escaneo",
            "f_floor": "Piso / etiqueta (opcional)",
            "cancel": "Cancelar",
            "save": "Guardar",
            "saving": "Guardando…",
            "load_error": "No se pudo cargar el listado.",
            "name_required": "Indique el nombre del área.",
            "saved": "Cambios guardados.",
            "created": "Área creada.",
            "save_error": "No se pudo guardar.",
            "disable_confirm_title": "¿Desactivar área?",
            "disable_confirm_body": "La área dejará de aparecer en el flujo operativo. El historial no se borra.",
            "disabled_ok": "Área desactivada.",
            "disable_error": "No se pudo desactivar."
        },
        "impresoras": {
            "nav": "Impresoras",
            "breadcrumb_parent": "Administración",
            "breadcrumb_current": "Impresoras por área",
            "title": "Impresoras por área",
            "subtitle": "Configure impresoras térmicas vinculadas a cada área operativa.",
            "pos_hint": "Las ventas del POS imprimen en la impresora de venta del área asignada al usuario.",
            "pos_hint_fallback": " Si el usuario no tiene área, se usa la impresora de {area}.",
            "refresh": "Refrescar",
            "new": "Nueva impresora",
            "filter_area": "Filtrar por área",
            "filter_all": "Todas las áreas",
            "th_area": "Área",
            "th_codigo": "Código",
            "th_nombre": "Nombre",
            "th_sistema": "Nombre en Windows",
            "th_tipo": "Tipo",
            "th_red": "Red",
            "th_activa": "Activa",
            "th_default": "Predeterminada",
            "th_actions": "Acciones",
            "badge_pos": "POS",
            "yes": "Sí",
            "no": "No",
            "edit": "Editar",
            "empty": "No hay impresoras registradas.",
            "modal_new": "Nueva impresora",
            "modal_edit": "Editar impresora",
            "f_area": "Área",
            "f_area_placeholder": "Seleccione un área",
            "f_codigo": "Código",
            "f_nombre": "Nombre descriptivo",
            "f_sistema": "Nombre en el sistema",
            "f_sistema_hint": "Nombre exacto de la impresora en Windows o CUPS.",
            "f_tipo": "Tipo de ticket",
            "tipo_venta": "Venta (cliente)",
            "tipo_cocina": "Cocina / producción",
            "f_ip": "IP (opcional)",
            "f_puerto": "Puerto",
            "f_ancho": "Ancho papel (mm)",
            "f_activa": "Activa",
            "f_default": "Predeterminada en el área",
            "f_default_hint": "Si hay varias en el mismo área, se usa la marcada como predeterminada.",
            "cancel": "Cancelar",
            "save": "Guardar",
            "saving": "Guardando…",
            "load_error": "No se pudo cargar el listado.",
            "validation_required": "Complete área, nombre y nombre en el sistema.",
            "created": "Impresora registrada.",
            "updated": "Cambios guardados.",
            "deleted": "Impresora eliminada.",
            "save_error": "No se pudo guardar.",
            "delete_error": "No se pudo eliminar.",
            "test_btn": "Probar",
            "test_loading": "Imprimiendo…",
            "test_ok": "Ticket de prueba enviado.",
            "test_error": "No se pudo imprimir el ticket de prueba."
        }
    },
    "inventory": {
        "products": {
            "breadcrumb_parent": "Inventario",
            "breadcrumb_current": "Productos (almacén)",
            "title": "Inventario — productos",
            "subtitle": "Almacén / insumos (tablas inventory_*). No es el catálogo de lavandería ni el POS.",
            "search": "Buscar",
            "search_ph": "SKU o nombre",
            "filter_active": "Activo",
            "filter_all": "Todos",
            "filter_yes": "Sí",
            "filter_no": "No",
            "btn_new": "Nuevo producto",
            "btn_edit": "Editar",
            "btn_delete": "Eliminar",
            "btn_disable": "Baja",
            "btn_activate": "Alta",
            "btn_movements": "Movimientos",
            "th_sku": "SKU",
            "th_name": "Nombre",
            "th_type": "Tipo",
            "th_stock": "Existencias",
            "th_min_stock": "Mín. existencias",
            "th_active": "Activo",
            "th_actions": "Acciones",
            "stock_hint": "Existencias actualizadas por movimientos (entrada, salida o ajuste).",
            "bulk_csv_title": "Ajuste masivo (CSV)",
            "bulk_csv_hint": "Archivo con cabecera sku,quantity — cantidad firmada como en un movimiento tipo ajuste (inventario almacén).",
            "btn_bulk_csv": "Subir CSV de ajustes",
            "bulk_csv_ok": "Se aplicaron {n} ajustes (ref. {ref}).",
            "modal_create": "Nuevo producto de inventario",
            "modal_edit": "Editar producto",
            "field_sku": "SKU / código",
            "field_name": "Nombre",
            "field_type": "Tipo de producto",
            "field_brand": "Marca",
            "field_category": "Categoría",
            "field_subcategory": "Subcategoría",
            "field_supplier": "Proveedor",
            "field_min_stock": "Mínimo de existencias (alerta)",
            "field_min_stock_hint": "Opcional. Si queda vacío, el comando usa el umbral global (config).",
            "field_active": "Activo",
            "optional": "Opcional",
            "save": "Guardar",
            "cancel": "Cancelar",
            "confirm_delete": "¿Eliminar este producto de inventario?",
            "confirm_disable": "¿Dar de baja «{name}»?",
            "confirm_activate": "¿Dar de alta «{name}»?",
            "disable": "Desactivar",
            "activate": "Activar",
            "disabled_ok": "Producto desactivado.",
            "activated_ok": "Producto activado.",
            "modal_movements": "Movimientos de existencias",
            "mov_type": "Tipo",
            "mov_qty": "Cantidad",
            "mov_ref": "Referencia",
            "mov_date": "Fecha",
            "mov_user": "Usuario",
            "type_in": "Entrada",
            "type_out": "Salida",
            "type_adj": "Ajuste",
            "btn_add_movement": "Registrar movimiento",
            "empty": "Sin productos.",
            "empty_movements": "Sin movimientos.",
            "page": "Página {n} de {m} · {t} registros",
            "prev": "Anterior",
            "next": "Siguiente",
            "loading": "Cargando…",
            "saved": "Guardado.",
            "deleted": "Eliminado.",
            "error": "Error: {msg}",
            "movement_ok": "Movimiento registrado.",
            "page_title": "Inventario — productos"
        },
        "transfer_documents": {
            "menu": "Documentos (entrada / salida)",
            "breadcrumb_parent": "Inventario",
            "breadcrumb_current": "Documentos",
            "title": "Documentos de inventario",
            "subtitle": "Recepciones a almacén, entregas internas y salidas documentadas (borrador → confirmar).",
            "filter_status": "Estado",
            "filter_type": "Tipo",
            "filter_all": "Todos",
            "btn_apply": "Aplicar",
            "btn_new": "Nuevo documento",
            "btn_view": "Ver",
            "btn_continue": "Continuar",
            "th_folio": "Folio",
            "th_type": "Tipo",
            "th_status": "Estado",
            "th_created": "Creado",
            "th_creator": "Creador",
            "th_actions": "Acciones",
            "loading": "Cargando…",
            "empty": "Aún no hay documentos.",
            "empty_cta": "Crear primera recepción o salida",
            "page": "Página {n} de {m} · {t} registros",
            "prev": "Anterior",
            "next": "Siguiente",
            "type_inbound": "Recepción",
            "type_internal": "Entrega interna",
            "type_outbound": "Salida",
            "status_draft": "Borrador",
            "status_confirmed": "Confirmado",
            "status_cancelled": "Cancelado",
            "error": "Error: {msg}",
            "page_title": "Inventario — documentos"
        },
        "transfer_documents_detail": {
            "breadcrumb_new": "Nuevo",
            "title_new": "Nuevo documento",
            "title": "Documento",
            "page_title_new": "Inventario — nuevo documento",
            "page_title": "Inventario — documento {folio}",
            "btn_save_draft": "Guardar borrador",
            "btn_confirm": "Confirmar documento",
            "btn_cancel_draft": "Cancelar borrador",
            "field_folio": "Folio",
            "field_type": "Tipo de documento",
            "field_area": "Área destino",
            "field_recipient": "Usuario receptor",
            "field_supplier": "Proveedor",
            "field_supplier_ref": "Ref. proveedor (factura/remisión)",
            "field_notes": "Notas",
            "hint_internal_destination": "Al confirmar una entrega interna debe indicar al menos un área de destino o un usuario receptor.",
            "lines_title": "Líneas",
            "btn_add_line": "Añadir línea",
            "th_product": "Producto",
            "th_qty": "Cantidad",
            "lines_empty": "Sin líneas. Añada al menos una línea antes de guardar o confirmar.",
            "btn_change_product": "Cambiar",
            "aria_pick_product": "Elegir producto",
            "aria_remove_line": "Quitar línea",
            "pick_product_title": "Buscar producto de inventario",
            "pick_empty": "Sin resultados. Escriba SKU o nombre y busque.",
            "pick_use": "Usar",
            "modal_confirm_title": "Confirmar documento",
            "modal_confirm_body": "Al confirmar se aplicarán movimientos de stock (entrada o salida según el tipo). Esta acción no se puede deshacer desde aquí.",
            "modal_cancel_title": "Cancelar borrador",
            "modal_cancel_body": "El documento quedará como cancelado y no afectará el stock.",
            "saved": "Borrador guardado.",
            "confirmed_ok": "Documento confirmado.",
            "cancelled_ok": "Borrador cancelado.",
            "err_folio": "Indique un folio.",
            "err_lines": "Añada al menos una línea.",
            "err_product_line": "Cada línea debe tener un producto seleccionado.",
            "err_qty": "Cada cantidad debe ser mayor que cero.",
            "meta_title": "Auditoría",
            "meta_confirmed": "Confirmado",
            "meta_cancelled": "Cancelado"
        },
        "quick_movements": {
            "menu": "Entrada / salida rápida",
            "breadcrumb_parent": "Inventario",
            "breadcrumb_current": "Movimientos rápidos",
            "title": "Entrada y salida rápida",
            "subtitle": "Registre compras (detergente, insumos) o salidas (consumo, venta de mostrador) en un solo paso. El folio se genera automáticamente.",
            "mode_in": "Entrada (compra / recepción)",
            "mode_out": "Salida (consumo / despacho)",
            "search_ph": "Buscar por SKU o nombre…",
            "search_btn": "Buscar",
            "pick_hint": "Elija un producto y pulse Agregar. Puede sumar varias líneas antes de registrar.",
            "pick_empty": "Sin resultados. Busque otro término o cree el producto en Productos (almacén).",
            "btn_add_line": "Agregar al listado",
            "th_product": "Producto",
            "th_stock": "Stock",
            "th_qty": "Cantidad",
            "lines_title": "Productos a mover",
            "lines_empty": "Agregue al menos un producto.",
            "field_notes": "Notas (opcional)",
            "btn_submit_in": "Registrar entrada",
            "btn_submit_out": "Registrar salida",
            "btn_clear": "Vaciar listado",
            "link_products": "Administrar productos",
            "link_documents": "Documentos con folio manual",
            "success": "Movimiento registrado. Folio: {folio}",
            "err_lines": "Agregue al menos un producto con cantidad mayor a cero.",
            "err_qty": "Indique una cantidad válida.",
            "err_duplicate": "Este producto ya está en el listado. Ajuste la cantidad en la fila.",
            "page_title": "Inventario — entrada / salida rápida"
        }
    },
    "catalog": {
        "clients": {
            "breadcrumb_parent": "Catálogo",
            "breadcrumb_current": "Clientes",
            "title": "Clientes",
            "page_title": "Clientes",
            "subtitle": "Catálogo compartido; búsqueda y alta rápida también en Punto de Venta.",
            "search_ph": "Buscar nombre, email, teléfono…",
            "filter_all_categories": "Todas las clasificaciones",
            "btn_new": "Nuevo cliente",
            "th_name": "Nombre",
            "th_category": "Clasificación",
            "th_email": "Email",
            "th_phone": "Teléfono",
            "th_address": "Domicilio",
            "th_points": "Puntos",
            "th_actions": "Acciones",
            "badge_mostrador": "Mostrador (no editable)",
            "empty": "Sin resultados.",
            "loading": "Cargando…",
            "page": "Página {n} de {m} · {t} registros",
            "prev": "Anterior",
            "next": "Siguiente",
            "modal_new": "Nuevo cliente",
            "modal_edit": "Editar cliente",
            "field_name": "Nombre",
            "field_email": "Email",
            "field_phone": "Teléfono",
            "field_address": "Domicilio",
            "field_address_ph": "Calle, número, colonia, referencias…",
            "field_address_hint": "Se usará automáticamente en el POS cuando marque entrega a domicilio.",
            "field_category": "Clasificación",
            "category_none": "Sin clasificación",
            "save": "Guardar",
            "saving": "Guardando…",
            "cancel": "Cancelar",
            "delete_confirm": "¿Eliminar cliente «{name}»?",
            "delete_yes": "Sí, eliminar",
            "delete_no": "No",
            "name_required": "El nombre es obligatorio.",
            "save_error": "No se pudo guardar.",
            "delete_error": "No se pudo eliminar."
        },
        "client_categories": {
            "breadcrumb_parent": "Catálogo",
            "breadcrumb_current": "Clasificación de clientes",
            "title": "Clasificación de clientes",
            "page_title": "Clasificación clientes",
            "subtitle": "Segmenta tu cartera (VIP, frecuente, corporativo, etc.) con color para identificarlos en el catálogo y POS.",
            "refresh": "Actualizar",
            "new": "Nueva clasificación",
            "th_color": "Color",
            "th_code": "Código",
            "th_name": "Nombre",
            "th_clients": "Clientes",
            "th_sort": "Orden",
            "th_active": "Activa",
            "th_actions": "Acciones",
            "yes": "Sí",
            "no": "No",
            "edit": "Editar",
            "disable": "Desactivar",
            "empty": "Sin clasificaciones registradas.",
            "modal_new": "Nueva clasificación",
            "modal_edit": "Editar clasificación",
            "f_code": "Código",
            "f_name": "Nombre",
            "f_color": "Color",
            "f_sort": "Orden",
            "f_active": "Activa",
            "cancel": "Cancelar",
            "save": "Guardar",
            "saving": "Guardando…",
            "saved": "Clasificación actualizada.",
            "created": "Clasificación creada.",
            "disabled": "Clasificación desactivada.",
            "load_error": "No se pudo cargar el catálogo.",
            "save_error": "No se pudo guardar.",
            "name_required": "El nombre es obligatorio.",
            "color_invalid": "Color inválido. Use formato #RRGGBB."
        }
    }
}
