Files
food-ai/client/lib/l10n/app_localizations_zh.dart
dbastrikin 8d33a4eb30 feat: product search screen with catalog add and success feedback
- Add product search screen (/products/search) as primary add flow;
  "Add" button on products list opens search, manual entry remains as fallback
- Add to shelf bottom sheet with AnimatedSwitcher success view (green checkmark)
  and SnackBar confirmation on the search screen via onAdded callback
- Manual add (AddProductScreen) shows SnackBar on success before popping back
- Extend AddProductScreen with optional nutrition fields (calories, protein,
  fat, carbs, fiber); auto-fills from catalog selection and auto-expands section
- Auto-upsert catalog product on backend when nutrition data is provided
  without a primary_product_id, linking the user product to the catalog
- Add fiber_per_100g field to CatalogProduct model and CreateRequest
- Add 16 new L10n keys across all 12 locales (addProduct, addManually,
  searchProducts, quantity, storageDays, addToShelf, nutritionOptional,
  calories, protein, fat, carbs, fiber, productAddedToShelf, etc.)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 14:04:58 +02:00

535 lines
10 KiB
Dart
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.
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Chinese (`zh`).
class AppLocalizationsZh extends AppLocalizations {
AppLocalizationsZh([String locale = 'zh']) : 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 => '跳过队列?升级 →';
@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克';
@override
String get searchFoodHint => '搜索产品和菜肴...';
@override
String get recentlyUsedLabel => '最近使用';
@override
String get productsSection => '产品';
@override
String get dishesSection => '菜肴';
@override
String noResultsForQuery(String query) {
return '未找到 \"$query\" 的结果';
}
@override
String get servingsLabel => '份数';
@override
String get addToDiary => '添加到日记';
@override
String get scanDishPhoto => '扫描照片';
@override
String planningForDate(String date) {
return '';
}
@override
String get markAsEaten => '标记为已吃';
@override
String get plannedMealLabel => '已计划';
@override
String get generateWeekLabel => '规划本周';
@override
String get generateWeekSubtitle => 'AI将为整周创建含早餐、午餐和晚餐的菜单';
@override
String get generatingMenu => '正在生成菜单...';
@override
String get dayPlannedLabel => '今日已规划';
@override
String get planMenuButton => '规划餐食';
@override
String get planMenuTitle => '规划什么?';
@override
String get planOptionSingleMeal => '单次餐食';
@override
String get planOptionSingleMealDesc => '选择日期和餐食类型';
@override
String get planOptionDay => '一天';
@override
String get planOptionDayDesc => '一天的所有餐食';
@override
String get planOptionDays => '几天';
@override
String get planOptionDaysDesc => '自定义日期范围';
@override
String get planOptionWeek => '一周';
@override
String get planOptionWeekDesc => '一次规划7天';
@override
String get planSelectDate => '选择日期';
@override
String get planSelectMealType => '餐食类型';
@override
String get planSelectRange => '选择时间段';
@override
String get planGenerateButton => '规划';
@override
String get planGenerating => '正在生成计划…';
@override
String get planSuccess => '菜单已规划!';
@override
String get planProductsTitle => '菜单食材';
@override
String get planProductsSubtitle => 'AI在生成食谱时会考虑所选食材';
@override
String get planProductsEmpty => '尚未添加食材';
@override
String get planProductsEmptyMessage => '添加您家中的食材 — AI将根据您已有的食材推荐食谱';
@override
String get planProductsAddProducts => '添加食材';
@override
String get planProductsContinue => '继续';
@override
String get planProductsSkip => '跳过食材选择';
@override
String get planProductsSkipNoProducts => '不选食材直接规划';
@override
String get planProductsSelectAll => '全选';
@override
String get planProductsDeselectAll => '取消全选';
@override
String get recentScans => '最近扫描';
@override
String get seeAllScans => '全部';
@override
String get productJobHistoryTitle => '扫描历史';
@override
String get jobTypeReceipt => '收据';
@override
String get jobTypeProducts => '产品';
@override
String get scanSubmitting => '提交中...';
@override
String get processingProducts => '处理中...';
@override
String get clearAllProducts => '清空列表';
@override
String get clearAllConfirmTitle => '清空所有产品?';
@override
String get clearAllConfirmMessage => '所有产品将被永久删除。';
@override
String get addManually => '手动';
@override
String get scan => '扫描';
@override
String get addProduct => '添加';
@override
String get searchProducts => '搜索产品';
@override
String get searchProductsHint => '输入产品名称搜索或手动添加';
@override
String noSearchResults(String query) {
return '未找到$query的结果';
}
@override
String get quantity => '数量';
@override
String get storageDays => '保存天数';
@override
String get addToShelf => '添加到储藏室';
@override
String get errorGeneric => '出错了';
@override
String get nutritionOptional => '每100克营养成分可选';
@override
String get calories => '卡路里';
@override
String get protein => '蛋白质';
@override
String get fat => '脂肪';
@override
String get carbs => '碳水化合物';
@override
String get fiber => '膳食纤维';
@override
String get productAddedToShelf => '已添加到储藏室';
}