- 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>
236 lines
8.5 KiB
Plaintext
236 lines
8.5 KiB
Plaintext
{
|
||
"@@locale": "ja",
|
||
"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": "ミフリン・セントジョー式で計算",
|
||
"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": "1日",
|
||
"planOptionDayDesc": "1日分の全食事",
|
||
"planOptionDays": "数日",
|
||
"planOptionDaysDesc": "期間をカスタマイズ",
|
||
"planOptionWeek": "1週間",
|
||
"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": "アプリを閉じても大丈夫です — このスキャンは製品画面の最近のスキャンに表示されます"
|
||
}
|