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:
Arnaud
2026-07-09 03:20:49 +02:00
parent e67145493e
commit 08ab9ac71f
16 changed files with 299 additions and 101 deletions
+85 -2
View File
@@ -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",