i18n: translate meal/drink pairing, nutrition, comments, DMs, people search, URL import
Full sweep of hardcoded English strings across:
- Meal pairing and drink pairing dialogs (titles, descriptions, role/
type labels, regenerate/generate buttons, progress labels) — also
fixed drink type labels that had French text hardcoded regardless
of locale ("Sans alcool"/"Chaud").
- Nutrition panel — had no useTranslations at all.
- Comments: header, empty/loading state, post/reply/cancel/delete
buttons, relative timestamps (just now/Xm ago/Xh ago/Xd ago), and
comment-reactions' toasts + aria-labels.
- Rating stars toasts.
- Direct messages: thread, conversation list, message button, both
/messages pages.
- People search page and component.
- URL import dialog (title, description, buttons, toasts).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -76,10 +76,43 @@
|
||||
"pairingSaveFailed": "Failed to save \"{name}\"",
|
||||
"pairingSuccess": "Recipe generated — review before publishing",
|
||||
"pairingBulkSuccess": "{count} recipes generated — find them in your library",
|
||||
"pairingDialogTitle": "Complete the meal",
|
||||
"pairingDialogDescription": "AI-suggested dishes that pair well with this recipe. Generate any of them as a new recipe.",
|
||||
"pairingFindingLabel": "Finding perfect pairings…",
|
||||
"pairingSuggestButton": "Suggest pairings",
|
||||
"pairingRegenerate": "Regenerate",
|
||||
"pairingGenerateButton": "Generate",
|
||||
"pairingGeneratingButton": "Generating {current}/{total}…",
|
||||
"pairingGeneratingLabel": "Generating recipe {current} of {total}…",
|
||||
"pairingRoleStarter": "Starter",
|
||||
"pairingRoleSide": "Side",
|
||||
"pairingRoleSalad": "Salad",
|
||||
"pairingRoleBread": "Bread",
|
||||
"pairingRoleDrink": "Drink",
|
||||
"pairingRoleDessert": "Dessert",
|
||||
"pairingRoleSauce": "Sauce",
|
||||
"drinksDialogTitle": "Drink pairings",
|
||||
"drinksDialogDescription": "AI-suggested drinks that complement this recipe.",
|
||||
"drinksSuggestButton": "Suggest drinks",
|
||||
"drinksExamplesLabel": "e.g.",
|
||||
"drinksTypeWine": "Wine",
|
||||
"drinksTypeBeer": "Beer",
|
||||
"drinksTypeCocktail": "Cocktail",
|
||||
"drinksTypeSpirit": "Spirit",
|
||||
"drinksTypeNonAlcoholic": "Non-alcoholic",
|
||||
"drinksTypeHot": "Hot",
|
||||
"cookAction": "Cook",
|
||||
"adaptConstraintPlaceholder": "e.g. Make it vegan, lower the calories, use pantry staples only, gluten-free…",
|
||||
"photoImportFailed": "Failed to import recipe from photo.",
|
||||
"importFromPhoto": "Import from Photo",
|
||||
"urlImportTitle": "Import recipe from URL",
|
||||
"urlImportDescription": "Paste a recipe URL and AI will extract the ingredients and instructions.",
|
||||
"urlImportLabel": "Recipe URL",
|
||||
"urlImportButton": "Import",
|
||||
"urlImportingButton": "Importing…",
|
||||
"urlImportFetchFailed": "Failed to import recipe",
|
||||
"urlImportSaveFailed": "Failed to save imported recipe",
|
||||
"urlImportSuccess": "Recipe imported! Review before publishing.",
|
||||
"analyzingPhoto": "Analyzing photo…",
|
||||
"pairMealTooltip": "Pair meal",
|
||||
"historyTooltip": "History",
|
||||
@@ -271,7 +304,42 @@
|
||||
"reset": "Reset",
|
||||
"aiScale": "AI Scale",
|
||||
"scaling": "Scaling…",
|
||||
"aiScaledNote": "AI-scaled quantities shown below"
|
||||
"aiScaledNote": "AI-scaled quantities shown below",
|
||||
"dismissAiScaling": "Dismiss AI scaling"
|
||||
},
|
||||
"people": {
|
||||
"title": "Find People",
|
||||
"subtitle": "Search for cooks to follow by name or username.",
|
||||
"searchPlaceholder": "Search people by name or username…",
|
||||
"searching": "Searching…",
|
||||
"noneFound": "No one found."
|
||||
},
|
||||
"messages": {
|
||||
"loading": "Loading…",
|
||||
"noMessagesYet": "No messages yet. Say hi!",
|
||||
"sendFailed": "Failed to send",
|
||||
"placeholder": "Type a message…",
|
||||
"noConversationsYet": "No conversations yet. Visit a profile to say hi.",
|
||||
"unknownUser": "Unknown",
|
||||
"noMessagesPreview": "No messages yet",
|
||||
"selectConversation": "Select a conversation",
|
||||
"messageButton": "Message",
|
||||
"startConversationFailed": "Failed to start conversation",
|
||||
"title": "Messages"
|
||||
},
|
||||
"nutritionPanel": {
|
||||
"estimateButton": "Estimate nutrition",
|
||||
"reEstimateButton": "Re-estimate",
|
||||
"estimating": "Estimating…",
|
||||
"estimatingNutrition": "Estimating nutrition…",
|
||||
"title": "Nutrition per serving",
|
||||
"estimateFailed": "Failed to estimate nutrition",
|
||||
"error": "Something went wrong",
|
||||
"protein": "Protein",
|
||||
"carbs": "Carbs",
|
||||
"fat": "Fat",
|
||||
"fiber": "Fiber",
|
||||
"sodium": "Sodium"
|
||||
},
|
||||
"explore": {
|
||||
"title": "Explore",
|
||||
@@ -642,7 +710,22 @@
|
||||
"inviteSent": "Invitation sent",
|
||||
"memberRemoved": "Member removed",
|
||||
"replyPlaceholder": "Reply…",
|
||||
"commentPlaceholder": "Share your thoughts…"
|
||||
"commentPlaceholder": "Share your thoughts…",
|
||||
"commentsTitle": "Comments",
|
||||
"noCommentsYet": "No comments yet. Be the first!",
|
||||
"postButton": "Post",
|
||||
"postingButton": "Posting…",
|
||||
"replyButton": "Reply",
|
||||
"reportButton": "Report",
|
||||
"ratingFailed": "Failed to rate",
|
||||
"justNow": "just now",
|
||||
"minutesAgo": "{mins}m ago",
|
||||
"hoursAgo": "{hours}h ago",
|
||||
"daysAgo": "{days}d ago",
|
||||
"signInToReact": "Sign in to react to comments",
|
||||
"reactionFailed": "Failed to update reaction",
|
||||
"addReaction": "Add {type} reaction",
|
||||
"removeReaction": "Remove {type} reaction"
|
||||
},
|
||||
"cookingMode": {
|
||||
"cooking": "Cooking",
|
||||
|
||||
@@ -77,9 +77,42 @@
|
||||
"pairingSaveFailed": "Échec de l'enregistrement de « {name} »",
|
||||
"pairingSuccess": "Recette générée — vérifiez avant de publier",
|
||||
"pairingBulkSuccess": "{count} recettes générées — retrouvez-les dans votre bibliothèque",
|
||||
"pairingDialogTitle": "Compléter le repas",
|
||||
"pairingDialogDescription": "Plats suggérés par l'IA qui accompagnent bien cette recette. Générez-en n'importe lequel comme nouvelle recette.",
|
||||
"pairingFindingLabel": "Recherche des meilleurs accords…",
|
||||
"pairingSuggestButton": "Suggérer des accompagnements",
|
||||
"pairingRegenerate": "Régénérer",
|
||||
"pairingGenerateButton": "Générer",
|
||||
"pairingGeneratingButton": "Génération {current}/{total}…",
|
||||
"pairingGeneratingLabel": "Génération de la recette {current} sur {total}…",
|
||||
"pairingRoleStarter": "Entrée",
|
||||
"pairingRoleSide": "Accompagnement",
|
||||
"pairingRoleSalad": "Salade",
|
||||
"pairingRoleBread": "Pain",
|
||||
"pairingRoleDrink": "Boisson",
|
||||
"pairingRoleDessert": "Dessert",
|
||||
"pairingRoleSauce": "Sauce",
|
||||
"drinksDialogTitle": "Accords boissons",
|
||||
"drinksDialogDescription": "Boissons suggérées par l'IA qui accompagnent cette recette.",
|
||||
"drinksSuggestButton": "Suggérer des boissons",
|
||||
"drinksExamplesLabel": "ex.",
|
||||
"drinksTypeWine": "Vin",
|
||||
"drinksTypeBeer": "Bière",
|
||||
"drinksTypeCocktail": "Cocktail",
|
||||
"drinksTypeSpirit": "Spiritueux",
|
||||
"drinksTypeNonAlcoholic": "Sans alcool",
|
||||
"drinksTypeHot": "Chaud",
|
||||
"cookAction": "Cuisiner",
|
||||
"photoImportFailed": "Échec de l'importation de la recette depuis la photo.",
|
||||
"importFromPhoto": "Importer depuis une photo",
|
||||
"urlImportTitle": "Importer une recette depuis une URL",
|
||||
"urlImportDescription": "Collez l'URL d'une recette et l'IA en extraira les ingrédients et les instructions.",
|
||||
"urlImportLabel": "URL de la recette",
|
||||
"urlImportButton": "Importer",
|
||||
"urlImportingButton": "Importation…",
|
||||
"urlImportFetchFailed": "Échec de l'importation de la recette",
|
||||
"urlImportSaveFailed": "Échec de l'enregistrement de la recette importée",
|
||||
"urlImportSuccess": "Recette importée ! Vérifiez-la avant de la publier.",
|
||||
"analyzingPhoto": "Analyse de la photo…",
|
||||
"pairMealTooltip": "Accorder un plat",
|
||||
"historyTooltip": "Historique",
|
||||
@@ -271,7 +304,42 @@
|
||||
"reset": "Réinitialiser",
|
||||
"aiScale": "Ajuster avec l'IA",
|
||||
"scaling": "Ajustement…",
|
||||
"aiScaledNote": "Quantités ajustées par l'IA affichées ci-dessous"
|
||||
"aiScaledNote": "Quantités ajustées par l'IA affichées ci-dessous",
|
||||
"dismissAiScaling": "Ignorer l'ajustement IA"
|
||||
},
|
||||
"people": {
|
||||
"title": "Trouver des personnes",
|
||||
"subtitle": "Recherchez des cuisiniers à suivre par nom ou nom d'utilisateur.",
|
||||
"searchPlaceholder": "Rechercher par nom ou nom d'utilisateur…",
|
||||
"searching": "Recherche…",
|
||||
"noneFound": "Personne trouvé."
|
||||
},
|
||||
"messages": {
|
||||
"loading": "Chargement…",
|
||||
"noMessagesYet": "Aucun message pour l'instant. Dites bonjour !",
|
||||
"sendFailed": "Échec de l'envoi",
|
||||
"placeholder": "Écrire un message…",
|
||||
"noConversationsYet": "Aucune conversation pour l'instant. Visitez un profil pour dire bonjour.",
|
||||
"unknownUser": "Inconnu",
|
||||
"noMessagesPreview": "Aucun message pour l'instant",
|
||||
"selectConversation": "Sélectionnez une conversation",
|
||||
"messageButton": "Message",
|
||||
"startConversationFailed": "Échec du démarrage de la conversation",
|
||||
"title": "Messages"
|
||||
},
|
||||
"nutritionPanel": {
|
||||
"estimateButton": "Estimer les valeurs nutritionnelles",
|
||||
"reEstimateButton": "Réestimer",
|
||||
"estimating": "Estimation…",
|
||||
"estimatingNutrition": "Estimation des valeurs nutritionnelles…",
|
||||
"title": "Valeurs nutritionnelles par portion",
|
||||
"estimateFailed": "Échec de l'estimation nutritionnelle",
|
||||
"error": "Une erreur s'est produite",
|
||||
"protein": "Protéines",
|
||||
"carbs": "Glucides",
|
||||
"fat": "Lipides",
|
||||
"fiber": "Fibres",
|
||||
"sodium": "Sodium"
|
||||
},
|
||||
"explore": {
|
||||
"title": "Explorer",
|
||||
@@ -630,7 +698,22 @@
|
||||
"inviteSent": "Invitation envoyée",
|
||||
"memberRemoved": "Membre supprimé",
|
||||
"replyPlaceholder": "Répondre…",
|
||||
"commentPlaceholder": "Partagez vos impressions…"
|
||||
"commentPlaceholder": "Partagez vos impressions…",
|
||||
"commentsTitle": "Commentaires",
|
||||
"noCommentsYet": "Aucun commentaire pour l'instant. Soyez le premier !",
|
||||
"postButton": "Publier",
|
||||
"postingButton": "Publication…",
|
||||
"replyButton": "Répondre",
|
||||
"reportButton": "Signaler",
|
||||
"ratingFailed": "Échec de la notation",
|
||||
"justNow": "à l'instant",
|
||||
"minutesAgo": "il y a {mins} min",
|
||||
"hoursAgo": "il y a {hours} h",
|
||||
"daysAgo": "il y a {days} j",
|
||||
"signInToReact": "Connectez-vous pour réagir aux commentaires",
|
||||
"reactionFailed": "Échec de la mise à jour de la réaction",
|
||||
"addReaction": "Ajouter la réaction {type}",
|
||||
"removeReaction": "Retirer la réaction {type}"
|
||||
},
|
||||
"cookingMode": {
|
||||
"cooking": "En cuisine",
|
||||
|
||||
Reference in New Issue
Block a user