Files
food-ai/client/lib/l10n/app_ko.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
8.0 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": "저장실에 추가되었습니다",
"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": "앱을 닫아도 됩니다 — 이 스캔은 제품 화면의 최근 스캔에 표시됩니다"
}