Files
food-ai/client/lib/l10n/app_ja.arb
dbastrikin 5096df2102 fix: fix menu generation errors and show planned meals on home screen
Backend fixes:
- migration 003: add 'menu' value to recipe_source enum (was causing SQLSTATE 22P02)
- migration 004: rename recipe_products→recipe_ingredients, product_id→ingredient_id (was causing SQLSTATE 42P01)
- dish/repository.go: fix INSERT INTO tags using $1/$1 for two columns → $1/$2 (was causing SQLSTATE 42P08)
- home/handler.go: replace non-existent saved_recipes table with correct joins (recipes→dishes→dish_translations, user_saved_recipes) so today's plan and recommendations load correctly
- reqlog: new slog.Handler wrapper that adds request_id and stack trace to ERROR-level logs
- all handlers: slog.Error→slog.ErrorContext so error logs include request context; writeError includes request_id in response body

Client:
- home_screen.dart: extend home screen to future dates, show planned meals as ghost entries
- l10n: add new localisation keys for home screen date navigation and planned meal UI

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-22 00:35:11 +02:00

140 lines
4.9 KiB
Plaintext
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.
{
"@@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": "レシートや写真から追加",
"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": "メニューを生成中...",
"weekPlannedLabel": "週の計画済み"
}