Files
EverShelf/translations/en.json
T

888 lines
40 KiB
JSON
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.
{
"app": {
"name": "EverShelf",
"loading": "Loading..."
},
"nav": {
"title": "🏠 EverShelf",
"home": "Home",
"inventory": "Pantry",
"recipes": "Recipes",
"shopping": "Shopping",
"log": "Log"
},
"btn": {
"back": "← Back",
"save": "💾 Save",
"cancel": "✕ Cancel",
"close": "Close",
"add": "✅ Add",
"delete": "Delete",
"edit": "✏️ Edit",
"search": "🔍 Search",
"go": "✅ Go",
"toggle_password": "👁️ Show/Hide",
"load_more": "Load more...",
"save_config": "💾 Save Configuration",
"save_product": "💾 Save Product",
"restart": "↺ Restart",
"reset_default": "↺ Reset to default",
"save_info": "💾 Save information",
"retry": "🔄 Retry"
},
"locations": {
"dispensa": "Pantry",
"frigo": "Fridge",
"freezer": "Freezer",
"altro": "Other"
},
"categories": {
"latticini": "Dairy",
"carne": "Meat",
"pesce": "Fish",
"frutta": "Fruit",
"verdura": "Vegetables",
"pasta": "Pasta & Rice",
"pane": "Bread & Bakery",
"surgelati": "Frozen",
"bevande": "Beverages",
"condimenti": "Condiments",
"snack": "Snacks & Sweets",
"conserve": "Canned Goods",
"cereali": "Cereals & Legumes",
"igiene": "Hygiene",
"pulizia": "Household",
"altro": "Other",
"select": "-- Select --"
},
"units": {
"pz": "pcs",
"conf": "pkg",
"g": "g",
"ml": "ml",
"pieces": "Pieces",
"grams": "Grams",
"box": "Package",
"boxes": "Packages"
},
"shopping_sections": {
"frutta_verdura": "Fruits & Vegetables",
"carne_pesce": "Meat & Fish",
"latticini": "Dairy & Fresh",
"pane_dolci": "Bread & Sweets",
"pasta": "Pasta & Cereals",
"conserve": "Canned & Sauces",
"surgelati": "Frozen",
"bevande": "Beverages",
"pulizia_igiene": "Cleaning & Hygiene",
"altro": "Other"
},
"dashboard": {
"expired_title": "🚫 Expired",
"expiring_title": "⏰ Expiring Soon",
"stats_period": "📊 Last 30 days",
"opened_title": "📦 Opened Products",
"review_title": "🔍 To Review",
"review_hint": "Quantities that seem unusual. Confirm if correct or modify.",
"quick_recipe": "🍳 Quick recipe with expiring products",
"banner_review_title": "Anomalous quantity",
"banner_review_action_ok": "It's correct",
"banner_review_action_edit": "Correct",
"banner_review_action_weigh": "Weigh",
"banner_review_dismiss": "Dismiss",
"banner_prediction_title": "Anomalous consumption",
"banner_prediction_hint": "Based on predictions, this quantity doesn't match expected consumption.",
"banner_prediction_action_confirm": "Confirm {qty} {unit} is correct",
"banner_prediction_action_weigh": "Weigh now",
"banner_prediction_action_edit": "Update quantity",
"banner_expired_title": "Expired product",
"banner_expired_today": "Expired today",
"banner_expired_days": "Expired {days} days ago",
"banner_expired_action_use": "Use anyway",
"banner_expired_action_throw": "I threw it away",
"banner_expired_action_edit": "Fix date",
"banner_anomaly_action_edit": "Fix inventory",
"banner_anomaly_action_dismiss": "Quantity is correct",
"banner_expiring_title": "Expiring soon",
"banner_expiring_today": "Expires today!",
"banner_expiring_tomorrow": "Expires tomorrow",
"banner_expiring_days": "Expires in {days} days",
"banner_expiring_action_use": "Use now",
"banner_finished_title": "finished?",
"banner_finished_detail": "I recorded that {name} reached zero stock. Is it really gone, or do you still have some?",
"banner_finished_action_yes": "Yes, it's done",
"banner_finished_action_no": "No, I still have some",
"banner_review_unusual_pkg_title": "Unusual package size",
"banner_review_unusual_pkg_detail": "You set a package of {qty} {unit} — the size seems very large. Check if correct or edit.",
"banner_review_low_qty_title": "Very low quantity",
"banner_review_low_qty_detail": "You only have {qty} in stock — seems very little, could be a typo. Confirm if correct.",
"banner_review_high_qty_title": "Unusually high quantity",
"banner_review_high_qty_detail": "You have {qty} in stock — the figure seems very high. Confirm if correct or edit.",
"banner_prediction_rate_day": "Average ~{n} {unit}/day",
"banner_prediction_rate_week": "Average ~{n} {unit}/week",
"banner_prediction_days_ago": "{n} days ago you restocked",
"banner_prediction_more": "I expected {expected} {unit}{time}, but you have {actual} {unit}. Did you add stock without recording it?",
"banner_prediction_less": "I expected {expected} {unit}{time}, but you only have {actual} {unit}. Did you use more than usual?",
"banner_finished_zero": "Inventory shows zero, but recorded movements suggest it shouldn't be empty.",
"banner_finished_expected": "According to records you should still have {qty} {unit}.",
"banner_finished_check": "Can you check?",
"banner_anomaly_phantom_title": "you have more stock than expected",
"banner_anomaly_phantom_detail": "Inventory shows {inv_qty} {unit}, but based on records you should only have {expected_qty} {unit}. Did you add stock without recording it?",
"banner_anomaly_untracked_title": "stock not recorded as an entry",
"banner_anomaly_untracked_detail": "You have <strong>{inv_qty} {unit}</strong> in inventory, but recorded outflows exceed inflows — the initial stock was likely never added as an \"in\" transaction. You can correct the quantity or log the missing entries.",
"banner_anomaly_ghost_title": "you have less stock than expected",
"banner_anomaly_ghost_detail": "Based on recorded operations you should have {expected_qty} {unit} of {name}, but inventory shows only {inv_qty} {unit}. Did you take stock without recording it?",
"consumed": "Consumed: {n} ({pct}%)",
"wasted": "Wasted: {n} ({pct}%)",
"more_opened": "and {n} more opened...",
"banner_expired_detail": "{when} · you still have <strong>{qty}</strong>."
},
"inventory": {
"title": "Pantry",
"filter_all": "All",
"search_placeholder": "🔍 Search product...",
"recent_title": "🕐 Recently used",
"popular_title": "⭐ Most used",
"empty": "No products here.\nScan a product to add it!",
"no_items_found": "No inventory items found",
"qty_remainder_suffix": "left",
"vacuum_badge": "🫙 Vacuum sealed",
"opened_badge": "📭 Opened",
"label_expiry": "📅 Expiry",
"label_storage": "🫙 Storage",
"label_status": "📭 Status",
"opened_since": "Opened since {date}",
"label_position": "📍 Location",
"label_quantity": "📦 Quantity",
"label_added": "📅 Added",
"empty_text": "No products here.<br>Scan a product to add it!",
"empty_db": "No products in the database.<br>Scan a product to get started!"
},
"scan": {
"title": "Scan Product",
"mode_shopping": "🛒 Shopping Mode",
"mode_shopping_end": "✅ End shopping",
"zoom": "Zoom",
"barcode_placeholder": "Enter barcode...",
"quick_name_divider": "or type the name",
"quick_name_placeholder": "E.g.: Apples, Zucchini, Bread...",
"manual_entry": "✏️ Manual Entry",
"ai_identify": "🤖 Identify with AI",
"hint": "Scan the barcode, type the product name, or use AI to identify it",
"debug_toggle": "🐛 Debug Log",
"barcode_acquired": "🔖 Barcode scanned: {code}",
"scan_barcode": "🔖 Scan Barcode",
"create_named": "Create {name}",
"new_without_barcode": "New product without barcode"
},
"action": {
"title": "What do you want to do?",
"add_btn": "📥 ADD",
"add_sub": "to pantry/fridge",
"use_btn": "📤 USE / CONSUME",
"use_sub": "from pantry/fridge",
"have_title": "📦 Already in stock!",
"add_more_sub": "add more",
"use_qty_sub": "how much you used",
"throw_btn": "🗑️ DISCARD",
"throw_sub": "throw away",
"edit_sub": "expiry, location…"
},
"add": {
"title": "Add to Pantry",
"location_label": "📍 Where do you put it?",
"quantity_label": "📦 Quantity",
"conf_size_label": "📦 Each package contains:",
"conf_size_placeholder": "e.g. 300",
"vacuum_label": "🫙 Vacuum sealed",
"vacuum_hint": "Expiry date will be extended automatically",
"submit": "✅ Add",
"purchase_type_label": "🛒 This product is...",
"new_btn": "🆕 Just bought",
"existing_btn": "📦 I already had it",
"remaining_label": "📦 Remaining quantity",
"remaining_hint": "Approximately how much is left?",
"remaining_full": "🟢 Full",
"remaining_half": "🟠 Half",
"estimated_expiry": "Estimated expiry:",
"suffix_freezer": "(freezer)",
"suffix_vacuum": "(vacuum sealed)",
"hint_modify": "📝 You can change the date or scan it with the camera",
"scan_expiry_title": "📷 Scan Expiry Date",
"product_added": "✅ {name} added!{qty}",
"suffix_freezer_vacuum": "(freezer + vacuum sealed)"
},
"use": {
"title": "Use / Consume",
"location_label": "📍 From where?",
"quantity_label": "How much did you use?",
"change": "change",
"partial_hint": "Or specify the quantity used:",
"partial_piece_hint": "Did you use only a part?",
"piece": "piece",
"one_whole": "1 whole",
"use_all": "🗑️ Used ALL / Finished",
"submit": "📤 Use this quantity",
"available": "📦 Available:",
"opened_badge": "OPENED",
"not_in_inventory": "⚠️ Product not in inventory.",
"expiry_warning": "⚠️ Use first the one{loc} that expires on {date} — {when}!",
"throw_title": "🗑️ Discard Product",
"throw_all": "🗑️ Discard ALL ({qty})",
"throw_qty_label": "How much to discard?",
"throw_qty_hint": "or enter a quantity:",
"throw_partial_btn": "🗑️ Discard this quantity",
"when_expired": "expired {n} days ago",
"when_today": "expires <strong>today</strong>",
"when_tomorrow": "expires <strong>tomorrow</strong>",
"when_days": "expires in <strong>{n} days</strong>",
"toast_used": "📤 Used {qty} of {name}",
"toast_bring": "🛒 Product finished → added to Bring!"
},
"product": {
"title_new": "New Product",
"title_edit": "Edit Product",
"ai_fill": "📷 Take photo and identify with AI",
"ai_fill_hint": "AI will automatically fill in the product fields",
"name_label": "🏷️ Product Name *",
"name_placeholder": "E.g.: Whole milk, Penne pasta...",
"brand_label": "🏢 Brand",
"brand_placeholder": "E.g.: Barilla, Granarolo, Mutti...",
"category_label": "📂 Category",
"unit_label": "📏 Unit of measure",
"default_qty_label": "🔢 Default quantity",
"conf_size_label": "📦 Each package contains:",
"conf_size_placeholder": "e.g. 300",
"notes_label": "📝 Notes",
"notes_placeholder": "E.g.: lactose free, organic, store in fridge after opening...",
"barcode_label": "🔖 Barcode",
"barcode_placeholder": "Barcode (if available)",
"barcode_hint": "⚠️ Add the barcode so next time you just need to scan it!",
"submit": "💾 Save Product",
"name_required": "Enter the product name",
"conf_size_required": "Specify the package content",
"expiry_estimated": "Estimated expiry:",
"scan_expiry": "Scan expiry date",
"expiry_hint": "📝 You can edit the date or scan it with the camera",
"add_batch": "📦 + Batch with different expiry",
"package_info": "📦 Package: {info}",
"edit_catalog": "⚙️ Edit product info (name, brand, category…)",
"not_recognized": "⚠️ Product not recognized",
"edit_info": "✏️ Edit information",
"modify_details": "EDIT\nexpiry, location…",
"already_in_pantry": "📋 Already in pantry",
"no_barcode": "No barcode"
},
"products": {
"title": "📦 All Products",
"search_placeholder": "🔍 Search product...",
"empty": "No products in database.\nScan a product to get started!",
"no_category": "No products in this category"
},
"recipes": {
"title": "🍳 Recipes",
"generate": "✨ Generate new recipe",
"archive_empty": "No recipes saved. Generate your first recipe!",
"dialog_title": "🍳 Recipe",
"dialog_desc": "I will generate a healthy recipe using pantry ingredients, prioritizing expiring items.",
"meal_label": "🕐 Which meal?",
"persons_label": "👥 How many people?",
"meal_type_label": "🎯 Meal type",
"opt_fast": "⚡ Quick meal",
"opt_light": "🥗 Light appetite",
"opt_expiry": "⏰ Prioritize expiring items",
"opt_healthy": "💚 Extra healthy",
"opt_opened": "📦 Prioritize opened items",
"opt_zero_waste": "♻️ Zero waste",
"generate_btn": "✨ Generate Recipe",
"loading_msg": "Preparing your recipe...",
"start_cooking": "👨‍🍳 Cooking Mode",
"regenerate": "🔄 Generate another one",
"close_btn": "✅ Close",
"ingredients_title": "🧾 Ingredients",
"steps_title": "👨‍🍳 Steps",
"no_steps": "No steps available",
"generate_error": "Generation error",
"persons_short": "serv.",
"use_ingredient_title": "Use ingredient",
"recipe_qty_label": "Recipe",
"from_where_label": "From where?",
"amount_label": "How much",
"use_amount_btn": "Use this amount",
"use_all_btn": "Use ALL / Finished",
"packs_label": "Packs",
"quantity_in_total": "Quantity in {unit} (total: {total})",
"packs_of_have": "Packs of {size} (you have {count} packs)",
"scale_wait_stable": "Wait 10s of stable weight for auto-fill…",
"ingredient_scaled_toast": "📦 Ingredient deducted from pantry!",
"finished_added_bring_toast": "🛒 Finished product → added to Bring!",
"load_error": "Loading error"
},
"shopping": {
"title": "🛒 Shopping List",
"bring_loading": "Connecting to Bring!...",
"tab_to_buy": "🛍️ To buy",
"tab_forecast": "🧠 Forecast",
"total_label": "💰 Estimated total",
"section_to_buy": "🛍️ To buy",
"suggestions_title": "💡 AI Suggestions",
"suggestions_add": "✅ Add selected to Bring!",
"search_prices": "🔍 Search all prices",
"suggest_btn": "🤖 Suggest what to buy",
"smart_title": "🧠 Smart Predictions",
"smart_empty": "No predictions available.<br>Add products to your pantry to receive smart predictions.",
"smart_filter_all": "All",
"smart_filter_critical": "🔴 Urgent",
"smart_filter_high": "🟠 Soon",
"smart_filter_medium": "🟡 Plan",
"smart_filter_low": "🟢 Forecast",
"smart_add": "🛒 Add selected to Bring!",
"empty": "Shopping list empty!\nUse the button below to generate suggestions.",
"already_in_list": "🛒 \"{name}\" is already in the shopping list",
"already_in_list_short": "️ Already in the shopping list",
"add_prompt": "Do you want to add it to the shopping list?",
"smart_already": "📊 Smart shopping already predicts {name}",
"all_searched": "All products have already been searched. Use 🔄 to search individual ones.",
"search_complete": "Search complete: {count} products",
"removed_sufficient": "🧹 {removed} product(s) with sufficient stock removed from the list",
"bring_badge": "🛒 Already on Bring!",
"add_urgent_toast": "🔴 {n} urgent product(s) automatically added to Bring!",
"migration_done": "✅ {migrated} updated, {skipped} already ok",
"added_to_bring": "🛒 {n} products added to Bring!",
"added_to_bring_skip": "{n} already present",
"all_on_bring": "All products were already on Bring!",
"freq_high": "📈 Frequent",
"freq_regular": "📊 Regular",
"freq_occasional": "📉 Occasional",
"out_of_stock": "Out of stock",
"scan_toast": "📷 Scan: {name}",
"empty_category": "No products in this category",
"session_empty": "🛒 No products yet",
"urgency_critical": "Urgent",
"urgency_high": "Soon",
"urgency_medium": "Plan",
"urgency_low": "Forecast",
"urgency_medium_short": "Medium",
"urgency_low_short": "Ok",
"tag_urgent": "🔴 Urgent",
"tag_priority": "⭐ Priority",
"tag_check": "✅ Check",
"smart_already_predicted": "📊 Smart shopping already predicts <strong>{name}</strong>{urgency}.",
"item_removed": "✅ {name} removed from list!",
"urgency_spec_critical": "⚡ Urgent",
"urgency_spec_high": "🟠 Soon",
"bring_add_n": "Add {n} to Bring!",
"bring_add_selected": "Add selected to Bring!",
"bring_adding": "Adding...",
"bring_added_one": "1 product added to Bring!",
"bring_added_many": "{n} products added to Bring!",
"bring_skipped": "({n} already in list)",
"force_sync": "Force Bring! sync",
"scan_target_label": "You are looking for",
"scan_target_found": "Found! Remove from list",
"bring_add_one": "Add 1 product to Bring!",
"bring_add_many": "Add {n} products to Bring!",
"syncing": "Syncing…",
"sync_done": "Sync completed",
"price_searching": "Searching...",
"search_action": "Search",
"open_action": "Open",
"not_found": "Not found",
"search_price": "Search price",
"tap_to_scan": "Tap to scan",
"tag_title": "Tag",
"remove_title": "Remove",
"found_count": "{found}/{total} products found",
"savings_offers": "· 🏷️ You save €{amount} with offers",
"searching_progress": "Searching {current}/{total}...",
"remove_error": "Removal error",
"suggest_loading": "Analyzing...",
"suggest_error": "Suggestion generation error",
"priority_high": "High",
"priority_medium": "Medium",
"priority_low": "Low"
},
"ai": {
"title": "🤖 AI Identification",
"capture": "📸 Take Photo",
"retake": "🔄 Retake",
"hint": "Take a photo of the product and AI will try to identify it",
"identifying": "🤖 Identifying product...",
"no_api_key": "⚠️ Gemini API key not configured.\n<small>Add GEMINI_API_KEY to the .env file on the server.</small>",
"fields_filled": "✅ Fields filled by AI",
"use_data": "✅ Use AI data",
"use_data_no_barcode": "✅ Use AI data (no barcode)"
},
"log": {
"title": "📒 Operations Log",
"type_added": "Added",
"type_waste": "Discarded",
"type_used": "Used",
"type_bring": "Added to Bring!",
"undone_badge": "Undone",
"undo_title": "Undo this operation",
"load_error": "Error loading log",
"empty": "No operations recorded.",
"undo_action_remove": "removal of",
"undo_action_restore": "restock of",
"undo_confirm": "Undo this operation?\n→ {action} {name}",
"undo_success": "↩ Operation undone for {name}",
"already_undone": "Operation already undone",
"too_old": "Cannot undo operations older than 24 hours",
"undo_error": "Error during undo"
},
"chat": {
"title": "Gemini Chef",
"welcome": "Hi! I'm your kitchen assistant",
"welcome_desc": "Ask me to make you a juice, a snack, a quick dish... I know your pantry, your appliances and your preferences!",
"suggestion_snack": "🍿 Quick snack",
"suggestion_juice": "🥤 Juice/Smoothie",
"suggestion_light": "🥗 Something light",
"suggestion_expiry": "⏰ Use expiring items",
"clear": "New conversation",
"placeholder": "Ask something...",
"cleared": "Chat cleared",
"suggestion_snack_text": "What can I make for a quick snack?",
"suggestion_juice_text": "Make me a juice or smoothie with what I have",
"suggestion_light_text": "I'm hungry but want something light",
"suggestion_expiry_text": "What's about to expire and how can I use it?"
},
"cooking": {
"close": "Close",
"tts_btn": "Read aloud",
"restart": "↺ Restart",
"replay": "🔊 Replay",
"timer": "⏱️ {time} · Timer",
"prev": "◀ Previous",
"next": "Next ▶",
"ingredient_used": "✔️ Deducted",
"ingredient_use_btn": "📦 Use",
"ingredient_deduct_title": "Deduct from pantry",
"timer_expired_tts": "Timer {label} expired!",
"timer_warning_tts": "Heads up! {label}: 10 seconds left!",
"recipe_done_tts": "Recipe complete! Enjoy your meal!",
"expires_chip": "exp. {date}",
"finish": "✅ Finish"
},
"settings": {
"title": "⚙️ Settings",
"tab_api": "API Keys",
"tab_bring": "Bring!",
"tab_recipe": "Recipes",
"tab_mealplan": "Weekly Plan",
"tab_appliances": "Appliances",
"tab_spesa": "Online Shopping",
"tab_camera": "Camera",
"tab_security": "Security",
"tab_tts": "Voice (TTS)",
"tab_language": "Language",
"tab_scale": "Smart Scale",
"gemini": {
"title": "🤖 Google Gemini AI",
"hint": "API key for product identification, expiry dates and recipes.",
"key_label": "Gemini API Key"
},
"bring": {
"title": "🛒 Bring! Shopping List",
"hint": "Credentials for the Bring! shopping list integration.",
"email_label": "📧 Bring! Email",
"password_label": "🔒 Bring! Password"
},
"recipe": {
"title": "🍳 Recipe Preferences",
"hint": "Configure the default options for recipe generation.",
"persons_label": "👥 Default servings",
"options_label": "🎯 Default recipe options",
"fast": "⚡ Quick Meal",
"light": "🥗 Light Meal",
"expiry": "⏰ Expiry Priority",
"healthy": "💚 Extra Healthy",
"opened": "📦 Open Items Priority",
"zerowaste": "♻️ Zero Waste",
"dietary_label": "🚫 Intolerances / Restrictions",
"dietary_placeholder": "E.g.: gluten free, lactose free, vegetarian..."
},
"mealplan": {
"title": "📅 Weekly Meal Plan",
"hint": "Set the meal type for each day. It will be used as a guide in recipe generation.",
"enabled": "✅ Enable weekly meal plan",
"legend": "🌤️ = Lunch · 🌙 = Dinner · Tap a badge to change it.",
"types_title": "📋 Available types"
},
"appliances": {
"title": "🔌 Available Appliances",
"hint": "Indicate the appliances you have. They will be considered in recipe generation.",
"new_placeholder": "E.g.: Bread machine, Thermomix, Air fryer...",
"quick_title": "Quick add:",
"oven": "🔥 Oven",
"microwave": "📡 Microwave",
"air_fryer": "🍟 Air fryer",
"bread_maker": "🍞 Bread maker",
"bimby": "🤖 Thermomix/Cookeo",
"mixer": "🌀 Stand mixer",
"steamer": "♨️ Steamer",
"pressure_cooker": "🫕 Pressure cooker",
"toaster": "🍞 Toaster",
"blender": "🍹 Blender",
"empty": "No appliances added"
},
"spesa": {
"title": "🛍️ Online Shopping",
"hint": "Configure the online shopping provider.",
"provider_label": "🏪 Provider",
"email_label": "📧 Email",
"password_label": "🔒 Password",
"login_btn": "🔐 Login",
"ai_prompt_label": "🤖 AI product selection prompt",
"ai_prompt_placeholder": "Instructions for AI when choosing between multiple products...",
"ai_prompt_hint": "AI uses this prompt to choose the most appropriate product from results. Leave empty for default behavior.",
"configure_first": "Configure Online Shopping in settings first",
"missing_credentials": "Enter email and password",
"login_in_progress": "Signing in...",
"login_error_prefix": "Error:",
"login_network_error_prefix": "Network error:",
"login_success_default": "Login successful!",
"result_name_label": "Name",
"result_card_label": "Card",
"result_pickup_label": "Pickup point",
"result_points_label": "Loyalty points",
"connected_relogin": "✅ Connected — Sign in again",
"connected_as": "Connected as {name}"
},
"camera": {
"title": "📷 Camera",
"hint": "Choose which camera to use for barcode scanning and AI identification.",
"device_label": "📸 Default camera",
"back": "📱 Rear (default)",
"front": "🤳 Front",
"devices_hint": "If you have multiple cameras, you can select a specific one from the list above after granting permissions.",
"detect_btn": "🔄 Detect cameras"
},
"security": {
"title": "🔒 HTTPS Certificate",
"hint": "If the browser shows the error \"Your connection is not private\" (ERR_CERT_AUTHORITY_INVALID), you need to install the CA certificate on the device.",
"download_btn": "📥 Download CA Certificate"
},
"tts": {
"title": "🔊 Voice & TTS",
"hint": "Configure text-to-speech via any external REST API. Recipe steps and expired timers will be sent to the configured endpoint.",
"enabled": "✅ Enable TTS",
"url_label": "🌐 Endpoint URL",
"method_label": "📡 HTTP Method",
"auth_label": "🔐 Authentication",
"auth_bearer": "Bearer Token",
"auth_custom": "Custom Header",
"auth_none": "None",
"token_label": "🔑 Bearer Token",
"custom_header_name": "📋 Header name",
"custom_header_value": "📋 Header value",
"content_type_label": "📄 Content-Type",
"payload_key_label": "🗝️ Text field in payload",
"payload_key_hint": "Name of the JSON field that will contain the text to read (e.g.: message, text).",
"extra_fields_label": " Extra fields (JSON)",
"extra_fields_placeholder": "{\"entity_id\": \"media_player.living_room\"}",
"extra_fields_hint": "Additional fields to include in the payload, in JSON format. Leave empty if not needed.",
"test_btn": "🔊 Send Test Voice"
},
"language": {
"title": "🌐 Language",
"hint": "Select the interface language.",
"label": "🌐 Language",
"restart_notice": "The page will reload to apply the new language."
},
"scale": {
"title": "⚖️ Smart Scale",
"hint": "Connect a Bluetooth scale via the Android gateway to automatically read weight.",
"tab": "Smart Scale",
"enabled": "✅ Enable smart scale",
"url_label": "🌐 WebSocket Gateway URL",
"url_placeholder": "ws://192.168.1.x:8765",
"url_hint": "URL shown by the Android app (same Wi-Fi network). E.g.:",
"test_btn": "🔗 Test connection",
"download_btn": "📥 Download Android Gateway (APK)",
"download_hint": "Android app that bridges your BLE scale and EverShelf.",
"download_sub": "Source: evershelf-scale-gateway/ in the project root"
},
"kiosk": {
"hint": "Turn an Android tablet into an always-on EverShelf panel with built-in BLE scale gateway.",
"download_btn": "📥 Download EverShelf Kiosk (APK)",
"download_sub": "Full-screen kiosk mode + integrated scale gateway. Source: evershelf-kiosk/"
},
"saved": "✅ Configuration saved!",
"saved_local": "✅ Configuration saved locally",
"saved_local_error": "⚠️ Saved locally, server error: {error}"
},
"expiry": {
"today": "TODAY",
"tomorrow": "Tomorrow",
"days": "{days} days",
"expired_days": "{days}d ago",
"expired_yesterday": "Yesterday",
"expired_today": "Today",
"badge_today": "⚠️ Expires today!",
"badge_tomorrow": "⏰ Tomorrow",
"badge_tomorrow_long": "⏰ Expires tomorrow",
"badge_days": "⏰ {n} days",
"badge_expired_ago": "⚠️ Expired {n}d ago",
"badge_expired": "⛔ Expired!",
"badge_stable": "✅ Stable",
"badge_expiring_short": "⏰ Exp. in {n}d",
"badge_ok_still": "✅ Still {n}d",
"badge_expires_red": "🔴 Exp. in {n}d",
"badge_expires_yellow": "🟡 Exp. in {n}d",
"badge_expired_bare": "⚠️ Expired",
"badge_expires_warn": "⚠️ Exp. in {n}d",
"badge_days_left": "⏳ ~{n}d left",
"days_approx": "~{n} days",
"weeks_approx": "~{n} weeks",
"months_approx": "~{n} months",
"years_approx": "~{n} years",
"expired_today_long": "Expired today",
"expired_ago_long": "Expired {n} days ago",
"expired_suffix": "— Expired!",
"days_compact": "{n}d"
},
"status": {
"ok": "OK",
"check": "Check",
"discard": "Discard",
"tip_freezer_ok": "In freezer: still safe (~{n}d margin)",
"tip_freezer_check": "In freezer for a long time, may have lost quality. Consume soon",
"tip_freezer_danger": "In freezer too long, risk of freezer burn and degradation",
"tip_highRisk_check": "Expired recently, check smell and appearance before consuming",
"tip_highRisk_danger": "Perishable product expired: discard for safety",
"tip_medRisk_check1": "Check appearance and smell before consuming",
"tip_medRisk_check2": "Expired a while ago, check carefully before use",
"tip_medRisk_danger": "Too long since expiry, better to discard",
"tip_lowRisk_ok": "Long-lasting product, still safe to consume",
"tip_lowRisk_check": "Expired over a month ago, check package integrity",
"tip_lowRisk_danger": "Expired too long ago, better not to risk it"
},
"toast": {
"product_saved": "Product saved!",
"product_created": "Product created!",
"product_updated": "✅ Product updated!",
"product_removed": "Product removed",
"updated": "Updated!",
"quantity_confirmed": "✓ Quantity confirmed",
"added_to_inventory": "✅ {name} added!",
"removed_from_list": "✅ {name} removed from the list!",
"removed_from_list_short": "Removed from the list",
"added_to_shopping": "🛒 Added to the shopping list!",
"removed_from_shopping": "🛒 Removed from the shopping list",
"finished_to_bring": "🛒 Product finished → added to Bring!",
"thrown_away": "🗑️ {name} thrown away!",
"thrown_away_partial": "🗑️ Thrown away {qty} {unit} of {name}",
"product_finished_confirmed": "✅ Removed — add it again when you restock",
"appliance_added": "Appliance added",
"item_added": "{name} added"
},
"antiwaste": {
"title": "🌱 Anti-Waste Report",
"grade_label": "Grade",
"you": "You",
"avg_label": "Avg",
"better": "🎉 You lose {diff}% less than the {country}!",
"worse": "⚠️ You lose more than the {country}. Room for improvement!",
"on_par": "→ You're at the {country}. You can do better!",
"saved_money": "~{amount}/month saved",
"saved_meals": "~{n} meals saved",
"saved_co2": "{n} kg CO₂ avoided",
"trend_title": "Trend (last 3 months)",
"months_ago_2": "-60 days",
"months_ago_1": "-30 days",
"this_month": "Now",
"country_it": "Italian avg",
"country_de": "German avg",
"country_en": "US average",
"source": "Sources: REDUCE, Eurostat, USDA 2021",
"live_on": "Live data",
"live_off": "Offline",
"meals": "meals",
"annual_info": "📅 You ~{you} kg/yr · avg ~{avg} kg/yr · range {min}{max}%",
"badge_rate": "loss rate",
"badge_saved_money": "saved vs avg",
"badge_wasted": "items lost",
"badge_better": "less than avg"
},
"error": {
"generic": "Error",
"network": "Network error",
"no_api_key": "Configure the API key in settings",
"loading": "Error loading product",
"not_found": "Product not found",
"not_found_manual": "Product not found. Enter it manually.",
"search": "Search error. Try again.",
"search_short": "Search error",
"save": "Error saving",
"connection": "Connection error",
"camera": "Cannot access camera",
"bring_add": "Error adding to Bring!",
"bring_connection": "Bring! connection error",
"identification": "Identification error",
"ai_quota": "AI quota exhausted. Please try again in a few minutes.",
"barcode_empty": "Enter a barcode",
"barcode_format": "Barcode must contain only numbers (4-14 digits)",
"min_chars": "Type at least 2 characters",
"not_in_inventory": "Product not in inventory",
"appliance_exists": "Appliance already exists",
"already_exists": "Already exists",
"network_retry": "Connection error. Try again.",
"select_items": "Select at least one product"
},
"confirm": {
"remove_item": "Do you really want to remove this product from inventory?",
"kiosk_exit": "Exit kiosk mode?"
},
"edit": {
"title": "Edit {name}",
"unknown_hint": "Enter the product name and information",
"label_name": "🏷️ Product name"
},
"screensaver": {
"recipe_btn": "Recipes",
"scan_btn": "Scan product"
},
"days": {
"mon": "Monday",
"tue": "Tuesday",
"wed": "Wednesday",
"thu": "Thursday",
"fri": "Friday",
"sat": "Saturday",
"sun": "Sunday",
"mon_short": "Mon",
"tue_short": "Tue",
"wed_short": "Wed",
"thu_short": "Thu",
"fri_short": "Fri",
"sat_short": "Sat",
"sun_short": "Sun"
},
"meal_types": {
"lunch": "Lunch",
"dinner": "Dinner",
"colazione": "Breakfast",
"merenda": "Snack",
"dolce": "Dessert",
"succo": "Fruit Juice",
"pranzo": "Lunch",
"cena": "Dinner"
},
"scale": {
"status_connected": "Scale connected",
"status_searching": "Gateway connected, waiting for scale…",
"status_disconnected": "Scale gateway unreachable",
"status_error": "Gateway connection error",
"not_connected": "Scale gateway not connected",
"read_btn": "⚖️ Read from scale",
"reading_title": "Scale reading",
"place_on_scale": "Place the product on the scale…",
"waiting_stable": "Weight will be captured automatically once the reading is stable.",
"no_url": "Enter the gateway URL",
"testing": "⏳ Testing connection…",
"connected_ok": "Gateway connection successful!",
"timeout": "Timeout: no response from gateway",
"error_connect": "Cannot connect to gateway",
"tab": "Smart Scale",
"low_weight": "Weight < 10 g · enter manually\n(auto-reading requires at least 10 g)",
"density_hint": "(density {density} g/ml)",
"ml_hint": "(will be converted to ml)",
"weight_detected": "Weight detected — wait 10s for stability…",
"weight_too_low": "Weight too low — waiting…",
"stable": "✓ Stable",
"auto_confirm": "✅ {val} {unit} — auto-confirm in 5s (tap to cancel)",
"cancelled_replace": "Cancelled — replace the ingredient on the scale to resume"
},
"prediction": {
"expected_qty": "Expected: {expected} {unit}",
"actual_qty": "Current: {actual} {unit}",
"check_suggestion": "Check or weigh the remaining quantity"
},
"date": {
"today": "📅 Today",
"yesterday": "📅 Yesterday"
},
"scanner": {
"title_barcode": "🔖 Scan Barcode",
"barcode_hint": "Frame the product barcode",
"barcode_manual_placeholder": "Or enter manually...",
"barcode_use_btn": "✅ Use this code",
"ai_identifying": "🤖 Identifying product...",
"ai_analyzing": "🤖 AI analysis in progress...",
"product_label_hint": "Frame the product label",
"expiry_label_hint": "Frame the expiry date printed on the product",
"capture_btn": "📸 Capture",
"capture_photo_btn": "📸 Take Photo",
"retake_btn": "🔄 Retake",
"camera_error_hint": "Ensure you use HTTPS and have granted camera permissions.<br>You can enter the barcode manually or use AI identification.",
"no_barcode": "No barcode"
},
"lowstock": {
"title": "⚠️ Running low!",
"message": "{name} is running low — only {qty} remaining.",
"question": "Do you want to add it to the shopping list?",
"yes": "🛒 Yes, add to Bring!",
"no": "No, I'm fine for now"
},
"move": {
"title": "📦 Move the rest?",
"question": "Do you want to move the {thing} of {name} to another location?",
"question_short": "Do you want to move the {thing} to another location?",
"thing_opened": "opened package",
"thing_rest": "rest",
"stay_btn": "No, stay in {location}",
"moved_toast": "📦 Opened package moved to {location}",
"vacuum_restore": "🫙 Restore vacuum sealed"
},
"nova": {
"1": "Unprocessed",
"2": "Culinary ingredient",
"3": "Processed",
"4": "Ultra-processed"
},
"meal_plan_types": {
"pasta": "Pasta",
"riso": "Rice",
"carne": "Meat",
"pesce": "Fish",
"legumi": "Legumes",
"uova": "Eggs",
"formaggio": "Cheese",
"pizza": "Pizza",
"affettati": "Cold Cuts",
"verdure": "Veggies",
"zuppa": "Soup",
"insalata": "Salad",
"pane": "Bread/Sandwich",
"dolce": "Dessert",
"libero": "Free"
},
"meal_sub": {
"dolce_torta": "Cake",
"dolce_crema": "Cream / Pudding",
"dolce_crumble": "Crumble / Tart",
"dolce_biscotti": "Cookies / Pastries",
"dolce_frutta": "Fruit Dessert",
"succo_dolce": "Sweet / Fruity",
"succo_energizzante": "Energizing",
"succo_detox": "Detox / Green",
"succo_rinfrescante": "Refreshing",
"succo_vitaminico": "Vitamin / Citrus"
},
"meal_plan": {
"reset_success": "Weekly plan reset",
"suggested_by": "suggested by weekly plan"
},
"kiosk_session": {
"first_item": "First item: {name}!",
"items_two_four": "{n} items — warming up 🚀",
"items_five_nine": "{n} items — great pace! 💪",
"items_ten_twenty": "{n} items — almost a record 🏆",
"items_twenty_plus": "{n} items — epic shopping! 🛒🔥",
"duplicates_one": "1 duplicate (same thing twice)",
"duplicates_many": "{n} duplicates (picked multiple times)",
"top_category": "Top category: {cat} ({count}×)",
"items_fallback": "{n} item{plural} added"
}
}