{ "nav": { "recipes": "Recipes", "explore": "Explore", "search": "Search", "feed": "Feed", "collections": "Collections", "mealPlan": "Meal Plan", "pantry": "Pantry", "shopping": "Shopping", "settings": "Settings", "admin": "Admin", "signOut": "Sign out", "apiKeys": "API keys", "webhooks": "Webhooks", "language": "Language" }, "recipe": { "ingredients": "Ingredients", "instructions": "Instructions", "photos": "Photos", "servings": "{count} servings", "prep": "{mins}m prep", "cook": "{mins}m cook", "total": "{mins}m total", "edit": "Edit", "variations": "Variations", "save": "Save", "cancel": "Cancel", "delete": "Delete", "noIngredientsSteps": "No ingredients or steps yet.", "generateContent": "Generate with AI", "editManually": "Edit manually", "deleted": "Recipe deleted", "deleteFailed": "Delete failed", "imported": "Recipe imported! Review before publishing.", "adapted": "Adapted recipe saved as draft", "adaptFailed": "Failed to adapt recipe", "adaptConstraintRequired": "Select at least one ingredient to exclude or add a constraint", "variationsDirectionsPlaceholder": "e.g. make it vegan, use only pantry staples, reduce sugar…", "historyRestoreFailed": "Failed to restore version", "pairingMealFailed": "Failed to suggest pairings", "pairingDrinkFailed": "Failed to suggest drinks", "pairingGenerateFailed": "Failed to generate \"{name}\"", "pairingSaveFailed": "Failed to save \"{name}\"", "pairingSuccess": "Recipe generated — review before publishing", "shoppingListCreateFailed": "Failed to create list", "shoppingListAddFailed": "Failed to add ingredients", "bulkDeleted": "{count, plural, one {1 recipe deleted} other {{count} recipes deleted}}", "bulkVisibility": "{count, plural, one {1 recipe set to {visibility}} other {{count} recipes set to {visibility}}}", "bulkDeleteFailed": "Delete failed", "bulkUpdateFailed": "Update failed", "visibility": { "private": "Private", "unlisted": "Unlisted", "public": "Public" }, "difficulty": { "easy": "Easy", "medium": "Medium", "hard": "Hard" }, "dietary": { "vegan": "Vegan", "vegetarian": "Vegetarian", "glutenFree": "Gluten-free", "dairyFree": "Dairy-free", "nutFree": "Nut-free", "halal": "Halal", "kosher": "Kosher" } }, "ai": { "generate": { "title": "Generate recipe with AI", "description": "Describe what you want to cook and AI will create a complete recipe.", "descriptionFull": "Describe a dish in words or snap a photo — AI builds the full recipe.", "tabDescribe": "Describe", "tabPhoto": "From photo", "surpriseMe": "Surprise me", "prompt": "What do you want to cook?", "placeholder": "e.g. A creamy mushroom risotto with parmesan, serves 4, easy difficulty", "language": "Recipe language", "difficulty": "Difficulty", "anyDifficulty": "Any", "button": "Generate", "generating": "Generating…", "success": "Recipe generated! Review and edit before publishing.", "error": "Failed to generate recipe", "saveError": "Failed to save generated recipe", "uploadClick": "Click to upload", "uploadDrag": "or drag a food photo", "uploadFormats": "JPEG, PNG or WebP · AI will reverse-engineer the recipe", "analyzing": "Analyzing…", "analyzePhoto": "Analyzing dish photo…", "recognizeDish": "Recognize dish", "photoSuccess": "Recipe recognized! Review and edit before publishing.", "photoError": "Failed to analyze photo", "contentGenerated": "Ingredients and steps generated!", "contentGenerateFailed": "Generation failed", "contentSaveFailed": "Failed to save generated content", "generatingContent": "Generating recipe content…" }, "variations": { "title": "AI Recipe Variations", "description": "Generate creative variations of this recipe — dietary adaptations, flavor twists, technique changes.", "generate": "Generate 3 variations", "generating": "Generating variations…", "regenerate": "Regenerate", "apply": "Apply", "applying": "Applying…", "ingredientChanges": "Ingredient changes", "stepChanges": "Step changes", "success": "Variation created — review and edit before publishing.", "error": "Failed to generate variations", "saveError": "Failed to save variation", "wait": "This may take 20–30 seconds" }, "translate": { "title": "Translate Recipe", "description": "Translate this recipe's title, description, ingredients, and steps into another language.", "targetLanguage": "Target language", "button": "Translate", "translating": "Translating…", "success": "Translation saved as new draft recipe.", "error": "Failed to translate recipe", "saveError": "Failed to save translated recipe", "wait": "This may take 20–30 seconds" } }, "settings": { "title": "Settings", "profile": "Profile", "language": "Language", "units": "Units", "metric": "Metric", "imperial": "Imperial" }, "common": { "loading": "Loading…", "error": "Something went wrong", "save": "Save", "saved": "Saved", "saveFailed": "Failed to save", "deleteFailed": "Delete failed", "updateFailed": "Update failed", "copyFailed": "Failed to copy to clipboard", "deleted": "Deleted", "cancel": "Cancel", "delete": "Delete", "confirm": "Confirm", "back": "Back", "difficulty": "Difficulty", "anyDifficulty": "Any", "editManually": "Edit manually", "surpriseMe": "Surprise me", "generatingContent": "Generating recipe content…" }, "auth": { "signIn": "Sign in", "signInTitle": "Sign in to your recipe library", "signInLoading": "Signing in…", "signInFailed": "Sign in failed", "signUp": "Sign up", "signUpTitle": "Create account", "signUpSubtitle": "Start building your recipe library", "signUpLoading": "Creating account…", "signUpFailed": "Sign up failed", "signUpSuccess": "Account created — check your email to verify", "continueWithGoogle": "Continue with Google", "continueWithGithub": "Continue with GitHub", "continueWithDiscord": "Continue with Discord", "continueWithAuthentik": "Continue with Authentik", "email": "Email", "emailPlaceholder": "you@example.com", "password": "Password", "name": "Name", "namePlaceholder": "Your name", "forgotPassword": "Forgot password?", "forgotPasswordTitle": "Forgot password", "forgotPasswordSent": "Check your inbox", "forgotPasswordDescription": "Enter your email and we'll send you a reset link.", "forgotPasswordSentDescription": "If an account exists for that email, you'll receive a reset link shortly.", "forgotPasswordFailed": "Failed to send reset email", "sendResetLink": "Send reset link", "sendingLink": "Sending…", "resetPasswordTitle": "Reset password", "resetPasswordDescription": "Enter a new password for your account.", "newPassword": "New password", "confirmPassword": "Confirm password", "updatePassword": "Update password", "updatingPassword": "Updating…", "invalidToken": "Invalid or missing reset token.", "resetPasswordMismatch": "Passwords don't match", "resetPasswordFailed": "Reset failed — link may have expired", "resetPasswordSuccess": "Password updated", "noAccount": "No account? Sign up", "alreadyHaveAccount": "Already have an account? Sign in", "backToSignIn": "Back to sign in", "emailNotVerified": "Email not verified", "checkInboxVerification": "Check your inbox for a verification email.", "resendVerification": "Resend verification email", "resendingSending": "Sending…", "resendFailed": "Failed to resend", "resendSuccess": "Verification email sent — check your inbox", "or": "or" }, "recipes": { "title": "Recipes", "subtitle": "Your personal recipe library", "new": "New recipe", "newTitle": "New recipe", "newSubtitle": "Build your recipe from scratch", "importUrl": "Import URL", "generate": "Generate", "search": "Search recipes…", "noRecipes": "No recipes yet", "noMatch": "No recipes match", "clearSearch": "Clear search", "createFirst": "Create your first recipe", "resultSingular": "result", "resultPlural": "results", "for": "for" }, "recipeForm": { "titleLabel": "Title *", "titleRequired": "Title is required", "titlePlaceholder": "My amazing recipe", "descriptionLabel": "Description", "descriptionPlaceholder": "What makes this recipe special…", "servings": "Servings", "prepMins": "Prep (min)", "cookMins": "Cook (min)", "difficulty": "Difficulty", "visibility": "Visibility", "tags": "Tags", "tagsHelp": "Press Enter to add · Backspace to remove last · max 20 tags", "tagsPlaceholder": "Add tags… (press Enter)", "dietaryTags": "Dietary tags", "photos": "Photos", "ingredients": "Ingredients", "amount": "Amount", "unit": "Unit", "ingredient": "Ingredient", "note": "Note", "addIngredient": "Add ingredient", "steps": "Steps", "stepPlaceholder": "Step {n}…", "timerSeconds": "Timer (s)", "addStep": "Add step", "saving": "Saving…", "saveChanges": "Save changes", "createRecipe": "Create recipe", "updateSuccess": "Recipe updated", "createSuccess": "Recipe created", "saveError": "Failed to save recipe" }, "canCook": { "title": "What can I cook?", "subtitle": "Recipes you can make with your pantry", "emptyPantry": "Your pantry is empty", "addPantryItems": "Add pantry items", "readyToCook": "Ready to cook", "almostThere": "Almost there (70–99%)", "partialMatches": "Partial matches", "noMatches": "No strong matches found", "missing": "Missing", "ingredientProgress": "{matched}/{total} ingredients" }, "mealPlan": { "title": "Meal Plan", "shoppingLists": "Shopping lists", "addTo": "Add to {day} – {meal}", "searchRecipes": "Search recipes…", "servings": "Servings", "difficulty": "Difficulty", "noRecipes": "No recipes found", "addFailed": "Failed to add", "addedToPantry": "{count, plural, one {1 item added to pantry} other {{count} items added to pantry}}", "listCreated": "List created", "days": { "mon": "Mon", "tue": "Tue", "wed": "Wed", "thu": "Thu", "fri": "Fri", "sat": "Sat", "sun": "Sun" }, "meals": { "breakfast": "Breakfast", "lunch": "Lunch", "dinner": "Dinner", "snack": "Snack" }, "generateWithAi": "Generate with AI", "aiModalDescription": "AI will generate a full week of meals and create draft recipes for you.", "dietaryPrefs": "Dietary preferences", "dietaryPrefsPlaceholder": "e.g. vegetarian, gluten-free, low-carb…", "aiPantryNote": "Your pantry items will be considered when available.", "generating": "Generating…", "generate": "Generate", "cancel": "Cancel", "aiGenerated": "Meal plan generated!", "includePantryItems": "Include pantry items", "pantryMode": "Pantry mode — maximize use of what you have", "pantryModeDescription": "Prefer meals that use multiple pantry ingredients and minimize extra shopping." }, "pantry": { "title": "Pantry", "subtitle": "Track what you have on hand", "canCook": "What can I cook?" }, "feed": { "title": "Feed", "followEmpty": "Follow chefs to see their recipes here.", "noNew": "No new recipes from people you follow.", "following": "Following", "trending": "Trending", "trendingEmpty": "No trending recipes this week.", "loading": "Loading…" }, "shoppingLists": { "title": "Shopping Lists", "subtitle": "Plan your grocery runs", "empty": "No shopping lists yet", "listEmpty": "Empty", "generated": "Generated", "items": "{checked}/{total} items" }, "collections": { "title": "Collections", "subtitle": "Curate your favorite recipes into collections", "empty": "No collections yet", "public": "Public", "recipeCount": "{count} recipe", "recipeCountPlural": "{count} recipes" }, "social": { "followed": "Following", "unfollowed": "Unfollowed", "commentFailed": "Failed to post comment", "deleted": "Deleted", "ratingSaved": "Rating saved", "collectionCreated": "Collection created", "collectionForked": "Collection forked to your library", "inviteSent": "Invitation sent", "memberRemoved": "Member removed" }, "cookingMode": { "cooking": "Cooking", "stepOf": "Step {current} of {total}", "ingredients": "Ingredients", "startTimer": "Start timer", "timerDone": "Done", "pause": "Pause", "reset": "Reset", "previous": "Previous", "next": "Next", "finish": "Done!", "voiceNotSupported": "Voice not supported in this browser", "voiceError": "Voice error — try again", "enableVoice": "Enable voice control", "stopVoice": "Stop voice", "toggleIngredients": "Toggle ingredients", "shortcutsTitle": "Shortcuts & commands", "keyboardSection": "Keyboard", "voiceSection": "Voice commands", "enableMicFirst": "Enable voice via the mic button first.", "stepRepeatPrefix": "Step {n}: ", "shortcuts": { "nextStep": "Next step", "prevStep": "Previous step", "startTimer": "Start timer", "toggleHelp": "Toggle this panel", "exitMode": "Exit cook mode" }, "voiceLabels": { "nextCmd": "next / continue", "prevCmd": "previous / back", "timerCmd": "timer / start", "stopCmd": "stop / pause", "resetCmd": "reset", "repeatCmd": "repeat / again", "nextLabel": "Next step", "prevLabel": "Previous step", "timerLabel": "Start timer", "stopLabel": "Pause timer", "resetLabel": "Reset timer", "repeatLabel": "Re-read step" } }, "settingsForm": { "profile": "Profile", "displayName": "Display name", "email": "Email", "emailReadOnly": "Email cannot be changed here.", "saving": "Saving…", "title": "Settings", "subtitle": "Manage your account and preferences", "language": "Language", "languageDescription": "Choose your preferred language for the app and AI-generated content.", "changeEmail": "Change email", "newEmail": "New email address", "changeEmailDescription": "A verification link will be sent to your new address before it takes effect.", "sendVerification": "Send verification", "sendingVerification": "Sending…", "emailChangeSent": "Verification email sent. Check your inbox.", "emailChangeFailed": "Failed to send verification email.", "changePassword": "Change password", "currentPassword": "Current password", "newPassword": "New password", "confirmPassword": "Confirm new password", "passwordMismatch": "Passwords don't match.", "changingPassword": "Changing…", "changePasswordButton": "Change password", "passwordChanged": "Password changed successfully.", "passwordChangeFailed": "Failed to change password.", "webhookCreateFailed": "Failed to create webhook", "webhookDeleteFailed": "Failed to delete webhook", "webhookUpdateFailed": "Failed to update webhook", "redeliverySuccess": "Redelivery queued", "redeliveryFailed": "Failed to redeliver", "apiKeyCreateFailed": "Failed to create API key", "apiKeyRevokeFailed": "Failed to revoke API key", "copyFailed": "Failed to copy to clipboard", "byokSaveFailed": "Failed to save key", "byokRemoveFailed": "Failed to remove key", "modelSaved": "Model preferences saved", "modelSaveFailed": "Failed to save", "userUpdated": "User updated successfully", "userUpdateFailed": "Failed to save", "adminSettingsSaved": "Settings saved", "adminSettingsFailed": "Failed to save settings", "nutritionGoalsSaved": "Nutrition goals saved", "bio": "Bio", "publicBio": "Public bio", "publicBioDescription": "Shown on your public profile.", "publicBioPlaceholder": "Tell other cooks about yourself…", "privateBio": "AI context (private)", "privateBioDescription": "Never shown publicly. Injected into AI prompts to personalise suggestions — add your dietary preferences, kitchen equipment, cooking skill level, allergies, etc.", "privateBioPlaceholder": "e.g. I'm vegetarian, have a stand mixer and an air fryer, intermediate cook, allergic to tree nuts, prefer Mediterranean flavours…" } }