- 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>
535 lines
10 KiB
Dart
535 lines
10 KiB
Dart
// 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 => '已添加到储藏室';
|
||
}
|