{
"app": {
"name": "EverShelf",
"loading": "Cargando..."
},
"nav": {
"title": "EverShelf",
"home": "Inicio",
"inventory": "Despensa",
"recipes": "Recetas",
"shopping": "Compras",
"log": "Registro",
"settings": "Ajustes"
},
"btn": {
"back": "← Volver",
"save": "💾 Guardar",
"cancel": "✕ Cancelar",
"close": "Cerrar",
"add": "✅ Añadir",
"delete": "Eliminar",
"edit": "✏️ Editar",
"use": "Usar",
"edit_item": "Editar",
"search": "🔍 Buscar",
"go": "✅ Ir",
"toggle_password": "👁️ Mostrar/Ocultar",
"load_more": "Cargar más...",
"save_config": "💾 Guardar configuración",
"save_product": "💾 Guardar producto",
"restart": "↺ Reiniciar",
"reset_default": "↺ Restablecer valores por defecto",
"save_info": "💾 Guardar información",
"retry": "🔄 Reintentar",
"yes_short": "Sí",
"no_short": "No"
},
"form": {
"select_placeholder": "-- Seleccionar --"
},
"locations": {
"dispensa": "Despensa",
"frigo": "Nevera",
"freezer": "Congelador",
"altro": "Otro"
},
"categories": {
"latticini": "Lácteos",
"carne": "Carne",
"pesce": "Pescado",
"frutta": "Fruta",
"verdura": "Verduras",
"pasta": "Pasta y Arroz",
"pane": "Pan y Panadería",
"surgelati": "Congelados",
"bevande": "Bebidas",
"condimenti": "Condimentos",
"snack": "Snacks y Dulces",
"conserve": "Conservas",
"cereali": "Cereales y Legumbres",
"igiene": "Higiene",
"pulizia": "Limpieza",
"altro": "Otro",
"select": "-- Seleccionar --"
},
"units": {
"pz": "uds",
"conf": "paq",
"g": "g",
"ml": "ml",
"pieces": "Unidades",
"grams": "Gramos",
"box": "Paquete",
"boxes": "Paquetes",
"millilitres": "Mililitros",
"from": "de"
},
"shopping_sections": {
"frutta_verdura": "Frutas y Verduras",
"carne_pesce": "Carne y Pescado",
"latticini": "Lácteos y Frescos",
"pane_dolci": "Pan y Dulces",
"pasta": "Pasta y Cereales",
"conserve": "Conservas y Salsas",
"surgelati": "Congelados",
"bevande": "Bebidas",
"pulizia_igiene": "Limpieza e Higiene",
"altro": "Otro"
},
"dashboard": {
"expired_title": "🚫 Caducado",
"expiring_title": "⏰ Caduca pronto",
"stats_period": "📊 Últimos 30 días",
"opened_title": "📦 Productos abiertos",
"review_title": "🔍 Por revisar",
"review_hint": "Cantidades inusuales. Confirma si son correctas o modifícalas.",
"quick_recipe": "Receta rápida con productos que caducan",
"banner_review_title": "Cantidad anormal",
"banner_review_action_ok": "Es correcto",
"banner_review_action_finish": "🗑️ Todo terminado",
"banner_review_action_edit": "Corregir",
"banner_review_action_weigh": "Pesar",
"banner_review_dismiss": "Ignorar",
"banner_prediction_title": "Consumo por revisar",
"banner_prediction_hint": "La estimación de consumo se adapta a los datos recientes: confirma solo si la cantidad actual es correcta.",
"banner_prediction_action_confirm": "Confirmar {qty} {unit}",
"banner_prediction_action_weigh": "Pesar ahora",
"banner_prediction_action_edit": "Actualizar cantidad",
"banner_expired_title": "Producto caducado",
"banner_expired_today": "Caducado hoy",
"banner_expired_days": "Caducado hace {days} días",
"banner_expired_action_use": "Usar de todas formas",
"banner_expired_action_finished": "¡Ya lo terminé!",
"banner_expired_action_throw": "Lo tiré",
"banner_expired_action_edit": "Corregir fecha",
"banner_anomaly_action_edit": "Corregir inventario",
"banner_anomaly_action_dismiss": "La cantidad es correcta",
"banner_no_expiry_title": "Caducidad faltante: {name}",
"banner_no_expiry_detail": "Este producto no tiene fecha de caducidad. ¿Quieres añadir una o confirmar que no caduca?",
"banner_no_expiry_action_set": "Establecer fecha de caducidad",
"banner_no_expiry_action_dismiss": "No caduca ✓",
"banner_no_expiry_toast_dismissed": "Marcado como «sin fecha de caducidad»",
"banner_expiring_title": "Caduca pronto",
"banner_expiring_today": "¡Caduca hoy!",
"banner_expiring_tomorrow": "Caduca mañana",
"banner_expiring_days": "Caduca en {days} días",
"banner_expiring_action_use": "Usar ahora",
"banner_finished_title": "¿terminado?",
"banner_finished_detail": "Registré que {name} llegó a cero de stock. ¿Realmente se acabó o todavía tienes algo?",
"banner_finished_action_yes": "Sí, se acabó",
"banner_finished_action_no": "No, todavía tengo",
"banner_review_unusual_pkg_title": "Tamaño de paquete inusual",
"banner_review_unusual_pkg_detail": "Configuraste un paquete de {qty} {unit} — el tamaño parece muy grande. Comprueba si es correcto o edita.",
"banner_review_low_qty_title": "Cantidad muy baja",
"banner_review_low_qty_detail": "Solo tienes {qty} en stock — parece muy poco, puede ser un error de escritura. Confirma si es correcto.",
"banner_review_high_qty_title": "Cantidad inusualmente alta",
"banner_review_high_qty_detail": "Tienes {qty} en stock — la cifra parece muy alta. Confirma si es correcto o edita.",
"banner_prediction_rate_day": "Media ~{n} {unit}/día",
"banner_prediction_rate_week": "Media ~{n} {unit}/semana",
"banner_prediction_days_ago": "Hace {n} días reabasteciste",
"banner_prediction_more": "estimación anterior: {expected} {unit}{time}; cantidad actual: {actual} {unit}.",
"banner_prediction_less": "estimación: {expected} {unit}{time}; cantidad actual: {actual} {unit}. Si tu ritmo de uso cambió, la previsión se actualiza automáticamente.",
"banner_finished_zero": "El inventario muestra cero, pero los movimientos registrados sugieren que no debería estar vacío.",
"banner_finished_expected": "Según los registros deberías tener todavía {qty} {unit}.",
"banner_finished_check": "¿Puedes comprobarlo?",
"banner_anomaly_phantom_title": "tienes más stock del esperado",
"banner_anomaly_phantom_detail": "El inventario indica {inv_qty} {unit}, pero según los registros solo deberías tener {expected_qty} {unit}. ¿Añadiste stock sin registrarlo?",
"banner_anomaly_untracked_title": "stock no registrado como entrada",
"banner_anomaly_untracked_detail": "Tienes {inv_qty} {unit} en inventario, pero las salidas registradas superan las entradas — el stock inicial probablemente nunca se añadió como transacción «entrada». Puedes corregir la cantidad o registrar las entradas faltantes.",
"banner_anomaly_ghost_title": "tienes menos stock del esperado",
"banner_anomaly_ghost_detail": "Según las operaciones registradas deberías tener {expected_qty} {unit} de {name}, pero el inventario solo muestra {inv_qty} {unit}. ¿Tomaste stock sin registrarlo?",
"banner_dup_loss_title": "Control de doble salida: {name}",
"banner_dup_loss_detail": "Posible registro duplicado en {location}: dos salidas seguidas ({qty_pair}) en ~{seconds}s. Revisa y corrige si hace falta.",
"banner_dup_loss_action_fix": "Corregir cantidad",
"banner_dup_loss_action_open": "Abrir ficha del producto",
"banner_dup_loss_action_done": "Ya revisado",
"banner_dup_loss_toast_done": "Control marcado como revisado",
"consumed": "Consumido: {n} ({pct}%)",
"wasted": "Desperdiciado: {n} ({pct}%)",
"more_opened": "y {n} más abiertos...",
"banner_expired_detail": "{when} · aún tienes {qty}.",
"banner_opened_detail": "{when} en {location} · aún tienes {qty}.",
"banner_explain_title": "Pedir explicación a Gemini",
"banner_explain_btn": "Explicar",
"banner_analyzing": "🤖 Analizando…"
},
"inventory": {
"title": "Despensa",
"filter_all": "Todo",
"search_placeholder": "🔍 Buscar producto...",
"recent_title": "🕐 Usados recientemente",
"popular_title": "⭐ Más usados",
"empty": "No hay productos aquí.\n¡Escanea un producto para añadirlo!",
"no_items_found": "No se encontraron artículos",
"qty_remainder_suffix": "restante",
"vacuum_badge": "🫙 Al vacío",
"opened_badge": "📭 Abierto",
"label_expiry": "📅 Caducidad",
"label_storage": "🫙 Almacenamiento",
"label_status": "📭 Estado",
"opened_since": "Abierto desde el {date}",
"label_position": "📍 Ubicación",
"label_quantity": "📦 Cantidad",
"label_added": "📅 Añadido",
"empty_text": "No hay productos aquí.
¡Escanea un producto para añadirlo!",
"empty_db": "No hay productos en la base de datos.
¡Escanea un producto para empezar!",
"qty_trace": "< 1"
},
"scan": {
"title": "Escáner",
"mode_shopping": "🛒 Modo compras",
"mode_shopping_end": "✅ Finalizar compras",
"spesa_btn": "🛒 Compras",
"zoom": "Zoom",
"tab_barcode": "Código de barras",
"tab_name": "Nombre",
"tab_ai": "IA",
"recents_label": "Recientes",
"torch_hint": "Linterna",
"torch_on": "Linterna encendida",
"torch_off": "Linterna apagada",
"torch_unavailable": "Linterna no disponible en este dispositivo",
"flip_hint": "Cambiar cámara",
"flip_front": "Cámara frontal",
"flip_back": "Cámara trasera",
"num_ocr_btn": "🔢 Leer números con IA",
"num_ocr_searching": "Buscando código de barras con IA...",
"num_ocr_found": "Código encontrado: {code}",
"num_ocr_not_found": "No se encontró código de barras en la imagen",
"barcode_placeholder": "Introduce el código de barras...",
"quick_name_divider": "o escribe el nombre",
"quick_name_placeholder": "Ej.: Manzanas, Calabacín, Pan...",
"manual_entry": "✏️ Entrada manual",
"ai_identify": "🤖 Identificar con IA",
"hint": "Escanea el código de barras, escribe el nombre del producto o usa la IA para identificarlo",
"debug_toggle": "🐛 Registro de depuración",
"barcode_acquired": "🔖 Código de barras escaneado: {code}",
"scan_barcode": "🔖 Escanear código de barras",
"create_named": "Crear {name}",
"new_without_barcode": "Nuevo producto sin código de barras",
"status_ready": "Apunta la cámara al código de barras",
"status_scanning": "Escaneando...",
"status_partial": "Detectado: {code} — verificando...",
"status_invalid": "Inválido: {code} — reintentando",
"status_confirmed": "Confirmado!",
"status_parallel": "Escaneo combinado activo...",
"status_ocr_searching": "Estoy leyendo los números del código de barras...",
"status_ai_visual_searching": "Ahora intento reconocer el producto...",
"method_ai_ocr": "Gemini OCR",
"method_ai_vision": "Gemini Vision",
"ai_fallback_searching": "Identificación de IA en curso...",
"ai_fallback_found": "Producto identificado por IA",
"ai_fallback_not_found": "IA: producto no reconocido",
"ai_fallback_exhausted": "IA: producto no reconocido — prueba a escanear el código",
"ai_overlay_msg": "Gemini Vision está analizando el producto...",
"ai_retry_btn": "Reintentar con IA",
"ai_match_title": "Producto reconocido por IA",
"ai_match_subtitle": "Elige un producto ya en despensa o agrega el detectado.",
"ai_match_existing": "Posibles coincidencias en despensa",
"ai_match_none": "No se encontraron productos similares en despensa.",
"ai_match_use_btn": "Usar este",
"ai_match_add_btn": "Agregar \"{name}\"",
"ai_detected_label": "IA detecto"
},
"action": {
"title": "¿Qué quieres hacer?",
"add_btn": "📥 AÑADIR",
"add_sub": "a la despensa/nevera",
"use_btn": "📤 USAR / CONSUMIR",
"use_sub": "de la despensa/nevera",
"have_title": "📦 ¡Ya en stock!",
"add_more_sub": "añadir más",
"use_qty_sub": "cuánto usaste",
"throw_btn": "🗑️ DESECHAR",
"throw_sub": "tirar",
"edit_sub": "caducidad, ubicación…",
"create_recipe_btn": "Receta"
},
"add": {
"title": "Añadir a la despensa",
"location_label": "📍 ¿Dónde lo guardas?",
"quantity_label": "📦 Cantidad",
"conf_size_label": "📦 Cada paquete contiene:",
"conf_size_placeholder": "ej. 300",
"vacuum_label": "🫙 Al vacío",
"vacuum_hint": "La fecha de caducidad se ampliará automáticamente",
"submit": "✅ Añadir",
"purchase_type_label": "🛒 Este producto es...",
"new_btn": "🆕 Recién comprado",
"existing_btn": "📦 Ya lo tenía",
"remaining_label": "📦 Cantidad restante",
"remaining_hint": "¿Aproximadamente cuánto queda?",
"remaining_full": "🟢 Lleno",
"remaining_half": "🟠 Por la mitad",
"estimated_expiry": "Caducidad estimada:",
"suffix_freezer": "(congelador)",
"suffix_vacuum": "(al vacío)",
"hint_modify": "📝 Puedes cambiar la fecha o escanearla con la cámara",
"scan_expiry_title": "📷 Escanear fecha de caducidad",
"product_added": "✅ ¡{name} añadido!{qty}",
"suffix_freezer_vacuum": "(congelador + al vacío)",
"history_badge_tip": "Media de {n} entradas anteriores",
"vacuum_question": "¿Al vacío?",
"vacuum_saved": "🔒 ¡Al vacío!"
},
"use": {
"title": "Usar / Consumir",
"location_label": "📍 ¿De dónde?",
"quantity_label": "¿Cuánto usaste?",
"change": "cambiar",
"partial_hint": "O especifica la cantidad usada:",
"partial_piece_hint": "¿Usaste solo una parte?",
"piece": "unidad",
"one_whole": "1 entero",
"use_all": "🗑️ Todo usado / Terminado",
"submit": "📤 Usar esta cantidad",
"available": "📦 Disponible:",
"opened_badge": "ABIERTO",
"not_in_inventory": "⚠️ Producto no en inventario.",
"expiry_warning": "⚠️ ¡Usa primero el{loc} que caduca el {date} — {when}!",
"expiry_warning_opened": "⚠️ El{loc} lleva abierto {when} — ¡úsalo primero!",
"throw_title": "🗑️ Desechar producto",
"throw_all": "🗑️ Desechar TODO ({qty})",
"throw_qty_label": "¿Cuánto desechar?",
"throw_qty_hint": "o introduce una cantidad:",
"throw_partial_btn": "🗑️ Desechar esta cantidad",
"when_expired": "caducado hace {n} días",
"when_today": "caduca hoy",
"when_tomorrow": "caduca mañana",
"when_days": "caduca en {n} días",
"toast_used": "📤 {qty} de {name} usado",
"toast_bring": "🛒 Producto terminado → añadido a Bring!",
"toast_opened_finished": "🔓 ¡Paquete abierto de {name} terminado!",
"disambiguation_hint": "¿Qué quieres decir con «todo terminado»?",
"disambiguation_all": "🗑️ Terminar TODO ({qty})",
"error_exceeds_stock": "⚠️ ¡No puedes usar más de lo que tienes disponible!",
"use_all_confirm_title": "✅ Terminar todo",
"use_all_confirm_msg": "Confirma que has terminado el producto:",
"use_all_confirm_btn": "✅ Sí, terminado",
"throw_all_confirm_title": "🗑️ Desechar todo",
"throw_all_confirm_msg": "¿Realmente quieres tirar todo el producto?",
"throw_all_confirm_btn": "🗑️ Sí, desechar"
},
"product": {
"title_new": "Nuevo producto",
"title_edit": "Editar producto",
"ai_fill": "📷 Sacar foto e identificar con IA",
"ai_fill_hint": "La IA rellenará automáticamente los campos del producto",
"name_label": "🏷️ Nombre del producto *",
"name_placeholder": "Ej.: Leche entera, Pasta penne...",
"brand_label": "🏢 Marca",
"brand_placeholder": "Ej.: Barilla, Danone, Heinz...",
"category_label": "📂 Categoría",
"unit_label": "📏 Unidad de medida",
"default_qty_label": "🔢 Cantidad por defecto",
"conf_size_label": "📦 Cada paquete contiene:",
"conf_size_placeholder": "ej. 300",
"notes_label": "📝 Notas",
"notes_placeholder": "Ej.: sin lactosa, ecológico, guardar en nevera tras abrir...",
"barcode_label": "🔖 Código de barras",
"barcode_placeholder": "Código de barras (si disponible)",
"barcode_hint": "⚠️ ¡Añade el código de barras para la próxima vez solo tendrás que escanear!",
"submit": "💾 Guardar producto",
"name_required": "Introduce el nombre del producto",
"conf_size_required": "Especifica el contenido del paquete",
"expiry_estimated": "Caducidad estimada:",
"scan_expiry": "Escanear fecha de caducidad",
"expiry_hint": "📝 Puedes editar la fecha o escanearla con la cámara",
"add_batch": "📦 + Lote con fecha diferente",
"package_info": "📦 Paquete: {info}",
"edit_catalog": "⚙️ Editar información del producto (nombre, marca, categoría…)",
"not_recognized": "⚠️ Producto no reconocido",
"edit_info": "✏️ Editar información",
"modify_details": "EDITAR\ncaducidad, ubicación…",
"already_in_pantry": "📋 Ya en la despensa",
"no_barcode": "Sin código de barras",
"unknown_product": "Producto no reconocido",
"edit_name_brand": "Editar nombre/marca",
"weight_label": "Peso",
"origin_label": "Origen",
"labels_label": "Etiquetas",
"select_variant": "Selecciona la variante exacta o usa los datos de IA:"
},
"products": {
"title": "📦 Todos los productos",
"search_placeholder": "🔍 Buscar producto...",
"empty": "No hay productos en la base de datos.\n¡Escanea un producto para empezar!",
"no_category": "No hay productos en esta categoría"
},
"recipes": {
"title": "🍳 Recetas",
"generate": "✨ Generar nueva receta",
"archive_empty": "No hay recetas guardadas. ¡Genera tu primera receta!",
"dialog_title": "🍳 Receta",
"dialog_desc": "Generaré una receta saludable usando ingredientes de la despensa, priorizando los productos que caducan.",
"meal_label": "🕐 ¿Qué comida?",
"persons_label": "👥 ¿Para cuántas personas?",
"meal_type_label": "🎯 Tipo de comida",
"opt_fast": "⚡ Comida rápida",
"opt_light": "🥗 Apetito ligero",
"opt_expiry": "⏰ Priorizar productos que caducan",
"opt_healthy": "💚 Extra saludable",
"opt_opened": "📦 Priorizar productos abiertos",
"opt_zero_waste": "♻️ Cero desperdicio",
"generate_btn": "✨ Generar receta",
"loading_msg": "Preparando tu receta...",
"start_cooking": "👨🍳 Modo cocina",
"regenerate": "🔄 Generar otra",
"regen_choice_title": "¿Qué quieres hacer con esta receta?",
"regen_replace": "🔄 Generar otra (descartar esta)",
"regen_save_new": "💾 Guardar en el archivo y generar una nueva",
"close_btn": "✅ Cerrar",
"ingredients_title": "🧾 Ingredientes",
"tools_title": "Equipo necesario",
"steps_title": "👨🍳 Pasos",
"no_steps": "No hay pasos disponibles",
"generate_error": "Error de generación",
"persons_short": "com.",
"use_ingredient_title": "Usar ingrediente",
"recipe_qty_label": "Receta",
"from_where_label": "¿De dónde?",
"amount_label": "Cuánto",
"use_amount_btn": "Usar esta cantidad",
"use_all_btn": "Usar TODO / Terminado",
"packs_label": "Paquetes",
"quantity_in_total": "Cantidad en {unit} (total: {total})",
"packs_of_have": "Paquetes de {size} (tienes {count} paquetes)",
"scale_wait_stable": "Espera 10s de peso estable para el relleno automático…",
"ingredient_scaled_toast": "📦 ¡Ingrediente deducido de la despensa!",
"finished_added_bring_toast": "🛒 Producto terminado → ¡añadido a Bring!",
"load_error": "Error de carga",
"favorite": "Añadir a favoritos",
"unfavorite": "Quitar de favoritos",
"adjust_persons": "Personas"
},
"shopping": {
"title": "🛒 Lista de la compra",
"bring_loading": "Conectando a Bring!...",
"bring_not_configured": "Bring! no está configurado. Añade tu email y contraseña en los ajustes.",
"tab_to_buy": "🛍️ Por comprar",
"tab_forecast": "🧠 Previsión",
"total_label": "💰 Total estimado",
"section_to_buy": "🛍️ Por comprar",
"suggestions_title": "💡 Sugerencias IA",
"suggestions_add": "✅ Añadir selección a Bring!",
"search_prices": "🔍 Buscar todos los precios",
"suggest_btn": "Sugerir qué comprar",
"smart_title": "🧠 Predicciones inteligentes",
"smart_empty": "No hay predicciones disponibles.
Añade productos a tu despensa para recibir predicciones inteligentes.",
"smart_filter_all": "Todo",
"smart_filter_critical": "🔴 Urgente",
"smart_filter_high": "🟠 Pronto",
"smart_filter_medium": "🟡 Planificar",
"smart_filter_low": "🟢 Previsión",
"smart_add": "🛒 Añadir selección a Bring!",
"empty": "¡Lista de la compra vacía!\nUsa el botón de abajo para generar sugerencias.",
"already_in_list": "🛒 \"{name}\" ya está en la lista de la compra",
"already_in_list_short": "ℹ️ Ya en la lista de la compra",
"add_prompt": "¿Quieres añadirlo a la lista de la compra?",
"smart_already": "📊 Las predicciones de compra ya predicen {name}",
"all_searched": "Todos los productos ya han sido buscados. Usa 🔄 para buscar individualmente.",
"search_complete": "Búsqueda completada: {count} productos",
"removed_sufficient": "🧹 {removed} producto(s) con stock suficiente eliminado(s) de la lista",
"suggest_buy": "🛒 Comprar: {qty} {unit}",
"suggest_buy_approx": "🛒 Al menos: {qty} {unit}",
"suggest_buy_tip": "Cantidad sugerida basada en tus últimos 14 días de consumo",
"suggest_buy_approx_tip": "Estimación mínima basada en el consumo (compra el tamaño de paquete más cercano)",
"bring_badge": "🛒 Ya en Bring!",
"add_urgent_toast": "🔴 {n} producto(s) urgente(s) añadido(s) automáticamente a Bring!",
"migration_done": "✅ {migrated} actualizado(s), {skipped} ya estaban ok",
"added_to_bring": "🛒 {n} productos añadidos a Bring!",
"added_to_bring_skip": "{n} ya presentes",
"all_on_bring": "¡Todos los productos ya estaban en Bring!",
"freq_high": "📈 Frecuente",
"freq_regular": "📊 Regular",
"freq_occasional": "📉 Ocasional",
"out_of_stock": "Sin stock",
"scan_toast": "📷 Escanear: {name}",
"empty_category": "No hay productos en esta categoría",
"session_empty": "🛒 Sin productos aún",
"urgency_critical": "Urgente",
"urgency_high": "Pronto",
"urgency_medium": "Planificar",
"urgency_low": "Previsión",
"urgency_medium_short": "Medio",
"urgency_low_short": "Ok",
"tag_urgent": "🔴 Urgente",
"tag_priority": "⭐ Prioridad",
"tag_check": "✅ Comprobar",
"smart_already_predicted": "📊 Las predicciones inteligentes ya predicen {name}{urgency}.",
"item_removed": "✅ ¡{name} eliminado de la lista!",
"urgency_spec_critical": "⚡ Urgente",
"urgency_spec_high": "🟠 Pronto",
"bring_add_n": "Añadir {n} a Bring!",
"bring_add_selected": "Añadir selección a Bring!",
"bring_adding": "Añadiendo...",
"bring_added_one": "1 producto añadido a Bring!",
"bring_added_many": "{n} productos añadidos a Bring!",
"bring_skipped": "({n} ya en la lista)",
"force_sync": "Forzar sincronización de Bring!",
"scan_target_label": "Estás buscando",
"scan_target_found": "¡Encontrado! Eliminar de la lista",
"bring_add_one": "Añadir 1 producto a Bring!",
"bring_add_many": "Añadir {n} productos a Bring!",
"syncing": "Sincronizando…",
"sync_done": "Sincronización completada",
"price_searching": "Buscando...",
"search_action": "Buscar",
"open_action": "Abrir",
"not_found": "No encontrado",
"search_price": "Buscar precio",
"tap_to_scan": "Toca para escanear",
"tag_title": "Etiqueta",
"remove_title": "Eliminar",
"found_count": "{found}/{total} productos encontrados",
"savings_offers": "· 🏷️ Ahorras {amount}€ con ofertas",
"searching_progress": "Buscando {current}/{total}...",
"remove_error": "Error al eliminar",
"btn_fetch_prices": "Buscar precios",
"price_total_label": "💰 Total estimado:",
"price_loading": "Buscando precios…",
"price_not_found": "precio n/d",
"suggest_loading": "Analizando...",
"suggest_error": "Error al generar sugerencias",
"priority_high": "Alta",
"priority_medium": "Media",
"priority_low": "Baja",
"smart_last_update": "Actualizado {time}",
"names_already_updated": "Todos los nombres ya están actualizados"
},
"ai": {
"title": "🤖 Identificación IA",
"capture": "📸 Sacar foto",
"retake": "🔄 Repetir",
"hint": "Saca una foto del producto y la IA intentará identificarlo",
"identifying": "🤖 Identificando producto...",
"no_api_key": "⚠️ Clave API de Gemini no configurada.\nAñade GEMINI_API_KEY al archivo .env en el servidor.",
"fields_filled": "✅ Campos rellenados por IA",
"use_data": "✅ Usar datos de IA",
"use_data_no_barcode": "✅ Usar datos de IA (sin código de barras)"
},
"log": {
"title": "📒 Registro de operaciones",
"type_added": "Añadido",
"type_waste": "Desechado",
"type_used": "Usado",
"type_bring": "Añadido a Bring!",
"undone_badge": "Deshecho",
"undo_title": "Deshacer esta operación",
"load_error": "Error al cargar el registro",
"empty": "No hay operaciones registradas.",
"undo_action_remove": "eliminación de",
"undo_action_restore": "reabastecimiento de",
"undo_confirm": "¿Deshacer esta operación?\n→ {action} {name}",
"undo_success": "↩ Operación deshecha para {name}",
"already_undone": "Operación ya deshecha",
"too_old": "No se pueden deshacer operaciones de más de 24 horas",
"undo_error": "Error al deshacer",
"recipe_prefix": "Receta"
},
"chat": {
"title": "Chef Gemini",
"welcome": "¡Hola! Soy tu asistente de cocina",
"welcome_desc": "¡Pídeme que te prepare un zumo, un snack, un plato rápido… Conozco tu despensa, tus electrodomésticos y tus preferencias!",
"suggestion_snack": "🍿 Snack rápido",
"suggestion_juice": "🥤 Zumo/Batido",
"suggestion_light": "🥗 Algo ligero",
"suggestion_expiry": "⏰ Usar productos que caducan",
"clear": "Nueva conversación",
"placeholder": "Pregunta algo...",
"cleared": "Chat borrado",
"suggestion_snack_text": "¿Qué puedo preparar como snack rápido?",
"suggestion_juice_text": "Hazme un zumo o batido con lo que tengo",
"suggestion_light_text": "Tengo hambre pero quiero algo ligero",
"suggestion_expiry_text": "¿Qué está a punto de caducar y cómo puedo usarlo?",
"transfer_to_recipes": "Transferir a recetas",
"transferring": "Transfiriendo...",
"transferred": "¡Añadido a recetas!",
"open_recipe": "Abrir receta",
"quick_recipe_prompt": "¡Sugiere una receta rápida PARA UNA PERSONA usando los productos que caducan primero! Ignora el congelador, céntrate en la nevera y la despensa."
},
"cooking": {
"close": "Cerrar",
"tts_btn": "Leer en voz alta",
"restart": "↺ Reiniciar",
"replay": "🔊 Repetir",
"timer": "⏱️ {time} · Temporizador",
"prev": "◀ Anterior",
"next": "Siguiente ▶",
"ingredient_used": "✔️ Deducido",
"ingredient_use_btn": "📦 Usar",
"ingredient_deduct_title": "Deducir de la despensa",
"timer_expired_tts": "¡Temporizador {label} finalizado!",
"timer_warning_tts": "¡Atención! {label}: ¡10 segundos restantes!",
"recipe_done_tts": "¡Receta completada! ¡Buen provecho!",
"expires_chip": "cad. {date}",
"finish": "✅ Finalizar",
"step_fallback": "Paso {n}",
"zerowaste_label": "♻️ Desperdicio",
"zerowaste_tip_title": "Consejo sin desperdicios"
},
"settings": {
"title": "⚙️ Ajustes",
"tab_api": "Claves API",
"tab_bring": "Bring!",
"tab_recipe": "Recetas",
"tab_mealplan": "Plan semanal",
"tab_appliances": "Electrodomésticos",
"tab_spesa": "Compra online",
"tab_camera": "Cámara",
"tab_security": "Seguridad",
"tab_tts": "Voz (TTS)",
"tab_language": "Idioma",
"tab_scale": "Báscula inteligente",
"gemini": {
"title": "🤖 Google Gemini IA",
"hint": "Clave API para identificación de productos, fechas de caducidad y recetas.",
"key_label": "Clave API Gemini"
},
"bring": {
"title": "🛒 Lista de la compra Bring!",
"hint": "Credenciales para la integración con la lista de la compra Bring!",
"email_label": "📧 Email Bring!",
"password_label": "🔒 Contraseña Bring!"
},
"price": {
"title": "💰 Estimación de precios (IA)",
"hint": "Mostrar el coste estimado por producto en la lista de la compra usando IA.",
"enabled_label": "Activar estimación de precios",
"country_label": "🌍 País de referencia",
"currency_label": "💱 Moneda",
"update_label": "🔄 Actualizar precios cada",
"update_suffix": "meses"
},
"recipe": {
"title": "🍳 Preferencias de recetas",
"hint": "Configura las opciones predeterminadas para la generación de recetas.",
"persons_label": "👥 Raciones por defecto",
"options_label": "🎯 Opciones de receta por defecto",
"fast": "⚡ Comida rápida",
"light": "🥗 Comida ligera",
"expiry": "⏰ Prioridad caducidad",
"healthy": "💚 Extra saludable",
"opened": "📦 Prioridad productos abiertos",
"zerowaste": "♻️ Cero desperdicio",
"dietary_label": "🚫 Intolerancias / Restricciones",
"dietary_placeholder": "Ej.: sin gluten, sin lactosa, vegetariano..."
},
"mealplan": {
"title": "📅 Plan de comidas semanal",
"hint": "Establece el tipo de comida para cada día. Se usará como guía en la generación de recetas.",
"enabled": "✅ Activar plan semanal",
"legend": "🌤️ = Almuerzo · 🌙 = Cena · Toca un badge para cambiarlo.",
"types_title": "📋 Tipos disponibles",
"reset_btn": "↺ Restaurar valores por defecto"
},
"appliances": {
"title": "🔌 Electrodomésticos disponibles",
"hint": "Indica los electrodomésticos que tienes. Se tendrán en cuenta en la generación de recetas.",
"new_placeholder": "Ej.: Panificadora, Thermomix, Freidora de aire...",
"quick_title": "Añadir rápido:",
"oven": "🔥 Horno",
"microwave": "📡 Microondas",
"air_fryer": "🍟 Freidora de aire",
"bread_maker": "🍞 Panificadora",
"bimby": "🤖 Thermomix/Cookeo",
"mixer": "🌀 Robot de cocina",
"steamer": "♨️ Vaporera",
"pressure_cooker": "🫕 Olla a presión",
"toaster": "🍞 Tostadora",
"blender": "🍹 Batidora",
"empty": "No hay electrodomésticos añadidos"
},
"spesa": {
"title": "🛍️ Compra online",
"hint": "Configura el proveedor de compra online.",
"provider_label": "🏪 Proveedor",
"email_label": "📧 Email",
"password_label": "🔒 Contraseña",
"login_btn": "🔐 Iniciar sesión",
"ai_prompt_label": "🤖 Prompt IA de selección de producto",
"ai_prompt_placeholder": "Instrucciones para la IA al elegir entre varios productos...",
"ai_prompt_hint": "La IA usa este prompt para elegir el producto más apropiado de los resultados. Deja vacío para el comportamiento por defecto.",
"configure_first": "Configura primero la compra online en ajustes",
"missing_credentials": "Introduce email y contraseña",
"login_in_progress": "Iniciando sesión...",
"login_error_prefix": "Error:",
"login_network_error_prefix": "Error de red:",
"login_success_default": "¡Inicio de sesión exitoso!",
"result_name_label": "Nombre",
"result_card_label": "Tarjeta",
"result_pickup_label": "Punto de recogida",
"result_points_label": "Puntos de fidelidad",
"connected_relogin": "✅ Conectado — Iniciar sesión de nuevo",
"connected_as": "Conectado como {name}"
},
"camera": {
"title": "📷 Cámara",
"hint": "Elige qué cámara usar para el escaneo de códigos de barras e identificación IA.",
"device_label": "📸 Cámara por defecto",
"back": "📱 Trasera (por defecto)",
"front": "🤳 Frontal",
"devices_hint": "Si tienes varias cámaras, puedes seleccionar una específica de la lista de arriba tras conceder los permisos.",
"detect_btn": "🔄 Detectar cámaras",
"ai_fallback_label": "Identificación visual IA (repuesto 5s)",
"ai_fallback_hint": "Si no se lee ningún código de barras en 5 segundos, se envía automáticamente un fotograma a la IA para identificar el producto visualmente. Requiere Gemini configurado."
},
"security": {
"title": "🔒 Certificado HTTPS",
"hint": "Si el navegador muestra el error «Tu conexión no es privada» (ERR_CERT_AUTHORITY_INVALID), necesitas instalar el certificado CA en el dispositivo.",
"download_btn": "📥 Descargar certificado CA",
"token_title": "🔑 Token de ajustes",
"token_label": "Token de acceso",
"token_hint": "Si `SETTINGS_TOKEN` está configurado en el `.env` del servidor, introduce el token aquí antes de guardar los ajustes. Deja vacío si no está configurado.",
"token_placeholder": "(vacío = sin protección)",
"token_required_hint": "🔒 Este servidor requiere un token para guardar los ajustes.",
"cert_instructions": "Instrucciones para Chrome (Android):
1. Descarga el certificado de arriba
2. Ve a Ajustes → Seguridad y privacidad → Más ajustes de seguridad → Instalar desde almacenamiento
3. Selecciona el archivo EverShelf_CA.crt descargado
4. Elige «CA» y confirma
5. Reinicia Chrome
Instrucciones para Chrome (PC):
1. Descarga el certificado de arriba
2. Ve a chrome://settings/certificates
3. Pestaña «Autoridades» → Importar → selecciona el archivo
4. Marca «Confiar en este certificado para identificar sitios web»
5. Reinicia Chrome"
},
"tts": {
"title": "🔊 Voz & TTS",
"hint": "Configura la síntesis de voz mediante cualquier API REST externa. Los pasos de la receta y los temporizadores expirados se enviarán al endpoint configurado.",
"enabled": "✅ Activar TTS",
"engine_label": "⚙️ Motor TTS",
"engine_browser": "🔇 Navegador (sin conexión, sin configuración requerida)",
"engine_server": "🌐 Servidor externo (Home Assistant, API REST...)",
"voice_label": "🗣️ Voz",
"rate_label": "⚡ Velocidad",
"pitch_label": "🎵 Tono",
"url_label": "🌐 URL del endpoint",
"method_label": "📡 Método HTTP",
"auth_label": "🔐 Autenticación",
"auth_bearer": "Bearer Token",
"auth_custom": "Cabecera personalizada",
"auth_none": "Ninguna",
"token_label": "🔑 Bearer Token",
"custom_header_name": "📋 Nombre de cabecera",
"custom_header_value": "📋 Valor de cabecera",
"content_type_label": "📄 Content-Type",
"payload_key_label": "🗝️ Campo de texto en el payload",
"payload_key_hint": "Nombre del campo JSON que contendrá el texto a leer (ej.: message, text).",
"extra_fields_label": "➕ Campos adicionales (JSON)",
"extra_fields_placeholder": "{\"entity_id\": \"media_player.salon\"}",
"extra_fields_hint": "Campos adicionales a incluir en el payload, en formato JSON. Deja vacío si no es necesario.",
"test_btn": "🔊 Enviar voz de prueba",
"voices_loading": "Cargando voces…",
"voice_not_supported": "Voz no compatible con este navegador",
"voices_none": "No hay voces disponibles en este dispositivo",
"voices_hint": "Las voces disponibles dependen del SO y el navegador. Pulsa ↺ si la lista no carga.",
"url_missing": "⚠️ URL del endpoint faltante.",
"test_sending": "⏳ Enviando…",
"test_ok": "✅ Respuesta {code} — comprueba que el altavoz haya hablado.",
"heard_question": "¿Has escuchado la voz?",
"heard_yes": "Sí, la escuché",
"heard_no": "No, no escuché nada",
"test_ok_kiosk": "TTS funcionando.",
"test_fail_steps": "Comprueba: 1) el volumen del multimedia no es 0; 2) Google Text-to-Speech está instalado y actualizado; 3) el paquete de voz español está descargado en la configuración TTS de Android."
},
"language": {
"title": "🌐 Idioma",
"hint": "Selecciona el idioma de la interfaz.",
"label": "🌐 Idioma",
"restart_notice": "La página se recargará para aplicar el nuevo idioma."
},
"screensaver": {
"label": "Activar protector de pantalla",
"card_title": "🌙 Protector de pantalla",
"card_hint": "Muestra un reloj con información útil después de 5 minutos de inactividad. Desactivado por defecto.",
"timeout_1": "1 minuto",
"timeout_2": "2 minutos",
"timeout_5": "5 minutos",
"timeout_10": "10 minutos",
"timeout_15": "15 minutos",
"timeout_30": "30 minutos",
"timeout_60": "1 hora",
"start_after": "⏱️ Iniciar tras"
},
"scale": {
"title": "⚖️ Báscula inteligente",
"hint": "Conecta una báscula Bluetooth mediante la pasarela Android para leer el peso automáticamente.",
"tab": "Báscula inteligente",
"enabled": "✅ Activar báscula inteligente",
"url_label": "🌐 URL de la pasarela WebSocket",
"url_placeholder": "ws://192.168.1.x:8765",
"url_hint": "URL mostrada por la app Android (misma red Wi-Fi). Ej.:",
"test_btn": "🔗 Probar conexión",
"download_btn": "📥 Descargar pasarela Android (APK)",
"download_hint": "App Android que conecta tu báscula BLE con EverShelf.",
"download_sub": "Fuente: evershelf-scale-gateway/ en la raíz del proyecto",
"live_weight": "peso en tiempo real",
"auto_reconnect": "🔁 Reconexión: automática",
"kiosk_title": "📡 Báscula BLE integrada en el kiosco",
"kiosk_hint": "La báscula está gestionada directamente por la pasarela BLE interna del kiosco. Para vincular un nuevo dispositivo, usa el asistente de configuración.",
"kiosk_reconfigure": "🔄 Reconfigurar báscula BLE",
"ble_protocols": "
🔌 Protocolos BLE soportados:
http://localhost/?code=4%2F0A...) y pégala aquí.",
"gdrive_code_submit": "Confirmar",
"gdrive_code_empty": "Pega primero la URL o el código de autorización",
"gdrive_redirect_uri_label": "URI de redirección (agregar en Google Cloud Console):",
"gdrive_oauth_authorize": "Autorizar con Google",
"gdrive_oauth_authorized": "Autorizado",
"gdrive_oauth_not_authorized": "Aún no autorizado",
"gdrive_oauth_window_opened": "Ventana abierta — autoriza y regresa aquí",
"gdrive_oauth_how_to": "Cómo configurar OAuth 2.0 (paso a paso)",
"gdrive_oauth_steps": "