- Rename catalog: ingredient/* → product/* (canonical_name, barcode, nutrition per 100g)
- Rename pantry: product/* → userproduct/* (user-owned items with expiry)
- Squash migrations into single 001_initial_schema.sql (clean-db baseline)
- product_categories: add English canonical name column; fix COALESCE in queries
- Remove product_translations: product names are stored in their original language
- Add default_unit_name to product API responses via unit_translations JOIN
- Add cmd/importoff: bulk import from OpenFoodFacts JSONL dump (COPY + ON CONFLICT)
- Diary: support product_id entries alongside dish_id (CHECK num_nonnulls = 1)
- Home: getLoggedCalories joins both recipes and catalog products
- Flutter: rename models/providers/services to match backend rename
- Flutter: add barcode scan flow for diary (mobile_scanner, product_portion_sheet)
- Flutter: localise 6 new keys across 12 languages (barcode scan, portion weight)
- Routes: GET /products/search, GET /products/barcode/{barcode}, /user-products
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
326 lines
7.4 KiB
Dart
326 lines
7.4 KiB
Dart
// ignore: unused_import
|
||
import 'package:intl/intl.dart' as intl;
|
||
import 'app_localizations.dart';
|
||
|
||
// ignore_for_file: type=lint
|
||
|
||
/// The translations for Russian (`ru`).
|
||
class AppLocalizationsRu extends AppLocalizations {
|
||
AppLocalizationsRu([String locale = 'ru']) : super(locale);
|
||
|
||
@override
|
||
String get appTitle => 'FoodAI';
|
||
|
||
@override
|
||
String get greetingMorning => 'Доброе утро';
|
||
|
||
@override
|
||
String get greetingAfternoon => 'Добрый день';
|
||
|
||
@override
|
||
String get greetingEvening => 'Добрый вечер';
|
||
|
||
@override
|
||
String get caloriesUnit => 'ккал';
|
||
|
||
@override
|
||
String get gramsUnit => 'г';
|
||
|
||
@override
|
||
String get goalLabel => 'цель:';
|
||
|
||
@override
|
||
String get consumed => 'Потреблено';
|
||
|
||
@override
|
||
String get remaining => 'Осталось';
|
||
|
||
@override
|
||
String get exceeded => 'Превышение';
|
||
|
||
@override
|
||
String get proteinLabel => 'Белки';
|
||
|
||
@override
|
||
String get fatLabel => 'Жиры';
|
||
|
||
@override
|
||
String get carbsLabel => 'Углеводы';
|
||
|
||
@override
|
||
String get today => 'Сегодня';
|
||
|
||
@override
|
||
String get yesterday => 'Вчера';
|
||
|
||
@override
|
||
String get mealsSection => 'Приёмы пищи';
|
||
|
||
@override
|
||
String get addDish => 'Добавить блюдо';
|
||
|
||
@override
|
||
String get scanDish => 'Сканировать';
|
||
|
||
@override
|
||
String get menu => 'Меню';
|
||
|
||
@override
|
||
String get dishHistory => 'История блюд';
|
||
|
||
@override
|
||
String get recommendCook => 'Рекомендуем приготовить';
|
||
|
||
@override
|
||
String get camera => 'Камера';
|
||
|
||
@override
|
||
String get gallery => 'Галерея';
|
||
|
||
@override
|
||
String get analyzingPhoto => 'Анализируем фото...';
|
||
|
||
@override
|
||
String get inQueue => 'Вы в очереди';
|
||
|
||
@override
|
||
String queuePosition(int position) {
|
||
return 'Позиция $position';
|
||
}
|
||
|
||
@override
|
||
String get processing => 'Обрабатываем...';
|
||
|
||
@override
|
||
String get upgradePrompt => 'Хотите без очереди? Upgrade →';
|
||
|
||
@override
|
||
String get recognitionFailed => 'Не удалось распознать. Попробуйте ещё раз.';
|
||
|
||
@override
|
||
String get dishRecognition => 'Распознавание блюд';
|
||
|
||
@override
|
||
String get all => 'Все';
|
||
|
||
@override
|
||
String get dishRecognized => 'Блюдо распознано';
|
||
|
||
@override
|
||
String get recognizing => 'Распознаётся…';
|
||
|
||
@override
|
||
String get recognitionError => 'Ошибка распознавания';
|
||
|
||
@override
|
||
String get dishResultTitle => 'Распознано блюдо';
|
||
|
||
@override
|
||
String get selectDish => 'Выберите блюдо';
|
||
|
||
@override
|
||
String get dishNotRecognized => 'Блюдо не распознано';
|
||
|
||
@override
|
||
String get tryAgain => 'Попробовать снова';
|
||
|
||
@override
|
||
String get nutritionApproximate =>
|
||
'КБЖУ приблизительные — определены по фото.';
|
||
|
||
@override
|
||
String get portion => 'Порция';
|
||
|
||
@override
|
||
String get mealType => 'Приём пищи';
|
||
|
||
@override
|
||
String get dateLabel => 'Дата';
|
||
|
||
@override
|
||
String get addToJournal => 'Добавить в журнал';
|
||
|
||
@override
|
||
String get addFailed => 'Не удалось добавить. Попробуйте ещё раз.';
|
||
|
||
@override
|
||
String get historyTitle => 'История распознавания';
|
||
|
||
@override
|
||
String get historyLoadError => 'Не удалось загрузить историю';
|
||
|
||
@override
|
||
String get retry => 'Повторить';
|
||
|
||
@override
|
||
String get noHistory => 'Нет распознаваний';
|
||
|
||
@override
|
||
String get profileTitle => 'Профиль';
|
||
|
||
@override
|
||
String get edit => 'Изменить';
|
||
|
||
@override
|
||
String get bodyParams => 'ПАРАМЕТРЫ ТЕЛА';
|
||
|
||
@override
|
||
String get goalActivity => 'ЦЕЛЬ И АКТИВНОСТЬ';
|
||
|
||
@override
|
||
String get nutrition => 'ПИТАНИЕ';
|
||
|
||
@override
|
||
String get settings => 'НАСТРОЙКИ';
|
||
|
||
@override
|
||
String get height => 'Рост';
|
||
|
||
@override
|
||
String get weight => 'Вес';
|
||
|
||
@override
|
||
String get age => 'Возраст';
|
||
|
||
@override
|
||
String get gender => 'Пол';
|
||
|
||
@override
|
||
String get genderMale => 'Мужской';
|
||
|
||
@override
|
||
String get genderFemale => 'Женский';
|
||
|
||
@override
|
||
String get goalLoss => 'Похудение';
|
||
|
||
@override
|
||
String get goalMaintain => 'Поддержание';
|
||
|
||
@override
|
||
String get goalGain => 'Набор массы';
|
||
|
||
@override
|
||
String get activityLow => 'Низкая';
|
||
|
||
@override
|
||
String get activityMedium => 'Средняя';
|
||
|
||
@override
|
||
String get activityHigh => 'Высокая';
|
||
|
||
@override
|
||
String get calorieGoal => 'Норма калорий';
|
||
|
||
@override
|
||
String get mealTypes => 'Приёмы пищи';
|
||
|
||
@override
|
||
String get formulaNote => 'Рассчитано по формуле Миффлина-Сан Жеора';
|
||
|
||
@override
|
||
String get language => 'Язык';
|
||
|
||
@override
|
||
String get notSet => 'Не задано';
|
||
|
||
@override
|
||
String get calorieHint => 'Укажите параметры тела для расчёта нормы калорий';
|
||
|
||
@override
|
||
String get logout => 'Выйти из аккаунта';
|
||
|
||
@override
|
||
String get editProfile => 'Редактировать профиль';
|
||
|
||
@override
|
||
String get cancel => 'Отмена';
|
||
|
||
@override
|
||
String get save => 'Сохранить';
|
||
|
||
@override
|
||
String get nameLabel => 'Имя';
|
||
|
||
@override
|
||
String get heightCm => 'Рост (см)';
|
||
|
||
@override
|
||
String get weightKg => 'Вес (кг)';
|
||
|
||
@override
|
||
String get birthDate => 'Дата рождения';
|
||
|
||
@override
|
||
String get nameRequired => 'Введите имя';
|
||
|
||
@override
|
||
String get profileUpdated => 'Профиль обновлён';
|
||
|
||
@override
|
||
String get profileSaveFailed => 'Не удалось сохранить';
|
||
|
||
@override
|
||
String get mealTypeBreakfast => 'Завтрак';
|
||
|
||
@override
|
||
String get mealTypeSecondBreakfast => 'Второй завтрак';
|
||
|
||
@override
|
||
String get mealTypeLunch => 'Обед';
|
||
|
||
@override
|
||
String get mealTypeAfternoonSnack => 'Полдник';
|
||
|
||
@override
|
||
String get mealTypeDinner => 'Ужин';
|
||
|
||
@override
|
||
String get mealTypeSnack => 'Перекус';
|
||
|
||
@override
|
||
String get navHome => 'Главная';
|
||
|
||
@override
|
||
String get navProducts => 'Продукты';
|
||
|
||
@override
|
||
String get navRecipes => 'Рецепты';
|
||
|
||
@override
|
||
String get addFromReceiptOrPhoto => 'Добавить из чека или фото';
|
||
|
||
@override
|
||
String get chooseMethod => 'Выберите способ';
|
||
|
||
@override
|
||
String get photoReceipt => 'Сфотографировать чек';
|
||
|
||
@override
|
||
String get photoReceiptSubtitle => 'Распознаем все продукты из чека';
|
||
|
||
@override
|
||
String get photoProducts => 'Сфотографировать продукты';
|
||
|
||
@override
|
||
String get photoProductsSubtitle => 'Холодильник, стол, полка — до 3 фото';
|
||
|
||
@override
|
||
String get addPackagedFood => 'Добавить готовый продукт';
|
||
|
||
@override
|
||
String get scanBarcode => 'Сканировать штрихкод';
|
||
|
||
@override
|
||
String get portionWeightG => 'Вес порции (г)';
|
||
|
||
@override
|
||
String get productNotFound => 'Продукт не найден';
|
||
|
||
@override
|
||
String get enterManually => 'Ввести вручную';
|
||
|
||
@override
|
||
String get perHundredG => 'на 100 г';
|
||
}
|