Files
food-ai/client/lib/l10n/app_ru.arb
dbastrikin 5c5ed25e5b feat: improved receipt recognition, batch product add, and scan UX
- Rewrite receipt OCR prompt: completes truncated names, preserves fat%
  and flavour attributes, extracts weight/volume from line, infers
  typical package sizes for solid goods with quantity_confidence field
- Add quantity_confidence to RecognizedItem, EnrichedItem, and
  ProductJobResultItem; propagate through item enricher and worker
- Replace per-item create loop with single POST /user-products/batch call
  from RecognitionConfirmScreen
- Rebuild RecognitionConfirmScreen: amber qty border for low
  quantity_confidence, tappable product name → catalog picker,
  sort items by confidence, full L10n (no hardcoded strings)
- Add timestamps (HH:mm / d MMM HH:mm) to recent scan chips
- Show close-app hint on ProductJobWatchScreen (queued + processing)
- Refresh recentProductJobsProvider on watch screen init so new job
  appears without a manual pull-to-refresh
- App-level WidgetsBindingObserver refreshes product and dish job lists
  on resume, fixing stale lists after background/foreground transitions
- Add 9 new L10n keys across all 12 locales

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 23:09:57 +02:00

236 lines
10 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"@@locale": "ru",
"appTitle": "FoodAI",
"greetingMorning": "Доброе утро",
"greetingAfternoon": "Добрый день",
"greetingEvening": "Добрый вечер",
"caloriesUnit": "ккал",
"gramsUnit": "г",
"goalLabel": "цель:",
"consumed": "Потреблено",
"remaining": "Осталось",
"exceeded": "Превышение",
"proteinLabel": "Белки",
"fatLabel": "Жиры",
"carbsLabel": "Углеводы",
"today": "Сегодня",
"yesterday": "Вчера",
"mealsSection": "Приёмы пищи",
"addDish": "Добавить блюдо",
"scanDish": "Сканировать",
"menu": "Меню",
"dishHistory": "История блюд",
"recommendCook": "Рекомендуем приготовить",
"camera": "Камера",
"gallery": "Галерея",
"analyzingPhoto": "Анализируем фото...",
"inQueue": "Вы в очереди",
"queuePosition": "Позиция {position}",
"@queuePosition": {
"placeholders": {
"position": {
"type": "int"
}
}
},
"processing": "Обрабатываем...",
"upgradePrompt": "Хотите без очереди? Upgrade →",
"recognitionFailed": "Не удалось распознать. Попробуйте ещё раз.",
"dishRecognition": "Распознавание блюд",
"all": "Все",
"dishRecognized": "Блюдо распознано",
"recognizing": "Распознаётся…",
"recognitionError": "Ошибка распознавания",
"dishResultTitle": "Распознано блюдо",
"selectDish": "Выберите блюдо",
"dishNotRecognized": "Блюдо не распознано",
"tryAgain": "Попробовать снова",
"nutritionApproximate": "КБЖУ приблизительные — определены по фото.",
"portion": "Порция",
"mealType": "Приём пищи",
"dateLabel": "Дата",
"addToJournal": "Добавить в журнал",
"addFailed": "Не удалось добавить. Попробуйте ещё раз.",
"historyTitle": "История распознавания",
"historyLoadError": "Не удалось загрузить историю",
"retry": "Повторить",
"noHistory": "Нет распознаваний",
"profileTitle": "Профиль",
"edit": "Изменить",
"bodyParams": "ПАРАМЕТРЫ ТЕЛА",
"goalActivity": "ЦЕЛЬ И АКТИВНОСТЬ",
"nutrition": "ПИТАНИЕ",
"settings": "НАСТРОЙКИ",
"height": "Рост",
"weight": "Вес",
"age": "Возраст",
"gender": "Пол",
"genderMale": "Мужской",
"genderFemale": "Женский",
"goalLoss": "Похудение",
"goalMaintain": "Поддержание",
"goalGain": "Набор массы",
"activityLow": "Низкая",
"activityMedium": "Средняя",
"activityHigh": "Высокая",
"calorieGoal": "Норма калорий",
"mealTypes": "Приёмы пищи",
"formulaNote": "Рассчитано по формуле Миффлина-Сан Жеора",
"language": "Язык",
"notSet": "Не задано",
"calorieHint": "Укажите параметры тела для расчёта нормы калорий",
"logout": "Выйти из аккаунта",
"editProfile": "Редактировать профиль",
"cancel": "Отмена",
"save": "Сохранить",
"nameLabel": "Имя",
"heightCm": "Рост (см)",
"weightKg": "Вес (кг)",
"birthDate": "Дата рождения",
"nameRequired": "Введите имя",
"profileUpdated": "Профиль обновлён",
"profileSaveFailed": "Не удалось сохранить",
"mealTypeBreakfast": "Завтрак",
"mealTypeSecondBreakfast": "Второй завтрак",
"mealTypeLunch": "Обед",
"mealTypeAfternoonSnack": "Полдник",
"mealTypeDinner": "Ужин",
"mealTypeSnack": "Перекус",
"navHome": "Главная",
"navProducts": "Продукты",
"navRecipes": "Рецепты",
"addFromReceiptOrPhoto": "Добавить из чека или фото",
"scanScreenTitle": "Сканировать",
"barcodeScanSubtitle": "Найти продукт по штрихкоду",
"chooseMethod": "Выберите способ",
"photoReceipt": "Сфотографировать чек",
"photoReceiptSubtitle": "Распознаем все продукты из чека",
"photoProducts": "Сфотографировать продукты",
"photoProductsSubtitle": "Холодильник, стол, полка — до 3 фото",
"addPackagedFood": "Добавить готовый продукт",
"scanBarcode": "Сканировать штрихкод",
"portionWeightG": "Вес порции (г)",
"productNotFound": "Продукт не найден",
"enterManually": "Ввести вручную",
"perHundredG": "на 100 г",
"searchFoodHint": "Поиск продуктов и блюд...",
"recentlyUsedLabel": "Недавно использованные",
"productsSection": "Продукты",
"dishesSection": "Блюда",
"noResultsForQuery": "По запросу \"{query}\" ничего не найдено",
"@noResultsForQuery": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"servingsLabel": "Порций",
"addToDiary": "Добавить в дневник",
"scanDishPhoto": "Сканировать фото",
"planningForDate": "Планирование на {date}",
"@planningForDate": {
"placeholders": {
"date": {
"type": "String"
}
}
},
"markAsEaten": "Отметить как съеденное",
"plannedMealLabel": "Запланировано",
"generateWeekLabel": "Запланировать неделю",
"generateWeekSubtitle": "AI составит меню с завтраком, обедом и ужином на всю неделю",
"generatingMenu": "Генерируем меню...",
"dayPlannedLabel": "День запланирован",
"planMenuButton": "Спланировать меню",
"planMenuTitle": "Что запланировать?",
"planOptionSingleMeal": "1 приём пищи",
"planOptionSingleMealDesc": "Выберите день и приём пищи",
"planOptionDay": "1 день",
"planOptionDayDesc": "Все приёмы пищи за день",
"planOptionDays": "Несколько дней",
"planOptionDaysDesc": "Настроить период",
"planOptionWeek": "Неделя",
"planOptionWeekDesc": "7 дней сразу",
"planSelectDate": "Выберите дату",
"planSelectMealType": "Приём пищи",
"planSelectRange": "Выберите период",
"planGenerateButton": "Запланировать",
"planGenerating": "Генерирую план…",
"planSuccess": "Меню запланировано!",
"planProductsTitle": "Продукты для меню",
"planProductsSubtitle": "AI учтёт выбранные продукты при составлении рецептов",
"planProductsEmpty": "Продукты не добавлены",
"planProductsEmptyMessage": "Добавьте продукты, которые есть у вас дома — AI подберёт рецепты из того, что уже есть",
"planProductsAddProducts": "Добавить продукты",
"planProductsContinue": "Продолжить",
"planProductsSkip": "Пропустить выбор продуктов",
"planProductsSkipNoProducts": "Планировать без продуктов",
"planProductsSelectAll": "Выбрать все",
"planProductsDeselectAll": "Снять всё",
"recentScans": "Последние сканирования",
"seeAllScans": "Все",
"productJobHistoryTitle": "История сканирования",
"jobTypeReceipt": "Чек",
"jobTypeProducts": "Продукты",
"scanSubmitting": "Отправка...",
"processingProducts": "Обработка...",
"clearAllProducts": "Очистить список",
"clearAllConfirmTitle": "Очистить список продуктов?",
"clearAllConfirmMessage": "Все продукты будут удалены без возможности восстановления.",
"addManually": "Вручную",
"scan": "Сканировать",
"addProduct": "Добавить",
"searchProducts": "Поиск продуктов",
"searchProductsHint": "Введите название продукта или добавьте вручную",
"noSearchResults": "Ничего не найдено по запросу \"{query}\"",
"@noSearchResults": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"quantity": "Количество",
"storageDays": "Дней хранения",
"addToShelf": "В холодильник",
"errorGeneric": "Что-то пошло не так",
"nutritionOptional": "Питательная ценность на 100г (необязательно)",
"calories": "Калории",
"protein": "Белки",
"fat": "Жиры",
"carbs": "Углеводы",
"fiber": "Клетчатка",
"productAddedToShelf": "Добавлено в холодильник",
"recognitionFoundProducts": "Найдено {count} продуктов",
"@recognitionFoundProducts": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"recognitionAddAll": "Добавить всё",
"recognitionAddToStock": "В запасы",
"recognitionAdded": "Добавлено {count} продуктов",
"@recognitionAdded": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"recognitionProductsFailed": "Не удалось добавить продукты",
"recognitionEmpty": "Продукты не найдены",
"recognitionConfidence": "{percent}% уверенность",
"@recognitionConfidence": {
"placeholders": {
"percent": {
"type": "int"
}
}
},
"recognitionReplaceProduct": "Заменить продукт",
"scanJobCloseHint": "Можно закрыть приложение — скан появится в последних сканированиях на экране продуктов"
}