{
"nav": {
"diary": "Diary",
"foods": "Foods",
"wellness": "Wellness",
"statistics": "Statistics",
"goals": "Goals",
"settings": "Settings"
},
"routes": {
"diary": { "title": "Diary" },
"foods": { "title": "Foods" },
"wellness": { "title": "Wellness" },
"statistics": { "title": "Statistics" },
"goals": { "title": "Goals" },
"settings": { "title": "Settings" }
},
"common": {
"sign_out": "Sign Out",
"log_out": "Log Out",
"signing_out": "Signing out…",
"experimental": "Experimental",
"hide": "Hide",
"save": "Save",
"saving": "Saving…",
"cancel": "Cancel",
"back": "Back",
"close": "Close",
"delete": "Delete",
"signed_in": "Signed in",
"signed_out": "Signed out",
"linked": "Linked",
"unlinked": "Unlinked",
"admin": "admin",
"errors": {
"cant_reach_server": "Could not reach server",
"failed": "Failed",
"unlink_failed": "Could not unlink",
"save_failed": "Save failed",
"delete_failed": "Delete failed",
"name_required": "Name is required",
"network_error_upload": "Network error during upload",
"voice_unsupported": "Voice input not supported in this browser",
"cant_start_mic": "Couldn't start microphone"
}
},
"settings": {
"appearance": {
"section": "Appearance",
"theme": "Theme",
"accent_color": "Accent Color",
"navigation_style": "Navigation Style"
},
"regional": {
"section": "Regional & Units",
"language": "Language"
},
"diary": {
"section": "Diary",
"show_quick_calories": "Show Quick Calories Button",
"show_quick_calories_desc": "Adds a bolt icon on each meal section for fast calorie-only entry (no food, no portion). Useful when you know the calories but don't want to model the food, or when you're coming from Fitbit-style quick calories.",
"quick_calories_display": "Quick Calories Display",
"quick_calories_display_desc":"How multiple Quick Calorie entries in the same meal appear in the diary. Summed collapses them into one row; Separate shows each entry on its own line.",
"quick_calories_summed": "Summed",
"quick_calories_separate": "Separate"
},
"water": { "section": "Water" },
"foods": { "section": "Foods" },
"categories": { "section": "Categories" },
"nutrients": { "section": "Nutrients" },
"goals": { "section": "Calorie Goals" },
"body_stats": { "section": "Body Stats" },
"statistics": { "section": "Statistics" },
"connected_services": {
"section": "Food Sources",
"off": {
"header": "Open Food Facts",
"enable": "Enable Open Food Facts",
"enable_desc": "Search the global crowd-sourced food database when adding foods. No account needed for searches; one is only required to upload edits.",
"search_language": "Search Language",
"search_country": "Search Country",
"upload_country": "Upload Country",
"upload_country_auto": "Auto",
"import_portion": "Import Portion As",
"import_portion_100g": "Per 100g",
"import_portion_serving": "Per Serving",
"import_portion_desc": "When the scanned product has serving data, prefill the food with per-serving values instead of per-100g. Products without serving data on OFF always fall back to per-100g.",
"account_username": "Account Username",
"account_password": "Account Password",
"account_note": "Optional, only needed to upload edits.",
"account_create_link": "Create an OFF account →",
"username_placeholder": "OFF account username",
"password_placeholder": "OFF account password",
"auto_refresh": "Auto-Refresh",
"auto_refresh_desc": "How often to re-download the mirror from Open Food Facts. Each refresh pulls the full snapshot (~4 GB).",
"auto_refresh_off": "Off",
"auto_refresh_daily": "Daily",
"auto_refresh_weekly": "Weekly",
"auto_refresh_monthly": "Monthly"
}
},
"ai": { "section": "AI Assistant" },
"notifications": { "section": "Notifications" },
"wellness": { "section": "Wellness" },
"sharing": { "section": "Food Sharing" },
"profile_hero": {
"label_fallback": "My Profile",
"subtitle_empty": "Tap to add your name and photo"
},
"authentication": { "section": "Authentication" },
"users": {
"section": "Users",
"users_heading": "Users",
"add_user": "+ Add User",
"username": "Username",
"username_required": "Username *",
"full_name": "Full Name (Optional)",
"password_required": "Password *",
"confirm_required": "Confirm *",
"role": "Role",
"role_admin": "admin",
"role_user": "user",
"role_self_suffix": "(you)",
"create": "Create",
"creating": "Creating…",
"delete_user_title": "Delete {name}?",
"delete_user_message": "All of this user’s data — foods, meals, diary entries, settings — will be removed. This cannot be undone.",
"delete": "Delete",
"promote_title": "Promote {name}?",
"promote_message": "They’ll be able to manage users, sharing, email config, and OIDC providers.",
"promote_confirm": "Promote",
"demote_title": "Demote {name}?",
"demote_message": "They’ll lose admin access. You can promote them back later.",
"demote_confirm": "Demote",
"reset_password": "Reset Password",
"reset_password_prompt": "Set new password for {name}\n\n(Must be 8+ chars with upper, lower, number, and special character.)",
"invite_user": "Invite User",
"invite_user_explainer": "Send a sign-up link so the user picks their own password. Provide an email to send it directly (requires SMTP), or leave blank to generate a copyable link you can share any way you like.",
"email_optional": "Email (Optional)",
"send_invite": "Send Invite",
"generate_link": "Generate Invite Link",
"invite_sent": "Invite sent",
"invite_sent_to": "Invite sent to {email}",
"user_fallback": "user",
"share_link_intro": "Share this link:",
"copy": "Copy",
"copy_link": "Copy Link",
"add_user_show": "Add User Manually",
"add_user_hide": "Hide Manual Add",
"add_user_explainer": "You set the username and password yourself, then share them with the user. Useful when SMTP isn’t configured or for offline setups.",
"create_directly": "Create User",
"session_duration": "Session Duration",
"session_never": "Never expires",
"session_8h": "8 hours",
"session_1d": "1 day",
"session_7d": "7 days",
"session_30d": "30 days",
"session_90d": "90 days",
"session_1y": "1 year",
"save": "Save",
"disable_um": "Disable User Management",
"disable_um_subtitle": "Removes all user accounts and returns to single-user mode",
"disable_um_title": "Disable User Management?",
"disable_um_message": "This will remove all user accounts and their data cannot be recovered. The app will return to single-user mode.",
"disable_um_confirm": "Disable & delete all",
"enable_um": "Enable User Management",
"enable_um_subtitle": "Add multiple user accounts with separate data & settings",
"create_admin_account": "Create Admin Account",
"create_admin_explainer": "The first account is always admin. All existing food, meal, and diary data on this server will be assigned to it.",
"enable_create": "Enable & Create Admin",
"enabling": "Enabling…",
"toast_user_created": "User added",
"toast_user_deleted": "User deleted",
"toast_password_reset": "Password reset",
"toast_role_changed": "{name} is now {role}",
"toast_um_enabled": "User management enabled",
"toast_um_disabled": "User management disabled",
"toast_invite_sent": "Invite sent",
"toast_link_copied": "Copied!",
"err_username_required": "Username is required",
"err_passwords_mismatch": "Passwords do not match",
"err_username_password_required": "Username and password required",
"err_registration_failed": "Registration failed",
"err_failed_to_add": "Failed to add user",
"err_could_not_change_role": "Could not change role",
"err_could_not_reset_password": "Could not reset password",
"err_could_not_reach_server": "Could not reach server"
},
"email": { "section": "Email (SMTP)" },
"backup": { "section": "Backup & Restore" },
"importExport": { "section": "Import & Export" },
"server": { "section": "Server Connection" },
"diagnostics": { "section": "Diagnostics" },
"about": { "section": "About" }
},
"login": {
"subtitle": "Sign in to your account",
"username": "Username",
"username_placeholder": "Enter username",
"password": "Password",
"password_placeholder": "Enter password",
"sign_in": "Sign In",
"signing_in": "Signing in…",
"forgot_password": "Forgot Password?",
"locked_out": "Locked Out?",
"sso_sign_in_with": "Sign In With {provider}",
"sso_or": "or",
"no_signin_methods": "No sign-in methods available. Ask your administrator.",
"errors": {
"failed": "Login failed"
},
"recovery": {
"confirm": "This will delete all user accounts. Your food & diary data will be kept. Continue?",
"explainer": "If you never set up user accounts intentionally, you can disable user management. This will delete all user accounts. Your food & diary data will be kept.",
"token_prompt": "Enter the RECOVERY_TOKEN from your server environment:",
"token_placeholder": "Recovery token",
"action": "Disable User Management & Reset",
"disabling": "Disabling…",
"failed": "Recovery failed",
"success": "User management disabled — you are now in single-user mode",
"done": "User management has been disabled.
Redirecting…"
}
},
"forgot_password": {
"title": "Reset Password",
"intro": "Enter your email address and we'll send you a link to reset your password.",
"email_label": "Email address",
"send_link": "Send Reset Link",
"sending": "Sending…",
"back_to_signin": "Back to Sign In",
"sent": "If an account exists for {email}, a reset link has been sent. Check your inbox."
},
"reset_password": {
"title": "New Password",
"verifying": "Verifying link…",
"invalid_link": "This reset link is invalid or has expired.",
"request_new": "Request a New Link",
"success": "Password updated. Redirecting…",
"set_for": "Set a new password for {username}",
"new_password": "New password",
"confirm_password": "Confirm password",
"password_placeholder": "8+ chars, upper, lower, number, symbol",
"submit": "Set New Password",
"saving": "Saving…",
"errors": {
"required": "Password is required",
"mismatch": "Passwords do not match",
"failed": "Reset failed"
}
},
"profile": {
"title": "Profile",
"personal_info": "Personal Info",
"security": "Security",
"change_photo": "Change Photo",
"full_name": "Full Name",
"full_name_placeholder": "Your full name",
"email_placeholder": "Used for password resets",
"nickname": "Nickname / Display Name",
"nickname_placeholder": "What should we call you?",
"birthday": "Birthday",
"gender": "Gender",
"gender_unset": "Prefer not to say",
"change_password": "Change Password",
"set_password": "Set Password",
"current_password": "Current Password",
"confirm_new_password": "Confirm New Password",
"saved": "Profile saved",
"password_changed": "Password changed",
"linked_accounts": "Linked Accounts",
"no_linked_accounts": "No identity providers linked yet.",
"link_with": "Link with",
"unlink": "Unlink",
"danger_zone": "Danger Zone",
"delete_account": "Delete My Account",
"delete_account_explainer": "Permanently remove your account and all associated data — foods, meals, diary, wellness, settings.",
"delete_account_title": "Delete Your Account?",
"delete_account_message": "Your foods, meals, diary, settings, and wellness data will be permanently removed. This cannot be undone.",
"delete_account_confirm": "Delete Account",
"deleting": "Deleting…",
"account_deleted": "Account deleted",
"errors": {
"save_failed": "Could not save profile",
"upload_failed": "Upload failed",
"password_change_failed": "Could not change password",
"delete_account_failed": "Could not delete account"
}
},
"wizard": {
"nav": {
"skip": "Skip",
"get_started": "Get Started",
"next": "Next",
"finish": "Finish"
},
"welcome": {
"title": "Welcome to NutriTrace",
"desc": "Your personal nutrition tracker. Let's get you set up in about a minute."
},
"name": {
"title": "What should we call you?",
"desc": "Used in greetings, the side menu, and your AI assistant. You can change it later in Settings.",
"placeholder": "Your name (optional)"
},
"usermgmt": {
"create_account_title": "Create Your Account",
"create_account_desc": "Set up your admin account to secure your NutriTrace instance. You can invite other users later from Settings.",
"multi_user_title": "Multi-User Support",
"multi_user_desc": "NutriTrace can run in single-user mode (default) or multi-user mode with separate logins and password resets. You can always enable this later in Settings."
},
"units": {
"title": "Measurement System",
"desc": "How do you measure things?"
},
"gender": {
"title": "What is your gender?",
"desc": "Used to calculate your calorie needs."
},
"dob": {
"title": "When were you born?",
"desc": "Your age affects your metabolic rate."
},
"height": {
"title": "What is your height?",
"desc": "Used to estimate your calorie needs."
},
"weight": {
"title": "What is your weight?"
},
"target": {
"title": "What is your target weight?"
},
"activity": {
"title": "How active are you?",
"desc": "Affects your daily calorie needs."
},
"integrations": {
"title": "Integrations",
"desc": "Connect optional services. Skip anything you don't need — you can configure these later in Settings."
},
"notifications": {
"title": "Stay on Track",
"desc": "Get helpful reminders and celebrate your wins. You can customize all of these later in Settings."
},
"summary": {
"title": "Your Daily Goals",
"desc": "Calculated from your stats using the Mifflin-St Jeor formula."
},
"skip_modal": {
"title": "Skip Setup?",
"desc": "You can set up your goals, units, and integrations any time from Settings. Until then, calorie targets won't be calculated automatically.",
"continue": "Continue Setup",
"skip_now": "Skip for Now"
}
},
"diary": {
"add_food": "Add Food",
"notes_placeholder": "How did today feel? Sleep, energy, hunger, cravings…",
"quick_calories": {
"title": "Quick Calories",
"title_meal": "Quick Calories: {meal}",
"default_name": "Quick Calories",
"help": "Log just the {unit} when you don't have full nutrition info, or when you don't want to model the food. Adds straight to the diary; no food entry is created.",
"name_label": "Name (optional)",
"name_placeholder": "Office snack, hotel breakfast...",
"value_label": "{unit}",
"add": "Add",
"adding": "Adding…",
"cancel": "Cancel",
"summed_hint": "switch to Separate to edit individual entries"
},
"nav": {
"previous_day": "Previous Day",
"next_day": "Next Day",
"jump_to_date": "Jump to Date"
},
"actions": {
"cancel_selection": "Cancel Selection",
"delete_selected": "Delete Selected",
"log_water": "Log Water",
"log_water_long": "Water — log your water intake",
"nutrition_summary": "Nutrition Summary",
"nutrition_summary_long": "Nutrition Summary — full breakdown of today's nutrients",
"body_stats": "Body Stats",
"body_stats_long": "Body Stats — log weight, body fat, and measurements"
},
"toast": {
"body_stats_saved": "Body stats saved",
"updated": "Updated",
"item_removed": "Item removed",
"activity_removed": "Activity removed"
},
"errors": {
"note_save_failed": "Note save failed",
"name_required": "Please enter a name",
"nothing_to_save": "Nothing to save",
"activity_save_failed": "Could not save activity",
"activity_delete_failed": "Could not delete activity"
},
"activity": {
"section": "Activity",
"tap_to_add": "Tap to Add Activity",
"add": "Add Activity",
"add_to_diary": "Add to Diary",
"save_changes": "Save Changes",
"title_add": "Add Activity",
"title_edit": "Edit Activity",
"field_name": "Activity",
"field_name_placeholder": "e.g. Morning hike",
"field_kcal": "Calories Burned",
"field_kcal_placeholder": "kcal",
"field_duration": "Duration",
"field_duration_placeholder": "minutes",
"field_distance": "Distance",
"field_distance_placeholder": "e.g. 10 mi",
"field_optional": "(optional)",
"saving": "Adding…",
"estimated_short": "est.",
"wellness_hint": "Synced workouts from your device live in Wellness",
"not_counted": "not counted — using wearable",
"policy_chip": "Policy: wearable wins. Toggle in Settings → Diary.",
"actions": {
"edit": "Edit",
"delete": "Delete"
},
"errors": {
"name_required": "Name required",
"kcal_required": "Calories required"
}
}
},
"foods": {
"search_placeholder": "Search foods or scan barcode...",
"scan_barcode": "Scan Barcode",
"add_new": "Add New",
"n_selected": "{n} selected",
"add_n": "Add {n}",
"adding": "Adding…",
"add_selected_to_diary": "Add Selected to Diary",
"search_in": "Search {source}",
"searching_in": "Searching {source}…",
"no_results_in": "No results in {source}",
"looking_up_barcode": "Looking up barcode",
"detail": {
"edit": "Edit",
"edit_aria": "Edit food",
"add_to_diary": "Add to Diary",
"add_to_diary_aria": "Add to diary",
"add_to_which_meal": "Add to which meal?",
"per_serving": "per serving",
"barcode": "Barcode",
"added_to": "Added to {meal}",
"delete_aria": "Delete food",
"delete_confirm_title": "Delete this food?",
"delete_confirm_body": "\"{name}\" will be removed from your foods. Existing diary entries that reference this food are kept.",
"deleted": "Food deleted"
},
"sources": {
"local": "Local",
"from_others": "From Others"
},
"toast": {
"deleted": "Deleted",
"cloned": "Cloned"
}
},
"trace": {
"panel_label": "AI Coach Chat",
"ask_placeholder": "Ask me anything…",
"clear_conversation": "Clear Conversation",
"attach_image": "Attach Image"
},
"smart_log": {
"placeholder": "for breakfast I had 2 eggs and toast"
},
"goals": {
"save_goal": "Save Goal",
"toast": {
"goal_saved": "Goal saved",
"water_goal_saved": "Water goal saved",
"template_saved": "Template saved",
"template_applied": "\"{name}\" applied"
}
},
"food_editor": {
"name_placeholder": "Food name",
"brand_placeholder": "Brand (optional)",
"saved": "Saved",
"added_to_diary": "Added to diary",
"errors": {
"name_required": "Please enter a name"
}
},
"meal_editor": {
"meal_name_placeholder": "Meal name",
"recipe_name_placeholder": "Recipe name",
"servings": {
"title": "Servings",
"amount_placeholder": "Auto from ingredients",
"total_weight_hint": "Total weight. Auto from ingredients; override for cooking changes (e.g. boil-off).",
"yields_unit": "servings",
"yields_hint": "Number of servings this recipe makes.",
"per_serving_label": "Per serving:"
},
"errors": {
"no_ingredients": "Please add at least one ingredient"
}
},
"accept_invite": {
"title": "Create Account",
"verifying": "Verifying invite…",
"invalid_link": "This invite link is invalid or has expired. Ask your admin for a new one.",
"success": "Account created! Redirecting…",
"intro": "You've been invited to NutriTrace. Choose a username and password to get started.",
"intro_with_email": "You were invited as {email}. Choose a username and password to get started.",
"username_label": "Username *",
"username_placeholder": "Choose a username",
"full_name_label": "Full name (optional)",
"full_name_placeholder": "Your name",
"password_label": "Password *",
"confirm_label": "Confirm password *",
"submit": "Create account",
"creating": "Creating account…",
"errors": {
"username_required": "Username is required",
"failed": "Failed to create account"
}
}
}