- 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>
206 lines
7.2 KiB
Plaintext
206 lines
7.2 KiB
Plaintext
{
|
|
"@@locale": "ko",
|
|
"appTitle": "FoodAI",
|
|
"greetingMorning": "좋은 아침이에요",
|
|
"greetingAfternoon": "안녕하세요",
|
|
"greetingEvening": "좋은 저녁이에요",
|
|
"caloriesUnit": "kcal",
|
|
"gramsUnit": "g",
|
|
"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": "대기열 건너뛰기? 업그레이드 →",
|
|
"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": "Mifflin-St Jeor 공식으로 계산",
|
|
"language": "언어",
|
|
"notSet": "설정 안 됨",
|
|
"calorieHint": "칼로리 목표를 계산하려면 신체 매개변수를 입력하세요",
|
|
"logout": "로그아웃",
|
|
"editProfile": "프로필 편집",
|
|
"cancel": "취소",
|
|
"save": "저장",
|
|
"nameLabel": "이름",
|
|
"heightCm": "키 (cm)",
|
|
"weightKg": "체중 (kg)",
|
|
"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": "1회 제공량 (g)",
|
|
"productNotFound": "제품을 찾을 수 없습니다",
|
|
"enterManually": "직접 입력",
|
|
"perHundredG": "100g당",
|
|
"searchFoodHint": "식품 및 요리 검색...",
|
|
"recentlyUsedLabel": "최근 사용",
|
|
"productsSection": "식품",
|
|
"dishesSection": "요리",
|
|
"noResultsForQuery": "\"{query}\"에 대한 결과 없음",
|
|
"@noResultsForQuery": {
|
|
"placeholders": {
|
|
"query": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"servingsLabel": "인분",
|
|
"addToDiary": "일기에 추가",
|
|
"scanDishPhoto": "사진 스캔",
|
|
"planningForDate": "",
|
|
"@planningForDate": {
|
|
"placeholders": {
|
|
"date": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"markAsEaten": "먹은 것으로 표시",
|
|
"plannedMealLabel": "계획됨",
|
|
"generateWeekLabel": "주간 계획하기",
|
|
"generateWeekSubtitle": "AI가 한 주 동안 아침, 점심, 저녁 식사 메뉴를 만들어 드립니다",
|
|
"generatingMenu": "메뉴 생성 중...",
|
|
"dayPlannedLabel": "일일 계획 완료",
|
|
"planMenuButton": "식사 계획하기",
|
|
"planMenuTitle": "무엇을 계획하시겠어요?",
|
|
"planOptionSingleMeal": "식사 1회",
|
|
"planOptionSingleMealDesc": "날짜와 식사 유형 선택",
|
|
"planOptionDay": "하루",
|
|
"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": "100g당 영양성분 (선택사항)",
|
|
"calories": "칼로리",
|
|
"protein": "단백질",
|
|
"fat": "지방",
|
|
"carbs": "탄수화물",
|
|
"fiber": "식이섬유",
|
|
"productAddedToShelf": "저장실에 추가되었습니다"
|
|
}
|