{
    "brand": {
        "app_name": "Control Ganadero",
        "nav_title": "Control Ganadero",
        "logo_alt": "Control Ganadero",
        "default_page_title": "Control Ganadero",
        "meta_suffix": "Control Ganadero"
    },
    "layout": {
        "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": "Productos",
            "catalog_service": "Servicio",
            "catalog_garment_types": "Tipo de prenda",
            "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"
        }
    },
    "catalogos": {
        "services": {
            "nav": "Servicios",
            "page_title": "Catálogo de servicios",
            "breadcrumb": "Servicios",
            "subtitle": "Módulo separado para tipos de servicio usados por POS TIBU.",
            "empty": "Sin servicios configurados."
        },
        "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": "Dashboard semáforo (TIBU)",
            "heading": "Órdenes en tiempo real",
            "breadcrumb_parent": "Lavandería",
            "breadcrumb_current": "Dashboard 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": "Tu área de trabajo",
            "operator_area_body": "Área asignada: {area}",
            "operator_blocked_title": "Acceso restringido",
            "operator_blocked_body": "Esta pantalla es solo para operadores (no para Recepción).",
            "operator_blocked_body_short": "No tienes acceso: esta pantalla es solo para operadores.",
            "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 productos",
            "catalog_hint": "Elija un producto configurado en administración (servicio, carga y precio vienen del producto). Agregue al carrito y, si aplica, el detalle de contenido.",
            "catalog_title_legacy": "Catálogo anterior (productos)",
            "catalog_hint_legacy": "Solo para compatibilidad con ventas antiguas por ítem de catálogo. No descuenta inventario interno TIBU.",
            "service_type": "Tipo de servicio",
            "service_type_ph": "Primero el servicio (lavado, planchado…)",
            "tibu_qty_pieces": "Cantidad (piezas)",
            "add_tibu_line": "Agregar línea",
            "add_content_line": "Contenido del producto",
            "add_content_hint": "Detalle qué prendas incluye el producto seleccionado. No se cobra; sí aparece en el ticket.",
            "add_content_select_product": "Seleccione primero un producto en el catálogo de arriba.",
            "content_for_product": "incluye",
            "add_content_btn": "Agregar contenido",
            "content_modal_btn": "Contenido del producto",
            "content_pending_hint": "{n} prenda(s) pendiente(s). Se agregarán al confirmar el producto.",
            "content_modal_title": "Contenido del producto",
            "content_modal_title_draft": "Contenido — {name}",
            "content_modal_title_cart": "Contenido de {name}",
            "content_modal_subtitle_draft": "Agregue prendas aquí; al pulsar «Agregar producto al carrito» se guardan con la línea.",
            "content_modal_subtitle_cart": "Detalle informativo del producto (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 (producto)",
            "filter_category": "Filtrar por categoría",
            "all_categories": "Todas las categorías",
            "select_product": "Producto",
            "add_catalog_btn": "Agregar producto al carrito",
            "optional_service_uses_product_or_header": "Opcional: usa el default del producto o el tipo arriba",
            "th_billing_mode": "Modo de cobro",
            "billing_piece_unit": "Por unidad (precio del producto)",
            "billing_weight_catalog": "Por peso ($/kg según producto)",
            "loading_catalog": "Cargando catálogo…",
            "badge_service": "Servicio",
            "badge_product": "Producto",
            "badge_stock": "Stock: {n}",
            "per_kg": "Por kg",
            "per_piece": "Por pieza",
            "per_kg_suffix": " / kg",
            "no_products": "No hay productos o servicios. Catálogos",
            "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_name_ph": "Ej. Juan Pérez",
            "client_email": "Correo",
            "priority": "Prioridad (SLA)",
            "priority_none": "Sin nivel específico",
            "delivery": "Entrega a domicilio",
            "delivery_address": "Dirección de entrega",
            "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 producto/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",
            "extra_cost_hint": "Se suma una vez al subtotal de esta línea. Por defecto viene del catálogo del producto.",
            "default_load_applied": "Default de carga aplicado",
            "default_billing_applied": "Default de cobro 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": "Pagos",
            "payments_hint": "Puede dividir el total entre varios métodos. Con una sola línea el monto sigue al total.",
            "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 los pagos antes de finalizar (deben sumar el total).",
            "total": "Total",
            "saving": "Guardando…",
            "submit": "Cobrar y confirmar venta",
            "open_order": "Abrir orden",
            "save_changes": "Guardar cambios",
            "finalize_order": "Finalizar orden",
            "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_saved": "Cliente registrado.",
            "client_error": "Error al guardar: {msg}",
            "sale_ok": "Venta registrada: {folio}",
            "sale_error": "Error: {msg}",
            "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_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 el tipo de servicio antes de agregar líneas TIBU por tipo de prenda.",
                "catalog_service_required": "Configure el tipo de servicio por defecto en el producto del catálogo POS (Administración).",
                "content_line_required": "Indique producto 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 producto 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_priority_level": "Prioridad (catálogo)",
            "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_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",
            "whatsapp_ready": "WhatsApp",
            "whatsapp_ready_hint": "Abrir WhatsApp Web con aviso de pedido listo",
            "whatsapp_no_phone": "Sin teléfono en el cliente registrado de esta orden",
            "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 por defecto. Los precios del POS salen del catálogo de productos o de la matriz laundry_piece_prices + pricing_rules, 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 default",
            "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 default",
            "pricing_note": "Los importes y el modo de cobro en el POS se definen en el catálogo de productos 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 productos",
            "subtitle": "Un solo catálogo para ventas en recepción: servicios, artículos por peso o por pieza y, si aplica, existencias de consumo (misma tabla que el POS). El listado antiguo de productos queda solo como archivo en Sistema.",
            "tab_categories": "Categorías",
            "tab_products": "Productos",
            "refresh": "Refrescar",
            "new_category": "Nueva categoría",
            "new_product": "Nuevo producto",
            "th_code": "Código",
            "th_name": "Nombre",
            "th_sort": "Orden",
            "th_active": "Activa",
            "th_actions": "Acciones",
            "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 producto",
            "modal_edit_prod": "Editar producto",
            "f_code": "Código",
            "f_name": "Nombre",
            "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_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 producto 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": "Producto actualizado.",
            "created_prod": "Producto creado.",
            "disabled_prod": "Producto desactivado.",
            "unit_price_help": "Se usa cuando no hay precio específico para el tipo de servicio en la lista de abajo.",
            "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": "Datos del rancho",
            "breadcrumb_parent": "Administración",
            "breadcrumb_current": "Datos del rancho",
            "title": "Configuración del rancho",
            "subtitle": "Logo, nombre y datos de contacto que aparecen en el sistema y en el inicio de sesión.",
            "section_branding": "Logo e imagen",
            "f_logo": "Archivo de logo (PNG, JPG o SVG, máx. 2 MB)",
            "f_favicon": "Favicon (icono del navegador)",
            "logo_hint": "Si no subes logo, se usa el icono verde por defecto.",
            "upload_logo": "Subir logo",
            "upload_favicon": "Subir favicon",
            "delete_logo": "Quitar logo",
            "uploading": "Subiendo...",
            "logo_uploaded": "Logo actualizado.",
            "logo_deleted": "Logo eliminado.",
            "logo_upload_error": "No se pudo subir el archivo.",
            "favicon_uploaded": "Favicon actualizado.",
            "favicon_upload_error": "No se pudo subir el favicon.",
            "section_welcome": "Mensajes de bienvenida",
            "f_descripcion": "Descripción del rancho",
            "f_bienvenida": "Texto de bienvenida (pantalla de inicio)",
            "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.",
            "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."
        }
    },
    "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": "Stock",
            "th_min_stock": "Stock mín.",
            "th_active": "Activo",
            "th_actions": "Acciones",
            "stock_hint": "Stock actualizado por movimientos (entrada/salida/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": "Stock mínimo (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 stock",
            "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álogos",
            "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…",
            "btn_new": "Nuevo cliente",
            "th_name": "Nombre",
            "th_email": "Email",
            "th_phone": "Teléfono",
            "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",
            "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."
        }
    }
}
