batchCooking/apps/web/src/locales/fr/translation.json
kyuno053 ba3c978c25
feat(recipes): scroll infini + placeholders sur le parcours des sources externes (#71)
* fix(recipes): corrige la liste vide de sevenFiftyGAdapter quand le filtre est vide

L'endpoint IA que list() utilisait pour toute recherche (SEARCH_URL,
/genius/query/) répond avec un corps de réponse vide dès que query est
vide — vérifié en direct. Résultat : parcourir la source 750g sans filtre
ne remontait jamais aucune recette.

Corrigé en lisant un endpoint différent quand query est vide/absent :
dernieres-recettes.htm, le vrai catalogue paginé "dernières recettes" de
750g.com (pagination réelle via &page=N, contrairement à l'endpoint de
recherche). nextCursor suit désormais cette même distinction : toujours
null pour une recherche par texte (l'endpoint ne pagine pas), calculé
normalement pour le parcours sans filtre (une page sans aucune carte en
est le signal de fin, cet endpoint ne renvoyant ni 404 ni redirection une
fois la dernière page dépassée).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* feat(recipes): scroll infini + placeholders sur le parcours des sources externes

Remplace le bouton "Voir plus" de RecipeSourcesPanel par un scroll
infini : une ligne sentinelle en fin de liste (SourceItemTable), observée
via IntersectionObserver scopé au conteneur scrollable de la table,
déclenche le chargement de la page suivante quand elle approche du bas.

Le panel précharge en plus la page suivante dès que la page courante
s'affiche (pas seulement au moment où la sentinelle devient visible), pour
qu'un défilement rapide tombe le plus souvent sur une réponse déjà
arrivée plutôt que de déclencher un aller-retour réseau à ce moment précis.

Pendant un chargement (préchargé ou non), SourceItemTable ajoute des
lignes squelettes qui pulsent en bas de la liste au lieu de laisser un
vide. Un échec de chargement n'efface plus la liste déjà chargée comme
avant (bug corrigé au passage) — un message avec un lien "Réessayer"
s'affiche à la place ; ce correctif inclut aussi le nettoyage d'un
préchargement en échec qui, sinon, aurait fait rejouer indéfiniment la
même promesse déjà rejetée à chaque tentative de réessai.

Deux nouveaux scénarios Cypress (recipe-sources.feature) : chargement
automatique de pages supplémentaires sans bouton, et réessai après un
échec du chargement suivant. Suite e2e complète relancée (78/79, le seul
échec restant est un test préexistant sans rapport, recipe-form.feature,
signalé séparément).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-22 20:09:23 +02:00

1002 lines
34 KiB
JSON

{
"common": {
"saving": "Enregistrement…",
"saved": "Enregistré ✓",
"loadError": "Impossible de charger le planning, réessayez plus tard"
},
"errors": {
"VALIDATION_ERROR": "Erreur de validation",
"EMAIL_ALREADY_IN_USE": "Cet email est déjà utilisé",
"INVALID_CREDENTIALS": "Email ou mot de passe incorrect",
"NOT_AUTHENTICATED": "Vous devez être connecté",
"ALREADY_HAS_HOUSE": "Vous appartenez déjà à un foyer",
"NOT_HOUSE_ADMIN": "Seul l'administrateur du foyer peut faire ça",
"NOT_RECIPE_AUTHOR": "Seul l'auteur de la recette peut faire ça",
"NOT_FOUND": "Ressource introuvable",
"HOUSE_NOT_FOUND": "Votre profil n'a pas de foyer",
"DIET_NOT_FOUND": "Ce régime alimentaire n'existe pas",
"ALLERGY_NOT_FOUND": "Un des allergènes sélectionnés n'existe pas",
"INVITE_CODE_NOT_FOUND": "Ce code d'invitation ne correspond à aucun foyer",
"RECIPE_NOT_FOUND": "Cette recette n'existe pas",
"RECIPE_IN_USE": "Cette recette est encore utilisée dans un planning",
"RECIPE_ALREADY_IMPORTED": "Cette recette a déjà été importée",
"INGREDIENT_NOT_FOUND": "Un des ingrédients sélectionnés n'existe pas",
"UNIT_NOT_FOUND": "Une des unités sélectionnées n'existe pas",
"SOURCE_NOT_FOUND": "Une des sources sélectionnées n'existe pas",
"STEP_NOT_FOUND": "Cette étape n'existe pas",
"TECH_STEP_NOT_FOUND": "Cette technique n'existe pas",
"INVALID_CORRECTION_SPAN": "La sélection ne correspond plus au texte de l'étape",
"INTERNAL_ERROR": "Une erreur est survenue, réessayez plus tard"
},
"auth": {
"login": {
"title": "Se connecter",
"emailLabel": "Email",
"passwordLabel": "Mot de passe",
"submit": "Se connecter",
"submitting": "Connexion…",
"noAccount": "Pas encore de compte ?",
"createProfileLink": "Créer un profil"
},
"signup": {
"title": "Créer un profil",
"firstNameLabel": "Prénom",
"lastNameLabel": "Nom",
"emailLabel": "Email",
"passwordLabel": "Mot de passe",
"submit": "Créer mon profil",
"submitting": "Création…",
"hasAccount": "Déjà un compte ?",
"loginLink": "Se connecter"
}
},
"onboarding": {
"step": "Étape {{current}} sur {{total}}",
"continue": "Continuer",
"finish": "Terminer",
"loading": "Chargement…",
"diet": {
"title": "Un régime alimentaire particulier ?"
},
"household": {
"title": "Rejoignez ou créez un foyer",
"subtitle": "Optionnel — vous pourrez le faire plus tard depuis les paramètres.",
"skip": "Passer cette étape",
"alreadyHasHouse": "Vous faites déjà partie du foyer « {{name}} »."
},
"sources": {
"title": "Sources de recettes",
"subtitle": "Choisissez les sources dont vous voulez voir les recettes dans le catalogue de votre foyer.",
"legend": "Sources disponibles"
},
"allergens": {
"title": "Des allergies ou intolérances ?"
}
},
"layout": {
"sidebar": {
"collapse": "Replier le menu",
"expand": "Déplier le menu"
},
"nav": {
"planning": "Planning",
"recipes": "Recettes",
"shoppingList": "Liste de courses"
},
"settings": {
"toggle": "Paramètres",
"nav": {
"account": "Compte",
"preferences": "Préférences alimentaires",
"household": "Foyer",
"userPreferences": "Préférences utilisateur",
"credits": "Crédits"
}
},
"accountMenu": {
"myAccount": "Mon compte"
},
"greeting": "Bonjour {{firstName}} 👋",
"logout": "Se déconnecter"
},
"planning": {
"title": "Planning de la semaine",
"loading": "Chargement du planning…",
"weekNav": {
"thisWeek": "Cette semaine",
"prevWeek": "Semaine précédente",
"nextWeek": "Semaine suivante",
"label": "Semaine du {{range}}"
},
"calendar": {
"prevMonth": "Mois précédent",
"nextMonth": "Mois suivant"
},
"days": {
"lundi": "Lundi",
"mardi": "Mardi",
"mercredi": "Mercredi",
"jeudi": "Jeudi",
"vendredi": "Vendredi",
"samedi": "Samedi",
"dimanche": "Dimanche"
},
"meals": {
"petit-dejeuner": "Petit-déjeuner",
"collation": "Collation",
"dejeuner": "Déjeuner",
"gouter": "Goûter",
"diner": "Dîner"
},
"grid": {
"addRecipe": "Ajouter une recette",
"removeRecipe": "Retirer cette recette"
},
"picker": {
"title": "Choisir une recette",
"searchPlaceholder": "Rechercher une recette…",
"ingredientsFilterLabel": "Ingrédients",
"addIngredientFilter": "Ajouter un ingrédient",
"hideIngredientPicker": "Masquer",
"suitableForHouseholdLabel": "Convient à tout le foyer",
"loading": "Chargement des recettes…",
"empty": "Aucune recette ne correspond à ces filtres.",
"confirmTitle": "Ajouter {{recipe}}",
"portionsLabel": "Nombre de portions",
"backButton": "Retour",
"confirmButton": "Ajouter au planning",
"adding": "Ajout…",
"footerClose": "Fermer",
"footerConfirm": "Confirmer"
}
},
"recipes": {
"title": "Recettes",
"searchPlaceholder": "Rechercher une recette…",
"newButton": "Nouvelle recette",
"loading": "Chargement…",
"empty": "Aucune recette pour le moment.",
"notFound": "Cette recette n'existe pas.",
"editButton": "Modifier",
"deleteButton": "Supprimer",
"confirmDeleteButton": "Confirmer la suppression",
"cancelDeleteButton": "Annuler",
"ingredientsTitle": "Ingrédients",
"stepsTitle": "Préparation",
"techStepCorrection": {
"selectionLabel": "« {{text}} »",
"removeMatch": "Aucune technique ici",
"cancel": "Annuler",
"manualTooltip": "{{technique}} (correction manuelle)",
"discoverabilityHint": "💡 Sélectionnez du texte, ou cliquez sur une technique surlignée, pour la corriger."
},
"tabs": {
"favoris": "Favoris",
"perso": "Perso",
"foyer": "Foyer",
"publique": "Publique"
},
"table": {
"name": "Nom",
"allergens": "Allergènes / intolérances",
"diets": "Régime associé"
},
"sources": {
"searchPlaceholder": "Rechercher…",
"empty": "Aucune recette trouvée.",
"alreadyImported": "Déjà importée",
"loading": "Chargement…",
"loadError": "Impossible de charger cette source pour le moment.",
"loadMoreError": "Impossible de charger la suite pour le moment.",
"retry": "Réessayer",
"detail": {
"viewSource": "Voir sur le site d'origine"
},
"import": {
"title": "Revoir l'import",
"planningHint": "Cette recette sera automatiquement ajoutée à votre planning une fois importée.",
"loadError": "Impossible de charger cette recette pour le moment.",
"unresolvedTitle": "Ingrédients à compléter",
"unresolvedHint": "Ces lignes n'ont pas été reconnues automatiquement — choisissez le bon ingrédient, ou retirez-les.",
"resolveButton": "Choisir un ingrédient",
"discardButton": "Retirer cette ligne",
"submit": "Importer",
"submitting": "Import en cours…",
"genericError": "Le formulaire contient des erreurs"
}
},
"detail": {
"empty": "Sélectionnez une recette dans le tableau pour voir son détail ici.",
"favorite": "Ajouter aux favoris",
"unfavorite": "Retirer des favoris",
"portions": "{{count}} portion(s)"
},
"form": {
"newTitle": "Nouvelle recette",
"editTitle": "Modifier la recette",
"nameLabel": "Nom de la recette",
"descriptionLabel": "Description",
"pictureLabel": "Photo (URL)",
"portionsLabel": "Nombre de portions",
"visibilityLabel": "Visible par",
"visibility": {
"PERSONAL": "Moi uniquement",
"HOUSE": "Mon foyer",
"PUBLIC": "Tout le monde"
},
"dietsLabel": "Régime(s) associé(s)",
"searchIngredientPlaceholder": "Rechercher un ingrédient…",
"displayOptions": "Options d'affichage",
"showDietsLabel": "Régimes alimentaires",
"showAllergensLabel": "Allergènes",
"showReproducibleLabel": "Faisable maison",
"reproducibleBadge": "Faisable maison",
"reproducibleBadgeHint": "Chercher une recette pour {{name}}",
"allCategories": "Tout",
"allSubcategories": "Tout",
"noIngredientFound": "Aucun ingrédient trouvé.",
"category": {
"freshProduce": "Produits frais",
"meatAndSeafood": "Boucherie & poissonnerie",
"dryGoods": "Épicerie sèche",
"bakery": "Boulangerie",
"dairyAndCheese": "Crémerie & fromage",
"condimentsAndSpices": "Condiments & épices",
"cookingEssentials": "Aides culinaires"
},
"subcategory": {
"vegetables": "Légumes",
"fruits": "Fruits",
"freshHerbs": "Herbes fraîches",
"meats": "Viandes",
"poultry": "Volailles",
"fish": "Poissons",
"shellfish": "Crustacés & fruits de mer",
"starches": "Féculents",
"legumes": "Légumineuses",
"nutsAndSeeds": "Graines & fruits secs",
"other": "Autres",
"breads": "Pains",
"rawDough": "Pâtes à cuire",
"dairy": "Produits laitiers",
"eggs": "Oeufs",
"plantBasedAlternatives": "Alternatives végétales",
"spices": "Épices",
"sauces": "Sauces",
"seasonings": "Assaisonnements",
"bases": "Bases",
"thickeners": "Épaississants",
"sugars": "Sucres"
},
"quantityLabel": "Quantité",
"unitLabel": "Unité",
"unitPlaceholder": "Choisir une unité",
"unitMissingHint": "Choisissez une unité pour cet ingrédient.",
"duplicateIngredientHint": "Cet ingrédient apparaît plusieurs fois — retirez les doublons.",
"incompleteIngredientsHint": "Complétez la quantité et l'unité des ingrédients surlignés ci-dessus avant de continuer.",
"duplicateIngredientsHint": "Retirez les doublons parmi les ingrédients surlignés ci-dessus avant de continuer.",
"removeIngredient": "Retirer cet ingrédient",
"stepDescriptionPlaceholder": "Décrivez cette étape…",
"stepPicturePlaceholder": "Photo de l'étape (URL, optionnel)",
"moveStepUp": "Monter cette étape",
"moveStepDown": "Descendre cette étape",
"removeStep": "Supprimer cette étape",
"addStep": "Ajouter une étape",
"submit": "Enregistrer",
"submitting": "Enregistrement…",
"genericError": "Le formulaire contient des erreurs"
}
},
"shoppingList": {
"title": "Liste de courses",
"comingSoon": "Cette section arrive bientôt."
},
"account": {
"title": "Compte",
"identity": {
"firstNameLabel": "Prénom",
"lastNameLabel": "Nom",
"emailLabel": "Email"
},
"dangerZone": {
"title": "Zone dangereuse",
"description": "Supprimer votre compte est définitif et irréversible.",
"deleteButton": "Supprimer mon compte",
"passwordLabel": "Confirmez avec votre mot de passe",
"confirmButton": "Confirmer la suppression",
"cancelButton": "Annuler"
}
},
"preferences": {
"title": "Préférences alimentaires",
"form": {
"dietLabel": "Régime alimentaire",
"dietNone": "Aucun régime particulier",
"allergiesLabel": "Allergies",
"intolerancesLabel": "Intolérances",
"dislikedIngredientsLabel": "Aliments que vous n'aimez pas",
"removeDislikedIngredient": "Retirer cet aliment"
}
},
"userPreferences": {
"title": "Préférences utilisateur",
"themeLabel": "Thème",
"theme": {
"LIGHT": "Clair",
"DARK": "Sombre",
"SYSTEM": "Système"
}
},
"credits": {
"title": "Crédits",
"icons": {
"title": "Icônes d'ingrédients",
"description": "La plupart des icônes d'ingrédients de l'application proviennent des collections gratuites « Common ingredient icons » et « Common Utensils » de Food Icon Pack, sous licence Creative Commons Attribution 4.0. Elles ont été recolorées pour s'adapter aux thèmes clair et sombre de l'application.",
"licenseLabel": "Licence CC BY 4.0"
}
},
"household": {
"title": "Foyer",
"form": {
"nameLabel": "Nom du foyer"
},
"noHouse": {
"intro": "Vous n'appartenez à aucun foyer pour le moment.",
"createTitle": "Créer un foyer",
"createButton": "Créer",
"joinTitle": "Rejoindre un foyer",
"joinLabel": "Code d'invitation",
"joinButton": "Rejoindre"
},
"inviteCodeLabel": "Code d'invitation",
"copyButton": "Copier",
"copied": "Copié ✓",
"membersTitle": "Membres",
"adminBadge": "Admin",
"youSuffix": " (vous)",
"removeButton": "Retirer",
"leaveButton": "Quitter le foyer",
"sources": {
"title": "Sources de recettes",
"hint": "Les sources activées ci-dessous sont celles dont les recettes apparaissent dans le catalogue de votre foyer.",
"legend": "Sources disponibles",
"official": "Officielle",
"unofficial": "Non officielle"
},
"dangerZone": {
"title": "Zone dangereuse",
"description": "Supprimer le foyer le supprime pour tous ses membres, ainsi que son planning.",
"deleteButton": "Supprimer le foyer",
"confirmButton": "Confirmer la suppression",
"cancelButton": "Annuler"
}
},
"catalog": {
"units": {
"gram": "g",
"kilogram": "kg",
"milliliter": "ml",
"centiliter": "cl",
"liter": "l",
"tablespoon": "cuillère à soupe",
"teaspoon": "cuillère à café",
"piece": "unité",
"pinch": "pincée",
"slice": "tranche",
"clove": "gousse",
"bunch": "botte",
"sachet": "sachet",
"sprig": "brin",
"cup": "tasse",
"ounce": "once",
"pound": "livre"
},
"diets": {
"omnivore": "Omnivore",
"vegetarian": "Végétarien",
"vegan": "Végan",
"pescatarian": "Pescétarien",
"glutenFree": "Sans gluten"
},
"techSteps": {
"cook": "Cuire",
"fry": "Frire",
"melt": "Faire fondre",
"deglaze": "Déglacer",
"simmer": "Mijoter",
"boil": "Bouillir",
"roast": "Rôtir",
"grill": "Griller",
"panFry": "Sauter",
"blanch": "Blanchir",
"marinate": "Mariner",
"chop": "Hacher",
"peel": "Éplucher",
"mince": "Émincer",
"mix": "Mélanger",
"whisk": "Fouetter",
"foldIn": "Incorporer",
"setAside": "Réserver",
"season": "Assaisonner",
"drain": "Égoutter",
"brown": "Faire revenir",
"rest": "Laisser reposer",
"preheat": "Préchauffer",
"bake": "Cuire au four",
"plate": "Dresser",
"coat": "Napper"
},
"allergens": {
"gluten": "Gluten",
"crustaceans": "Crustacés",
"eggs": "Oeufs",
"fish": "Poissons",
"peanuts": "Arachides",
"soy": "Soja",
"milk": "Lait",
"treeNuts": "Fruits à coque",
"celery": "Céleri",
"mustard": "Moutarde",
"sesameSeeds": "Graines de sésame",
"sulfites": "Sulfites",
"lupin": "Lupin",
"molluscs": "Mollusques"
},
"ingredients": {
"tomato": "Tomate",
"onion": "Oignon",
"shallot": "Échalote",
"garlic": "Ail",
"carrot": "Carotte",
"zucchini": "Courgette",
"cucumber": "Concombre",
"gherkins": "Cornichons",
"bellPepper": "Poivron",
"mushroom": "Champignon",
"porcini": "Cèpes",
"eggplant": "Aubergine",
"broccoli": "Brocoli",
"cauliflower": "Chou-fleur",
"whiteCabbage": "Chou blanc",
"redCabbage": "Chou rouge",
"brusselsSprouts": "Chou de Bruxelles",
"spinach": "Épinard",
"swissChard": "Blette",
"lettuce": "Salade",
"arugula": "Roquette",
"watercress": "Cresson",
"leek": "Poireau",
"celery": "Céleri",
"radish": "Radis",
"beetroot": "Betterave",
"turnip": "Navet",
"parsnip": "Panais",
"greenBean": "Haricot vert",
"pea": "Petit pois",
"corn": "Maïs",
"artichoke": "Artichaut",
"fennel": "Fenouil",
"endive": "Endive",
"pumpkin": "Potiron",
"butternutSquash": "Butternut",
"asparagus": "Asperge",
"avocado": "Avocat",
"potato": "Pomme de terre",
"sweetPotato": "Patate douce",
"cherryTomato": "Tomates cerises",
"bokChoy": "Pak-choï",
"soybeanSprouts": "Germes de soja",
"shiitake": "Shiitake",
"daikon": "Daikon",
"freshGreenChili": "Piment vert frais",
"cardoon": "Cardon",
"radicchio": "Chicorée rouge",
"romanesco": "Chou romanesco",
"kohlrabi": "Chou-rave",
"napaCabbage": "Chou chinois",
"celeriac": "Céleri-rave",
"okra": "Gombo",
"springOnion": "Oignon nouveau",
"redKuriSquash": "Potimarron",
"rutabaga": "Rutabaga",
"samphire": "Salicorne",
"salsify": "Salsifis",
"lambsLettuce": "Mâche",
"escarole": "Scarole",
"lemon": "Citron",
"lime": "Citron vert",
"apple": "Pomme",
"pear": "Poire",
"banana": "Banane",
"orange": "Orange",
"clementine": "Clémentine",
"grapefruit": "Pamplemousse",
"strawberry": "Fraise",
"raspberry": "Framboise",
"blueberry": "Myrtille",
"blackberry": "Mûre",
"cherry": "Cerise",
"apricot": "Abricot",
"peach": "Pêche",
"plum": "Prune",
"grape": "Raisin",
"melon": "Melon",
"watermelon": "Pastèque",
"pineapple": "Ananas",
"mango": "Mangue",
"kiwi": "Kiwi",
"fig": "Figue",
"date": "Datte",
"lychee": "Litchi",
"pomegranate": "Grenade",
"rhubarb": "Rhubarbe",
"quince": "Coing",
"blackcurrant": "Cassis",
"cranberry": "Canneberge",
"redcurrant": "Groseille",
"persimmon": "Kaki",
"nectarine": "Nectarine",
"tamarind": "Tamarin",
"basil": "Basilic",
"parsley": "Persil",
"thyme": "Thym",
"rosemary": "Romarin",
"bayLeaf": "Laurier",
"chives": "Ciboulette",
"freshCilantro": "Coriandre fraîche",
"mint": "Menthe",
"oregano": "Origan",
"dill": "Aneth",
"tarragon": "Estragon",
"savory": "Sarriette",
"marjoram": "Marjolaine",
"sage": "Sauge",
"chervil": "Cerfeuil",
"ginger": "Gingembre",
"lemongrass": "Citronnelle",
"kaffirLime": "Combava",
"rabbit": "Lapin",
"groundBeef": "Bœuf haché",
"beefSteak": "Steak de bœuf",
"beefRoast": "Rôti de bœuf",
"vealCutlet": "Escalope de veau",
"porkTenderloin": "Filet mignon de porc",
"porkChop": "Côte de porc",
"groundVeal": "Veau haché",
"groundPork": "Porc haché",
"groundLamb": "Agneau haché",
"lamb": "Agneau",
"legOfLamb": "Gigot d'agneau",
"baconLardons": "Lardons",
"bacon": "Bacon",
"ham": "Jambon blanc",
"curedHam": "Jambon cru",
"sausage": "Saucisse",
"chorizo": "Chorizo",
"merguez": "Merguez",
"prosciutto": "Prosciutto",
"pancetta": "Pancetta",
"mortadella": "Mortadelle",
"salami": "Salami",
"andouille": "Andouille",
"andouillette": "Andouillette",
"whitePudding": "Boudin blanc",
"blackPudding": "Boudin noir",
"cervelat": "Cervelas",
"rillettes": "Rillettes",
"dryCuredSausage": "Saucisson sec",
"bayonneHam": "Jambon de Bayonne",
"coppa": "Coppa",
"rosetteSausage": "Rosette (saucisson)",
"vealLiver": "Foie de veau",
"vealKidneys": "Rognons de veau",
"vealBrain": "Cervelle de veau",
"vealSweetbread": "Ris de veau",
"beefTongue": "Langue de bœuf",
"tripe": "Tripes",
"venison": "Cerf",
"roeDeer": "Chevreuil",
"wildBoar": "Sanglier",
"horseMeat": "Cheval",
"beefHeart": "Cœur de bœuf",
"foieGras": "Foie gras",
"beefMuzzle": "Museau de bœuf",
"grisonsDriedBeef": "Viande des Grisons",
"chicken": "Poulet",
"groundChicken": "Poulet haché",
"turkey": "Dinde",
"groundTurkey": "Dinde hachée",
"duck": "Canard",
"duckBreast": "Magret de canard",
"quail": "Caille",
"guineaFowl": "Pintade",
"goose": "Oie",
"poultryLiver": "Foie de volaille",
"capon": "Chapon",
"pigeon": "Pigeon",
"pheasant": "Faisan",
"salmon": "Saumon",
"tuna": "Thon",
"cod": "Cabillaud",
"trout": "Truite",
"sardine": "Sardine",
"anchovy": "Anchois",
"whiting": "Merlan",
"surimi": "Surimi",
"seaBass": "Bar (loup de mer)",
"seaBream": "Dorade",
"sole": "Sole",
"turbot": "Turbot",
"hake": "Merlu",
"pollock": "Colin",
"saithe": "Lieu noir",
"haddock": "Églefin",
"mackerel": "Maquereau",
"herring": "Hareng",
"redMullet": "Rouget",
"skate": "Raie",
"monkfish": "Lotte",
"halibut": "Flétan",
"swordfish": "Espadon",
"carp": "Carpe",
"pike": "Brochet",
"perch": "Perche",
"tilapia": "Tilapia",
"pangasius": "Panga",
"smokedSalmon": "Saumon fumé",
"driedFish": "Poisson séché",
"eel": "Anguille",
"plaice": "Carrelet (ou plie)",
"saltCod": "Morue",
"lemonSole": "Limande",
"scorpionfish": "Rascasse",
"shrimp": "Crevettes",
"langoustine": "Langoustines",
"lobster": "Homard",
"crab": "Crabe",
"spinyLobster": "Langouste",
"mussels": "Moules",
"oysters": "Huîtres",
"scallops": "Saint-Jacques",
"squid": "Calamar",
"octopus": "Poulpe",
"clams": "Palourdes",
"whelks": "Bulots",
"spiderCrab": "Araignée de mer",
"periwinkle": "Bigorneau",
"crayfish": "Écrevisse",
"greyShrimp": "Crevette grise",
"cockle": "Coque",
"snail": "Escargot",
"cuttlefish": "Seiche",
"semolina": "Semoule",
"couscous": "Couscous",
"bulgur": "Boulgour",
"polenta": "Polenta",
"quinoa": "Quinoa",
"pasta": "Pâtes",
"wholeWheatPasta": "Pâtes complètes",
"rice": "Riz",
"basmatiRice": "Riz basmati",
"brownRice": "Riz complet",
"oats": "Flocons d'avoine",
"spaghetti": "Spaghetti",
"penne": "Penne",
"tagliatelle": "Tagliatelles",
"lasagnaSheets": "Lasagnes (feuilles)",
"gnocchi": "Gnocchi",
"arborioRice": "Riz arborio",
"riceNoodles": "Nouilles de riz",
"udonNoodles": "Nouilles udon",
"sobaNoodles": "Nouilles soba",
"chineseNoodles": "Nouilles chinoises",
"riceVermicelli": "Vermicelles de riz",
"soyVermicelli": "Vermicelles de soja",
"stickyRice": "Riz gluant",
"sushiRice": "Riz à sushi",
"jasmineRice": "Riz jasmin",
"greenLentils": "Lentilles vertes",
"redLentils": "Lentilles corail",
"chickpeas": "Pois chiches",
"whiteBeans": "Haricots blancs",
"kidneyBeans": "Haricots rouges",
"blackBeans": "Haricots noirs",
"splitPeas": "Pois cassés",
"favaBeans": "Fèves",
"edamame": "Edamame",
"pintoBeans": "Haricots pinto",
"flageoletBeans": "Haricots flageolets",
"goldenLentils": "Lentilles blondes",
"peanutsShelled": "Cacahuètes",
"almonds": "Amandes",
"walnuts": "Noix",
"hazelnuts": "Noisettes",
"cashews": "Noix de cajou",
"pistachios": "Pistaches",
"pecans": "Noix de pécan",
"almondPowder": "Poudre d'amande",
"pineNuts": "Pignons de pin",
"sunflowerSeeds": "Graines de tournesol",
"pumpkinSeeds": "Graines de courge",
"shreddedCoconut": "Noix de coco râpée",
"raisins": "Raisins secs",
"prunes": "Pruneaux",
"driedApricots": "Abricots secs",
"sesameSeeds": "Graines de sésame",
"blackMushrooms": "Champignons noirs",
"noriSeaweed": "Algue nori",
"wakameSeaweed": "Algue wakamé",
"kombuSeaweed": "Algue kombu",
"bambooShoots": "Pousses de bambou",
"waterChestnuts": "Châtaignes d'eau",
"bread": "Pain",
"sandwichBread": "Pain de mie",
"wholeWheatBread": "Pain complet",
"baguette": "Baguette",
"ryeBread": "Pain de seigle",
"breadcrumbs": "Chapelure",
"burgerBun": "Pain à burger",
"briocheBun": "Pain brioché",
"hotDogBun": "Pain à hot-dog",
"pitaBread": "Pain pita",
"bagel": "Pain bagel",
"naan": "Naan",
"wrapBread": "Pain wrap",
"vienneseBread": "Pain viennois",
"countryBread": "Pain de campagne",
"multigrainBread": "Pain aux céréales",
"breadRoll": "Petit pain",
"swedishBread": "Pain suédois",
"glutenFreeBread": "Pain sans gluten",
"rusk": "Biscotte",
"croutons": "Croûtons",
"focaccia": "Focaccia",
"ciabatta": "Ciabatta",
"cornTortilla": "Tortilla de maïs",
"wheatTortilla": "Tortilla de blé",
"breadstick": "Gressin",
"puffPastry": "Pâte feuilletée",
"shortcrustPastry": "Pâte brisée",
"pizzaDough": "Pâte à pizza",
"sweetShortcrustPastry": "Pâte à tarte sablée",
"milk": "Lait",
"butter": "Beurre",
"cremeFraiche": "Crème fraîche",
"liquidCream": "Crème liquide",
"cheese": "Fromage",
"emmental": "Emmental",
"gruyere": "Gruyère",
"parmesan": "Parmesan",
"mozzarella": "Mozzarella",
"goatCheese": "Chèvre (fromage)",
"feta": "Feta",
"comte": "Comté",
"fromageBlanc": "Fromage blanc",
"mascarpone": "Mascarpone",
"yogurt": "Yaourt",
"burrata": "Burrata",
"ricotta": "Ricotta",
"pecorino": "Pecorino",
"gorgonzola": "Gorgonzola",
"cheddar": "Cheddar",
"brie": "Brie",
"camembert": "Camembert",
"roquefort": "Roquefort",
"munster": "Munster",
"reblochon": "Reblochon",
"cantal": "Cantal",
"beaufort": "Beaufort",
"saintNectaire": "Saint-Nectaire",
"blueCheese": "Bleu (fromage)",
"cancoillotte": "Cancoillotte",
"tomme": "Tomme",
"epoisses": "Époisses",
"chaource": "Chaource",
"livarot": "Livarot",
"pontLeveque": "Pont-l'Évêque",
"morbier": "Morbier",
"racletteCheese": "Raclette (fromage)",
"fourmeDAmbert": "Fourme d'Ambert",
"salers": "Salers",
"ossauIraty": "Ossau-Iraty",
"vacherin": "Vacherin",
"saintMarcellin": "Saint-Marcellin",
"neufchatel": "Neufchâtel",
"crottinDeChavignol": "Crottin de Chavignol",
"abondanceCheese": "Abondance",
"carreDeLEst": "Carré de l'Est",
"edam": "Edam",
"gouda": "Gouda",
"mimolette": "Mimolette",
"maroilles": "Maroilles",
"montDor": "Mont d'or",
"kefir": "Kéfir",
"greekYogurt": "Yaourt à la grecque",
"egg": "Oeuf",
"eggYolk": "Jaune d'oeuf",
"eggWhite": "Blanc d'oeuf",
"coconutMilk": "Lait de coco",
"coconutCream": "Crème de coco",
"almondMilk": "Lait d'amande",
"oatMilk": "Lait d'avoine",
"tofu": "Tofu",
"silkenTofu": "Tofu soyeux",
"herbesDeProvence": "Herbes de Provence",
"blackPepper": "Poivre noir",
"paprika": "Paprika",
"espelettePepper": "Piment d'Espelette",
"cayennePepper": "Piment de Cayenne",
"cumin": "Cumin",
"curryPowder": "Curry (poudre)",
"turmeric": "Curcuma",
"cinnamon": "Cannelle",
"nutmeg": "Muscade",
"saffron": "Safran",
"clove": "Clou de girofle",
"vanillaBean": "Vanille (gousse)",
"whitePepper": "Poivre blanc",
"pinkPepper": "Poivre rose",
"sichuanPepper": "Poivre du Sichuan",
"smokedPaprika": "Paprika fumé",
"birdEyeChili": "Piment oiseau",
"juniperBerries": "Baies de genièvre",
"starAnise": "Anis étoilé (badiane)",
"greenAnise": "Anis vert",
"fennelSeeds": "Graines de fenouil",
"sumac": "Sumac",
"nigella": "Nigelle",
"allspice": "Quatre épices",
"colomboPowder": "Colombo (poudre)",
"baharat": "Baharat",
"horseradish": "Raifort",
"herbSalt": "Sel aux herbes",
"celerySalt": "Sel de céleri",
"fleurDeSel": "Fleur de sel",
"salt": "Sel",
"fiveSpice": "Cinq épices",
"garamMasala": "Garam masala",
"corianderSeeds": "Graines de coriandre",
"groundCoriander": "Coriandre en poudre",
"cardamom": "Cardamome",
"fenugreek": "Fenugrec",
"jalapeno": "Piment jalapeño",
"chipotle": "Piment chipotle",
"poblanoPepper": "Piment poblano",
"habanero": "Piment habanero",
"rasElHanout": "Ras el hanout",
"zaatar": "Za'atar",
"soySauce": "Sauce soja",
"mustard": "Moutarde",
"mayonnaise": "Mayonnaise",
"ketchup": "Ketchup",
"tabasco": "Tabasco",
"worcestershireSauce": "Sauce Worcestershire",
"fishSauce": "Sauce nuoc-mâm",
"wasabi": "Wasabi",
"harissa": "Harissa",
"curryPaste": "Pâte de curry",
"peanutButter": "Beurre de cacahuète",
"dijonMustard": "Moutarde de Dijon",
"wholegrainMustard": "Moutarde à l'ancienne",
"barbecueSauce": "Sauce barbecue",
"tartarSauce": "Sauce tartare",
"cocktailSauce": "Sauce cocktail",
"bearnaiseSauce": "Sauce béarnaise",
"hollandaiseSauce": "Sauce hollandaise",
"bechamelSauce": "Sauce béchamel",
"teriyakiSauce": "Sauce teriyaki",
"ponzuSauce": "Sauce ponzu",
"chimichurri": "Chimichurri",
"redPesto": "Pesto rouge (tomates séchées)",
"pesto": "Pesto",
"oysterSauce": "Sauce huître",
"hoisinSauce": "Sauce hoisin",
"sriracha": "Sauce sriracha",
"sweetChiliSauce": "Sauce sweet chili",
"miso": "Miso",
"shrimpPaste": "Pâte de crevettes",
"redCurryPaste": "Pâte de curry rouge (thaï)",
"greenCurryPaste": "Pâte de curry vert (thaï)",
"tahini": "Tahini",
"aioli": "Aïoli",
"vinaigrette": "Sauce vinaigrette",
"hummus": "Houmous",
"oliveOil": "Huile d'olive",
"sunflowerOil": "Huile de tournesol",
"rapeseedOil": "Huile de colza",
"coconutOil": "Huile de coco",
"sesameOil": "Huile de sésame",
"ciderVinegar": "Vinaigre de cidre",
"whiteVinegar": "Vinaigre blanc",
"balsamicVinegar": "Vinaigre balsamique",
"capers": "Câpres",
"olives": "Olives",
"blackOlives": "Olives noires",
"greenOlives": "Olives vertes",
"whiteWine": "Vin blanc (cuisine)",
"redWine": "Vin rouge (cuisine)",
"roseWine": "Vin rosé (cuisine)",
"redWineVinegar": "Vinaigre de vin rouge",
"whiteWineVinegar": "Vinaigre de vin blanc",
"sherryVinegar": "Vinaigre de xérès",
"walnutOil": "Huile de noix",
"hazelnutOil": "Huile de noisette",
"peanutOil": "Huile d'arachide",
"chiliOil": "Huile pimentée",
"riceVinegar": "Vinaigre de riz",
"cornOil": "Huile de maïs",
"grapeseedOil": "Huile de pépins de raisin",
"soybeanOil": "Huile de soja",
"palmOil": "Huile de palme",
"mirin": "Mirin",
"sake": "Saké (cuisine)",
"lemonJuice": "Jus de citron",
"limeJuice": "Jus de citron vert",
"orangeJuice": "Jus d'orange",
"appleJuice": "Jus de pomme",
"grapeJuice": "Jus de raisin",
"tomatoJuice": "Jus de tomate",
"cranberryJuice": "Jus de cranberry",
"coffee": "Café",
"tea": "Thé",
"beer": "Bière (cuisine)",
"cider": "Cidre (cuisine)",
"champagne": "Champagne / vin pétillant (cuisine)",
"portWine": "Porto (cuisine)",
"vinJaune": "Vin jaune (cuisine)",
"cognac": "Cognac",
"rum": "Rhum",
"whisky": "Whisky",
"vodka": "Vodka",
"wheatFlour": "Farine de blé",
"wholeWheatFlour": "Farine complète",
"cornFlour": "Farine de maïs",
"buckwheatFlour": "Farine de sarrasin",
"riceFlour": "Farine de riz",
"vegetableStockCube": "Bouillon cube légumes",
"chickenStockCube": "Bouillon cube volaille",
"tomatoPaste": "Concentré de tomate",
"tomatoCoulis": "Coulis de tomate",
"cannedPeeledTomatoes": "Tomates pelées (conserve)",
"sunDriedTomatoes": "Tomates séchées",
"vealStock": "Fond de veau",
"chickenStock": "Fond de volaille",
"beefStockCube": "Bouillon cube bœuf",
"fishStockCube": "Bouillon cube poisson",
"vegetableBroth": "Bouillon de légumes",
"chickenBroth": "Bouillon de volaille",
"beefBroth": "Bouillon de bœuf",
"courtBouillon": "Court-bouillon",
"dashi": "Dashi (bouillon japonais)",
"shellfishBisque": "Bisque de crustacés",
"tapiocaFlour": "Farine de tapioca",
"masaHarina": "Masa harina",
"water": "Eau",
"sparklingWater": "Eau gazeuse",
"orangeBlossomWater": "Eau de fleur d'oranger",
"roseWater": "Eau de rose",
"fishFumet": "Fumet de poisson",
"bakersYeast": "Levure boulangère",
"bakingPowder": "Levure chimique",
"cornstarch": "Maïzena",
"lupinFlour": "Farine de lupin",
"gelatin": "Gélatine",
"bakingSoda": "Bicarbonate de soude",
"potatoStarch": "Fécule de pomme de terre",
"sugar": "Sucre",
"honey": "Miel",
"mapleSyrup": "Sirop d'érable",
"brownSugar": "Sucre roux",
"powderedSugar": "Sucre glace",
"demeraraSugar": "Cassonade",
"darkChocolate": "Chocolat noir",
"milkChocolate": "Chocolat au lait",
"whiteChocolate": "Chocolat blanc",
"chocolateChips": "Pépites de chocolat",
"cocoaPowder": "Cacao en poudre",
"vanillaExtract": "Extrait de vanille",
"palmSugar": "Sucre de palme",
"caneSyrup": "Sirop de sucre de canne"
}
}
}