Files
food-ai/client/lib/l10n/app_es.arb
dbastrikin b2bdcbae6f feat: barcode scanning for shelf add + scan screen barcode option
- Add ShelfBarcodeScanScreen: scans barcode via mobile_scanner, looks up
  product via GET /products/barcode/{barcode} (Open Food Facts fallback),
  returns CatalogProduct to caller; loading overlay while looking up;
  "Add manually" fallback in AppBar for unknown products
- Extract AddToShelfSheet to add_to_shelf_sheet.dart (was private in
  product_search_screen.dart) so both search and scan screens can reuse it
- Add barcode icon button to ProductSearchScreen AppBar → opens scanner
- Add "Scan barcode" card (📷) to ScanScreen alongside receipt and photo modes
- Rename ScanScreen title: addFromReceiptOrPhoto → scanScreenTitle
  ("Сканировать" / "Scan & Recognize") to reflect all three modes
- Add 2 L10n keys (scanScreenTitle, barcodeScanSubtitle) across all 12 locales

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 15:21:56 +02:00

206 lines
7.2 KiB
Plaintext

{
"@@locale": "es",
"appTitle": "FoodAI",
"greetingMorning": "Buenos días",
"greetingAfternoon": "Buenas tardes",
"greetingEvening": "Buenas noches",
"caloriesUnit": "kcal",
"gramsUnit": "g",
"goalLabel": "meta:",
"consumed": "Consumido",
"remaining": "Restante",
"exceeded": "Excedido",
"proteinLabel": "Proteínas",
"fatLabel": "Grasas",
"carbsLabel": "Carbohidratos",
"today": "Hoy",
"yesterday": "Ayer",
"mealsSection": "Comidas",
"addDish": "Añadir plato",
"scanDish": "Escanear",
"menu": "Menú",
"dishHistory": "Historial de platos",
"recommendCook": "Recomendamos cocinar",
"camera": "Cámara",
"gallery": "Galería",
"analyzingPhoto": "Analizando foto...",
"inQueue": "Estás en la cola",
"queuePosition": "Posición {position}",
"@queuePosition": {
"placeholders": {
"position": {
"type": "int"
}
}
},
"processing": "Procesando...",
"upgradePrompt": "¿Saltar la cola? Actualiza →",
"recognitionFailed": "Reconocimiento fallido. Inténtalo de nuevo.",
"dishRecognition": "Reconocimiento de platos",
"all": "Todos",
"dishRecognized": "Plato reconocido",
"recognizing": "Reconociendo…",
"recognitionError": "Error de reconocimiento",
"dishResultTitle": "Plato reconocido",
"selectDish": "Selecciona un plato",
"dishNotRecognized": "Plato no reconocido",
"tryAgain": "Intentar de nuevo",
"nutritionApproximate": "Los valores nutricionales son aproximados — estimados a partir de la foto.",
"portion": "Porción",
"mealType": "Tipo de comida",
"dateLabel": "Fecha",
"addToJournal": "Añadir al diario",
"addFailed": "Error al añadir. Inténtalo de nuevo.",
"historyTitle": "Historial de reconocimientos",
"historyLoadError": "Error al cargar el historial",
"retry": "Reintentar",
"noHistory": "Sin reconocimientos aún",
"profileTitle": "Perfil",
"edit": "Editar",
"bodyParams": "PARÁMETROS CORPORALES",
"goalActivity": "OBJETIVO Y ACTIVIDAD",
"nutrition": "NUTRICIÓN",
"settings": "AJUSTES",
"height": "Altura",
"weight": "Peso",
"age": "Edad",
"gender": "Género",
"genderMale": "Masculino",
"genderFemale": "Femenino",
"goalLoss": "Pérdida de peso",
"goalMaintain": "Mantenimiento",
"goalGain": "Ganancia muscular",
"activityLow": "Baja",
"activityMedium": "Media",
"activityHigh": "Alta",
"calorieGoal": "Objetivo calórico",
"mealTypes": "Tipos de comida",
"formulaNote": "Calculado con la fórmula de Mifflin-St Jeor",
"language": "Idioma",
"notSet": "No establecido",
"calorieHint": "Introduce los parámetros corporales para calcular el objetivo calórico",
"logout": "Cerrar sesión",
"editProfile": "Editar perfil",
"cancel": "Cancelar",
"save": "Guardar",
"nameLabel": "Nombre",
"heightCm": "Altura (cm)",
"weightKg": "Peso (kg)",
"birthDate": "Fecha de nacimiento",
"nameRequired": "Introduce el nombre",
"profileUpdated": "Perfil actualizado",
"profileSaveFailed": "Error al guardar",
"mealTypeBreakfast": "Desayuno",
"mealTypeSecondBreakfast": "Segundo desayuno",
"mealTypeLunch": "Almuerzo",
"mealTypeAfternoonSnack": "Merienda",
"mealTypeDinner": "Cena",
"mealTypeSnack": "Aperitivo",
"navHome": "Inicio",
"navProducts": "Productos",
"navRecipes": "Recetas",
"addFromReceiptOrPhoto": "Añadir desde recibo o foto",
"scanScreenTitle": "Escanear y Reconocer",
"barcodeScanSubtitle": "Encontrar un producto por su código de barras",
"chooseMethod": "Elegir método",
"photoReceipt": "Fotografiar recibo",
"photoReceiptSubtitle": "Reconocemos todos los productos del recibo",
"photoProducts": "Fotografiar productos",
"photoProductsSubtitle": "Nevera, mesa, estante — hasta 3 fotos",
"addPackagedFood": "Agregar alimento envasado",
"scanBarcode": "Escanear código de barras",
"portionWeightG": "Peso de la porción (g)",
"productNotFound": "Producto no encontrado",
"enterManually": "Ingresar manualmente",
"perHundredG": "por 100 g",
"searchFoodHint": "Buscar productos y platos...",
"recentlyUsedLabel": "Usados recientemente",
"productsSection": "Productos",
"dishesSection": "Platos",
"noResultsForQuery": "Nada encontrado para \"{query}\"",
"@noResultsForQuery": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"servingsLabel": "Porciones",
"addToDiary": "Añadir al diario",
"scanDishPhoto": "Escanear foto",
"planningForDate": "",
"@planningForDate": {
"placeholders": {
"date": {
"type": "String"
}
}
},
"markAsEaten": "Marcar como comido",
"plannedMealLabel": "Planificado",
"generateWeekLabel": "Planificar la semana",
"generateWeekSubtitle": "La IA creará un menú con desayuno, comida y cena para toda la semana",
"generatingMenu": "Generando menú...",
"dayPlannedLabel": "Día planificado",
"planMenuButton": "Planificar comidas",
"planMenuTitle": "¿Qué planificar?",
"planOptionSingleMeal": "Una comida",
"planOptionSingleMealDesc": "Elegir día y tipo de comida",
"planOptionDay": "Un día",
"planOptionDayDesc": "Todas las comidas de un día",
"planOptionDays": "Varios días",
"planOptionDaysDesc": "Personalizar período",
"planOptionWeek": "Una semana",
"planOptionWeekDesc": "7 días de una vez",
"planSelectDate": "Seleccionar fecha",
"planSelectMealType": "Tipo de comida",
"planSelectRange": "Seleccionar período",
"planGenerateButton": "Planificar",
"planGenerating": "Generando plan…",
"planSuccess": "¡Menú planificado!",
"planProductsTitle": "Productos para el menú",
"planProductsSubtitle": "La IA tendrá en cuenta los productos seleccionados al generar recetas",
"planProductsEmpty": "No hay productos añadidos",
"planProductsEmptyMessage": "Añade productos que tengas en casa — la IA sugerirá recetas con lo que ya tienes",
"planProductsAddProducts": "Añadir productos",
"planProductsContinue": "Continuar",
"planProductsSkip": "Omitir selección de productos",
"planProductsSkipNoProducts": "Planificar sin productos",
"planProductsSelectAll": "Seleccionar todo",
"planProductsDeselectAll": "Deseleccionar todo",
"recentScans": "Escaneos recientes",
"seeAllScans": "Ver todos",
"productJobHistoryTitle": "Historial de escaneos",
"jobTypeReceipt": "Ticket",
"jobTypeProducts": "Productos",
"scanSubmitting": "Enviando...",
"processingProducts": "Procesando...",
"clearAllProducts": "Borrar todo",
"clearAllConfirmTitle": "¿Borrar todos los productos?",
"clearAllConfirmMessage": "Todos los productos serán eliminados permanentemente.",
"addManually": "Manual",
"scan": "Escanear",
"addProduct": "Agregar",
"searchProducts": "Buscar productos",
"searchProductsHint": "Escribe el nombre del producto o agrega manualmente",
"noSearchResults": "Sin resultados para \"{query}\"",
"@noSearchResults": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"quantity": "Cantidad",
"storageDays": "Días de almacenamiento",
"addToShelf": "Agregar a despensa",
"errorGeneric": "Algo salió mal",
"nutritionOptional": "Nutrición por 100g (opcional)",
"calories": "Calorías",
"protein": "Proteína",
"fat": "Grasas",
"carbs": "Carbohidratos",
"fiber": "Fibra",
"productAddedToShelf": "Agregado a la despensa"
}