From 1b787d0cd29e4f8da42002e1774ac37c4d16fbdc Mon Sep 17 00:00:00 2001 From: Nicolas Date: Wed, 19 Aug 2026 16:34:19 +0200 Subject: [PATCH 1/2] =?UTF-8?q?feat(catalog):=20=C3=A9toffe=20le=20catalog?= =?UTF-8?q?ue=20d'ingr=C3=A9dients=20=C3=A0=20partir=20de=20la=20table=20C?= =?UTF-8?q?iqual=202025?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Source : « Table des aliments moyens Ciqual 2025 » (ANSES, ciqual.anses.fr), utilisée comme source de noms pour combler des trous du catalogue plutôt qu'importée telle quelle — le fichier est une table de correspondance "aliment moyen ↔ aliments contributeurs" très granulaire (états de cuisson, produits de marque, boissons/snacks industriels), pas directement réutilisable comme liste d'ingrédients génériques pour une app de recettes. 55 nouveaux ingrédients ajoutés à reference-seed-data.ts, catégorisés et allergène-tagués selon les conventions existantes : - 26 fromages régionaux français (Brie, Camembert, Roquefort, Munster, Reblochon, Cantal, Beaufort, Saint-Nectaire, Cancoillotte, Tomme, Époisses, etc.) — allergène Lait. - 18 charcuteries/abats/gibiers (Andouille, Boudin blanc/noir, Rillettes, Foie de veau, Ris de veau, Tripes, Cerf, Chevreuil, Sanglier…). - 4 volailles (Caille, Pintade, Oie, Foie de volaille). - 2 poissons — allergène Poissons (Anguille, Carrelet). - 2 crustacés/mollusques — allergène Crustacés/Mollusques (Araignée de mer, Bigorneau). - 3 fruits/légumes (Cardon, Cassis, Canneberge). Chaque ajout a sa clé anglaise dans catalog-en-keys.ts ; translation.json régénéré via `tsx scripts/generate-catalog-i18n.ts` (pas d'édition manuelle). Pas de migration Prisma nécessaire — pure donnée de référence, upsertée par `seedReferenceData` au prochain déploiement/seed. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 5 --- apps/api/src/db/catalog-en-keys.ts | 56 ++++++++++++++++++++ apps/api/src/db/reference-seed-data.ts | 66 ++++++++++++++++++++++++ apps/web/src/locales/fr/translation.json | 56 ++++++++++++++++++++ 3 files changed, 178 insertions(+) diff --git a/apps/api/src/db/catalog-en-keys.ts b/apps/api/src/db/catalog-en-keys.ts index 875548b..0eadfa2 100644 --- a/apps/api/src/db/catalog-en-keys.ts +++ b/apps/api/src/db/catalog-en-keys.ts @@ -97,6 +97,7 @@ const INGREDIENT_KEYS: Record = { Shiitake: "shiitake", Daikon: "daikon", "Piment vert frais": "fresh_green_chili", + Cardon: "cardoon", // --- Produits frais / Fruits ----------------------------------------- Citron: "lemon", @@ -127,6 +128,8 @@ const INGREDIENT_KEYS: Record = { Grenade: "pomegranate", Rhubarbe: "rhubarb", Coing: "quince", + Cassis: "blackcurrant", + Canneberge: "cranberry", // --- Produits frais / Herbes fraîches --------------------------------- Basilic: "basil", @@ -169,12 +172,35 @@ const INGREDIENT_KEYS: Record = { Pancetta: "pancetta", Mortadelle: "mortadella", Salami: "salami", + Andouille: "andouille", + Andouillette: "andouillette", + "Boudin blanc": "white_pudding", + "Boudin noir": "black_pudding", + Cervelas: "cervelat", + Rillettes: "rillettes", + "Saucisson sec": "dry_cured_sausage", + "Jambon de Bayonne": "bayonne_ham", + Coppa: "coppa", + "Rosette (saucisson)": "rosette_sausage", + "Foie de veau": "veal_liver", + "Rognons de veau": "veal_kidneys", + "Cervelle de veau": "veal_brain", + "Ris de veau": "veal_sweetbread", + "Langue de bœuf": "beef_tongue", + Tripes: "tripe", + Cerf: "venison", + Chevreuil: "roe_deer", + Sanglier: "wild_boar", // --- Boucherie & poissonnerie / Volailles ----------------------------- Poulet: "chicken", Dinde: "turkey", Canard: "duck", "Magret de canard": "duck_breast", + Caille: "quail", + Pintade: "guinea_fowl", + Oie: "goose", + "Foie de volaille": "poultry_liver", // --- Boucherie & poissonnerie / Poissons ------------------------------- Saumon: "salmon", @@ -207,6 +233,8 @@ const INGREDIENT_KEYS: Record = { Panga: "pangasius", "Saumon fumé": "smoked_salmon", "Poisson séché": "dried_fish", + Anguille: "eel", + "Carrelet (ou plie)": "plaice", // --- Boucherie & poissonnerie / Crustacés & fruits de mer ------------- Crevettes: "shrimp", @@ -221,6 +249,8 @@ const INGREDIENT_KEYS: Record = { Poulpe: "octopus", Palourdes: "clams", Bulots: "whelks", + "Araignée de mer": "spider_crab", + Bigorneau: "periwinkle", // --- Épicerie sèche / Féculents ---------------------------------------- Semoule: "semolina", @@ -341,6 +371,32 @@ const INGREDIENT_KEYS: Record = { Pecorino: "pecorino", Gorgonzola: "gorgonzola", Cheddar: "cheddar", + Brie: "brie", + Camembert: "camembert", + Roquefort: "roquefort", + Munster: "munster", + Reblochon: "reblochon", + Cantal: "cantal", + Beaufort: "beaufort", + "Saint-Nectaire": "saint_nectaire", + "Bleu (fromage)": "blue_cheese", + Cancoillotte: "cancoillotte", + Tomme: "tomme", + Époisses: "epoisses", + Chaource: "chaource", + Livarot: "livarot", + "Pont-l'Évêque": "pont_leveque", + Morbier: "morbier", + "Raclette (fromage)": "raclette_cheese", + "Fourme d'Ambert": "fourme_d_ambert", + Salers: "salers", + "Ossau-Iraty": "ossau_iraty", + Vacherin: "vacherin", + "Saint-Marcellin": "saint_marcellin", + Neufchâtel: "neufchatel", + "Crottin de Chavignol": "crottin_de_chavignol", + Abondance: "abondance_cheese", + "Carré de l'Est": "carre_de_l_est", // --- Crémerie & fromage / Œufs ------------------------------------------- Œuf: "egg", diff --git a/apps/api/src/db/reference-seed-data.ts b/apps/api/src/db/reference-seed-data.ts index 1d7d63a..0add29f 100644 --- a/apps/api/src/db/reference-seed-data.ts +++ b/apps/api/src/db/reference-seed-data.ts @@ -158,6 +158,7 @@ export const INGREDIENT_GROUPS: Array<{ { name: "Shiitake", allergenNames: [] }, { name: "Daikon", allergenNames: [] }, { name: "Piment vert frais", allergenNames: [] }, + { name: "Cardon", allergenNames: [] }, ], }, { @@ -194,6 +195,8 @@ export const INGREDIENT_GROUPS: Array<{ { name: "Grenade", allergenNames: [] }, { name: "Rhubarbe", allergenNames: [] }, { name: "Coing", allergenNames: [] }, + { name: "Cassis", allergenNames: [] }, + { name: "Canneberge", allergenNames: [] }, ], }, { @@ -251,6 +254,28 @@ export const INGREDIENT_GROUPS: Array<{ { name: "Pancetta", allergenNames: [] }, { name: "Mortadelle", allergenNames: [] }, { name: "Salami", allergenNames: [] }, + // Added from the Ciqual 2025 "aliments moyens" table — French + // charcuterie/offal/game staples the pantry list was missing (see + // the PR description for how this batch was sourced/curated). + { name: "Andouille", allergenNames: [] }, + { name: "Andouillette", allergenNames: [] }, + { name: "Boudin blanc", allergenNames: [] }, + { name: "Boudin noir", allergenNames: [] }, + { name: "Cervelas", allergenNames: [] }, + { name: "Rillettes", allergenNames: [] }, + { name: "Saucisson sec", allergenNames: [] }, + { name: "Jambon de Bayonne", allergenNames: [] }, + { name: "Coppa", allergenNames: [] }, + { name: "Rosette (saucisson)", allergenNames: [] }, + { name: "Foie de veau", allergenNames: [] }, + { name: "Rognons de veau", allergenNames: [] }, + { name: "Cervelle de veau", allergenNames: [] }, + { name: "Ris de veau", allergenNames: [] }, + { name: "Langue de bœuf", allergenNames: [] }, + { name: "Tripes", allergenNames: [] }, + { name: "Cerf", allergenNames: [] }, + { name: "Chevreuil", allergenNames: [] }, + { name: "Sanglier", allergenNames: [] }, ], }, { @@ -263,6 +288,11 @@ export const INGREDIENT_GROUPS: Array<{ { name: "Dinde", allergenNames: [] }, { name: "Canard", allergenNames: [] }, { name: "Magret de canard", allergenNames: [] }, + // Ciqual 2025 additions — see the VIANDES group above. + { name: "Caille", allergenNames: [] }, + { name: "Pintade", allergenNames: [] }, + { name: "Oie", allergenNames: [] }, + { name: "Foie de volaille", allergenNames: [] }, ], }, { @@ -301,6 +331,9 @@ export const INGREDIENT_GROUPS: Array<{ { name: "Panga", allergenNames: ["Poissons"] }, { name: "Saumon fumé", allergenNames: ["Poissons"] }, { name: "Poisson séché", allergenNames: ["Poissons"] }, + // Ciqual 2025 additions. + { name: "Anguille", allergenNames: ["Poissons"] }, + { name: "Carrelet (ou plie)", allergenNames: ["Poissons"] }, ], }, { @@ -321,6 +354,9 @@ export const INGREDIENT_GROUPS: Array<{ { name: "Poulpe", allergenNames: ["Mollusques"] }, { name: "Palourdes", allergenNames: ["Mollusques"] }, { name: "Bulots", allergenNames: ["Mollusques"] }, + // Ciqual 2025 additions. + { name: "Araignée de mer", allergenNames: ["Crustacés"] }, + { name: "Bigorneau", allergenNames: ["Mollusques"] }, ], }, // ========================================================================= @@ -517,6 +553,36 @@ export const INGREDIENT_GROUPS: Array<{ { name: "Pecorino", icon: "CHEESE", allergenNames: ["Lait"] }, { name: "Gorgonzola", icon: "CHEESE", allergenNames: ["Lait"] }, { name: "Cheddar", icon: "CHEESE", allergenNames: ["Lait"] }, + // Ciqual 2025 additions — classic French regional cheeses the + // catalog only had a handful of internationally-known ones for + // (Emmental, Parmesan, Mozzarella…), missing the actual French + // aisle staples Ciqual's "aliments moyens" table surfaced. + { name: "Brie", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Camembert", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Roquefort", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Munster", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Reblochon", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Cantal", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Beaufort", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Saint-Nectaire", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Bleu (fromage)", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Cancoillotte", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Tomme", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Époisses", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Chaource", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Livarot", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Pont-l'Évêque", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Morbier", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Raclette (fromage)", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Fourme d'Ambert", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Salers", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Ossau-Iraty", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Vacherin", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Saint-Marcellin", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Neufchâtel", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Crottin de Chavignol", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Abondance", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Carré de l'Est", icon: "CHEESE", allergenNames: ["Lait"] }, ], }, { diff --git a/apps/web/src/locales/fr/translation.json b/apps/web/src/locales/fr/translation.json index b512aac..10380a8 100644 --- a/apps/web/src/locales/fr/translation.json +++ b/apps/web/src/locales/fr/translation.json @@ -384,6 +384,7 @@ "shiitake": "Shiitake", "daikon": "Daikon", "fresh_green_chili": "Piment vert frais", + "cardoon": "Cardon", "lemon": "Citron", "lime": "Citron vert", "apple": "Pomme", @@ -412,6 +413,8 @@ "pomegranate": "Grenade", "rhubarb": "Rhubarbe", "quince": "Coing", + "blackcurrant": "Cassis", + "cranberry": "Canneberge", "basil": "Basilic", "parsley": "Persil", "thyme": "Thym", @@ -450,10 +453,33 @@ "pancetta": "Pancetta", "mortadella": "Mortadelle", "salami": "Salami", + "andouille": "Andouille", + "andouillette": "Andouillette", + "white_pudding": "Boudin blanc", + "black_pudding": "Boudin noir", + "cervelat": "Cervelas", + "rillettes": "Rillettes", + "dry_cured_sausage": "Saucisson sec", + "bayonne_ham": "Jambon de Bayonne", + "coppa": "Coppa", + "rosette_sausage": "Rosette (saucisson)", + "veal_liver": "Foie de veau", + "veal_kidneys": "Rognons de veau", + "veal_brain": "Cervelle de veau", + "veal_sweetbread": "Ris de veau", + "beef_tongue": "Langue de bœuf", + "tripe": "Tripes", + "venison": "Cerf", + "roe_deer": "Chevreuil", + "wild_boar": "Sanglier", "chicken": "Poulet", "turkey": "Dinde", "duck": "Canard", "duck_breast": "Magret de canard", + "quail": "Caille", + "guinea_fowl": "Pintade", + "goose": "Oie", + "poultry_liver": "Foie de volaille", "salmon": "Saumon", "tuna": "Thon", "cod": "Cabillaud", @@ -484,6 +510,8 @@ "pangasius": "Panga", "smoked_salmon": "Saumon fumé", "dried_fish": "Poisson séché", + "eel": "Anguille", + "plaice": "Carrelet (ou plie)", "shrimp": "Crevettes", "langoustine": "Langoustines", "lobster": "Homard", @@ -496,6 +524,8 @@ "octopus": "Poulpe", "clams": "Palourdes", "whelks": "Bulots", + "spider_crab": "Araignée de mer", + "periwinkle": "Bigorneau", "semolina": "Semoule", "couscous": "Couscous", "bulgur": "Boulgour", @@ -603,6 +633,32 @@ "pecorino": "Pecorino", "gorgonzola": "Gorgonzola", "cheddar": "Cheddar", + "brie": "Brie", + "camembert": "Camembert", + "roquefort": "Roquefort", + "munster": "Munster", + "reblochon": "Reblochon", + "cantal": "Cantal", + "beaufort": "Beaufort", + "saint_nectaire": "Saint-Nectaire", + "blue_cheese": "Bleu (fromage)", + "cancoillotte": "Cancoillotte", + "tomme": "Tomme", + "epoisses": "Époisses", + "chaource": "Chaource", + "livarot": "Livarot", + "pont_leveque": "Pont-l'Évêque", + "morbier": "Morbier", + "raclette_cheese": "Raclette (fromage)", + "fourme_d_ambert": "Fourme d'Ambert", + "salers": "Salers", + "ossau_iraty": "Ossau-Iraty", + "vacherin": "Vacherin", + "saint_marcellin": "Saint-Marcellin", + "neufchatel": "Neufchâtel", + "crottin_de_chavignol": "Crottin de Chavignol", + "abondance_cheese": "Abondance", + "carre_de_l_est": "Carré de l'Est", "egg": "Œuf", "coconut_milk": "Lait de coco", "coconut_cream": "Crème de coco", From 84178a9f5acd8179078d6de6fd68c91424b35c35 Mon Sep 17 00:00:00 2001 From: Nicolas Date: Wed, 19 Aug 2026 17:07:34 +0200 Subject: [PATCH 2/2] =?UTF-8?q?feat(catalog):=20deuxi=C3=A8me=20passe=20Ci?= =?UTF-8?q?qual=20=E2=80=94=2053=20ingr=C3=A9dients=20suppl=C3=A9mentaires?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Suite de la première passe (55 ajouts) : relecture complète des 815 concepts restants après élimination du bruit commercial/branded, pour combler d'autres trous réels du catalogue. 53 nouveaux ingrédients : - 13 légumes (Chicorée rouge, Chou romanesco, Chou-rave, Chou chinois, Céleri-rave, Gombo, Oignon nouveau, Potimarron, Rutabaga, Salicorne, Salsifis, Mâche, Scarole). - 4 fruits (Groseille, Kaki, Nectarine, Tamarin). - 5 viandes/abats (Cheval, Cœur de bœuf, Foie gras, Museau de bœuf, Viande des Grisons). - 3 volailles/gibier à plumes (Chapon, Pigeon, Faisan). - 3 poissons — allergène Poissons (Morue, Limande, Rascasse). - 5 crustacés/mollusques (Écrevisse, Crevette grise — Crustacés ; Coque, Escargot, Seiche — Mollusques). - 7 crémerie (Edam, Gouda, Mimolette, Maroilles, Mont d'or — allergène Lait ; Kéfir, Yaourt à la grecque). - 1 boulangerie (Gressin — allergène Gluten). - 3 sauces (Aïoli — allergène Œufs ; Sauce vinaigrette ; Houmous — allergène Graines de sésame). - 7 assaisonnements (Huile de maïs/pépins de raisin/palme ; Huile de soja — allergène Soja ; Olives noires/vertes ; Vin rosé (cuisine) — allergène Sulfites). - 2 légumineuses (Haricots flageolets, Lentilles blondes). Mêmes conventions que la première passe : clé anglaise dans catalog-en-keys.ts, translation.json régénéré via `tsx scripts/generate-catalog-i18n.ts`, aucune migration nécessaire. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 5 --- apps/api/src/db/catalog-en-keys.ts | 53 ++++++++++++++++++ apps/api/src/db/reference-seed-data.ts | 68 ++++++++++++++++++++++++ apps/web/src/locales/fr/translation.json | 53 ++++++++++++++++++ 3 files changed, 174 insertions(+) diff --git a/apps/api/src/db/catalog-en-keys.ts b/apps/api/src/db/catalog-en-keys.ts index 0eadfa2..48979a6 100644 --- a/apps/api/src/db/catalog-en-keys.ts +++ b/apps/api/src/db/catalog-en-keys.ts @@ -98,6 +98,19 @@ const INGREDIENT_KEYS: Record = { Daikon: "daikon", "Piment vert frais": "fresh_green_chili", Cardon: "cardoon", + "Chicorée rouge": "radicchio", + "Chou romanesco": "romanesco", + "Chou-rave": "kohlrabi", + "Chou chinois": "napa_cabbage", + "Céleri-rave": "celeriac", + Gombo: "okra", + "Oignon nouveau": "spring_onion", + Potimarron: "red_kuri_squash", + Rutabaga: "rutabaga", + Salicorne: "samphire", + Salsifis: "salsify", + Mâche: "lambs_lettuce", + Scarole: "escarole", // --- Produits frais / Fruits ----------------------------------------- Citron: "lemon", @@ -130,6 +143,10 @@ const INGREDIENT_KEYS: Record = { Coing: "quince", Cassis: "blackcurrant", Canneberge: "cranberry", + Groseille: "redcurrant", + Kaki: "persimmon", + Nectarine: "nectarine", + Tamarin: "tamarind", // --- Produits frais / Herbes fraîches --------------------------------- Basilic: "basil", @@ -191,6 +208,11 @@ const INGREDIENT_KEYS: Record = { Cerf: "venison", Chevreuil: "roe_deer", Sanglier: "wild_boar", + Cheval: "horse_meat", + "Cœur de bœuf": "beef_heart", + "Foie gras": "foie_gras", + "Museau de bœuf": "beef_muzzle", + "Viande des Grisons": "grisons_dried_beef", // --- Boucherie & poissonnerie / Volailles ----------------------------- Poulet: "chicken", @@ -201,6 +223,9 @@ const INGREDIENT_KEYS: Record = { Pintade: "guinea_fowl", Oie: "goose", "Foie de volaille": "poultry_liver", + Chapon: "capon", + Pigeon: "pigeon", + Faisan: "pheasant", // --- Boucherie & poissonnerie / Poissons ------------------------------- Saumon: "salmon", @@ -235,6 +260,9 @@ const INGREDIENT_KEYS: Record = { "Poisson séché": "dried_fish", Anguille: "eel", "Carrelet (ou plie)": "plaice", + Morue: "salt_cod", + Limande: "lemon_sole", + Rascasse: "scorpionfish", // --- Boucherie & poissonnerie / Crustacés & fruits de mer ------------- Crevettes: "shrimp", @@ -251,6 +279,11 @@ const INGREDIENT_KEYS: Record = { Bulots: "whelks", "Araignée de mer": "spider_crab", Bigorneau: "periwinkle", + Écrevisse: "crayfish", + "Crevette grise": "grey_shrimp", + Coque: "cockle", + Escargot: "snail", + Seiche: "cuttlefish", // --- Épicerie sèche / Féculents ---------------------------------------- Semoule: "semolina", @@ -291,6 +324,8 @@ const INGREDIENT_KEYS: Record = { Fèves: "fava_beans", Edamame: "edamame", "Haricots pinto": "pinto_beans", + "Haricots flageolets": "flageolet_beans", + "Lentilles blondes": "golden_lentils", // --- Épicerie sèche / Graines & fruits secs ---------------------------- Cacahuètes: "peanuts_shelled", @@ -343,6 +378,7 @@ const INGREDIENT_KEYS: Record = { Ciabatta: "ciabatta", "Tortilla de maïs": "corn_tortilla", "Tortilla de blé": "wheat_tortilla", + Gressin: "breadstick", // --- Boulangerie / Pâtes à cuire ----------------------------------------- "Pâte feuilletée": "puff_pastry", @@ -397,6 +433,13 @@ const INGREDIENT_KEYS: Record = { "Crottin de Chavignol": "crottin_de_chavignol", Abondance: "abondance_cheese", "Carré de l'Est": "carre_de_l_est", + Edam: "edam", + Gouda: "gouda", + Mimolette: "mimolette", + Maroilles: "maroilles", + "Mont d'or": "mont_dor", + Kéfir: "kefir", + "Yaourt à la grecque": "greek_yogurt", // --- Crémerie & fromage / Œufs ------------------------------------------- Œuf: "egg", @@ -488,6 +531,9 @@ const INGREDIENT_KEYS: Record = { "Pâte de curry rouge (thaï)": "red_curry_paste", "Pâte de curry vert (thaï)": "green_curry_paste", Tahini: "tahini", + Aïoli: "aioli", + "Sauce vinaigrette": "vinaigrette", + Houmous: "hummus", // --- Condiments & épices / Assaisonnements ----------------------------------- "Huile d'olive": "olive_oil", @@ -500,8 +546,11 @@ const INGREDIENT_KEYS: Record = { "Vinaigre balsamique": "balsamic_vinegar", Câpres: "capers", Olives: "olives", + "Olives noires": "black_olives", + "Olives vertes": "green_olives", "Vin blanc (cuisine)": "white_wine", "Vin rouge (cuisine)": "red_wine", + "Vin rosé (cuisine)": "rose_wine", "Vinaigre de vin rouge": "red_wine_vinegar", "Vinaigre de vin blanc": "white_wine_vinegar", "Vinaigre de xérès": "sherry_vinegar", @@ -509,6 +558,10 @@ const INGREDIENT_KEYS: Record = { "Huile de noisette": "hazelnut_oil", "Huile d'arachide": "peanut_oil", "Huile pimentée": "chili_oil", + "Huile de maïs": "corn_oil", + "Huile de pépins de raisin": "grapeseed_oil", + "Huile de soja": "soybean_oil", + "Huile de palme": "palm_oil", "Vinaigre de riz": "rice_vinegar", Mirin: "mirin", "Saké (cuisine)": "sake", diff --git a/apps/api/src/db/reference-seed-data.ts b/apps/api/src/db/reference-seed-data.ts index 0add29f..e82ca20 100644 --- a/apps/api/src/db/reference-seed-data.ts +++ b/apps/api/src/db/reference-seed-data.ts @@ -159,6 +159,20 @@ export const INGREDIENT_GROUPS: Array<{ { name: "Daikon", allergenNames: [] }, { name: "Piment vert frais", allergenNames: [] }, { name: "Cardon", allergenNames: [] }, + // Second Ciqual pass — see the PR description. + { name: "Chicorée rouge", allergenNames: [] }, + { name: "Chou romanesco", allergenNames: [] }, + { name: "Chou-rave", allergenNames: [] }, + { name: "Chou chinois", allergenNames: [] }, + { name: "Céleri-rave", allergenNames: ["Céleri"] }, + { name: "Gombo", allergenNames: [] }, + { name: "Oignon nouveau", allergenNames: [] }, + { name: "Potimarron", allergenNames: [] }, + { name: "Rutabaga", allergenNames: [] }, + { name: "Salicorne", allergenNames: [] }, + { name: "Salsifis", allergenNames: [] }, + { name: "Mâche", allergenNames: [] }, + { name: "Scarole", allergenNames: [] }, ], }, { @@ -197,6 +211,11 @@ export const INGREDIENT_GROUPS: Array<{ { name: "Coing", allergenNames: [] }, { name: "Cassis", allergenNames: [] }, { name: "Canneberge", allergenNames: [] }, + // Second Ciqual pass. + { name: "Groseille", allergenNames: [] }, + { name: "Kaki", allergenNames: [] }, + { name: "Nectarine", allergenNames: [] }, + { name: "Tamarin", allergenNames: [] }, ], }, { @@ -276,6 +295,12 @@ export const INGREDIENT_GROUPS: Array<{ { name: "Cerf", allergenNames: [] }, { name: "Chevreuil", allergenNames: [] }, { name: "Sanglier", allergenNames: [] }, + // Second Ciqual pass. + { name: "Cheval", allergenNames: [] }, + { name: "Cœur de bœuf", allergenNames: [] }, + { name: "Foie gras", allergenNames: [] }, + { name: "Museau de bœuf", allergenNames: [] }, + { name: "Viande des Grisons", allergenNames: [] }, ], }, { @@ -293,6 +318,10 @@ export const INGREDIENT_GROUPS: Array<{ { name: "Pintade", allergenNames: [] }, { name: "Oie", allergenNames: [] }, { name: "Foie de volaille", allergenNames: [] }, + // Second Ciqual pass. + { name: "Chapon", allergenNames: [] }, + { name: "Pigeon", allergenNames: [] }, + { name: "Faisan", allergenNames: [] }, ], }, { @@ -334,6 +363,10 @@ export const INGREDIENT_GROUPS: Array<{ // Ciqual 2025 additions. { name: "Anguille", allergenNames: ["Poissons"] }, { name: "Carrelet (ou plie)", allergenNames: ["Poissons"] }, + // Second Ciqual pass. + { name: "Morue", allergenNames: ["Poissons"] }, + { name: "Limande", allergenNames: ["Poissons"] }, + { name: "Rascasse", allergenNames: ["Poissons"] }, ], }, { @@ -357,6 +390,12 @@ export const INGREDIENT_GROUPS: Array<{ // Ciqual 2025 additions. { name: "Araignée de mer", allergenNames: ["Crustacés"] }, { name: "Bigorneau", allergenNames: ["Mollusques"] }, + // Second Ciqual pass. + { name: "Écrevisse", allergenNames: ["Crustacés"] }, + { name: "Crevette grise", allergenNames: ["Crustacés"] }, + { name: "Coque", allergenNames: ["Mollusques"] }, + { name: "Escargot", allergenNames: ["Mollusques"] }, + { name: "Seiche", allergenNames: ["Mollusques"] }, ], }, // ========================================================================= @@ -412,6 +451,9 @@ export const INGREDIENT_GROUPS: Array<{ { name: "Fèves", allergenNames: [] }, { name: "Edamame", allergenNames: ["Soja"] }, { name: "Haricots pinto", allergenNames: [] }, + // Second Ciqual pass. + { name: "Haricots flageolets", allergenNames: [] }, + { name: "Lentilles blondes", allergenNames: [] }, ], }, { @@ -498,6 +540,8 @@ export const INGREDIENT_GROUPS: Array<{ { name: "Ciabatta", allergenNames: ["Gluten"] }, { name: "Tortilla de maïs", allergenNames: [] }, { name: "Tortilla de blé", allergenNames: ["Gluten"] }, + // Second Ciqual pass. + { name: "Gressin", allergenNames: ["Gluten"] }, ], }, { @@ -583,6 +627,14 @@ export const INGREDIENT_GROUPS: Array<{ { name: "Crottin de Chavignol", icon: "CHEESE", allergenNames: ["Lait"] }, { name: "Abondance", icon: "CHEESE", allergenNames: ["Lait"] }, { name: "Carré de l'Est", icon: "CHEESE", allergenNames: ["Lait"] }, + // Second Ciqual pass. + { name: "Edam", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Gouda", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Mimolette", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Maroilles", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Mont d'or", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Kéfir", allergenNames: ["Lait"] }, + { name: "Yaourt à la grecque", allergenNames: ["Lait"] }, ], }, { @@ -751,6 +803,14 @@ export const INGREDIENT_GROUPS: Array<{ { name: "Pâte de curry rouge (thaï)", allergenNames: [] }, { name: "Pâte de curry vert (thaï)", allergenNames: [] }, { name: "Tahini", allergenNames: ["Graines de sésame"] }, + // Second Ciqual pass. + { + name: "Aïoli", + allergenNames: ["Œufs"], + dietNames: ["Végétarien", "Pescétarien"], + }, + { name: "Sauce vinaigrette", allergenNames: [] }, + { name: "Houmous", allergenNames: ["Graines de sésame"] }, ], }, { @@ -769,8 +829,11 @@ export const INGREDIENT_GROUPS: Array<{ { name: "Vinaigre balsamique", allergenNames: ["Sulfites"] }, { name: "Câpres", icon: "JAR", allergenNames: [] }, { name: "Olives", icon: "JAR", allergenNames: [] }, + { name: "Olives noires", icon: "JAR", allergenNames: [] }, + { name: "Olives vertes", icon: "JAR", allergenNames: [] }, { name: "Vin blanc (cuisine)", icon: "DRINK", allergenNames: ["Sulfites"] }, { name: "Vin rouge (cuisine)", icon: "DRINK", allergenNames: ["Sulfites"] }, + { name: "Vin rosé (cuisine)", icon: "DRINK", allergenNames: ["Sulfites"] }, { name: "Vinaigre de vin rouge", allergenNames: ["Sulfites"] }, { name: "Vinaigre de vin blanc", allergenNames: ["Sulfites"] }, { name: "Vinaigre de xérès", allergenNames: ["Sulfites"] }, @@ -779,6 +842,11 @@ export const INGREDIENT_GROUPS: Array<{ { name: "Huile d'arachide", allergenNames: ["Arachides"] }, { name: "Huile pimentée", allergenNames: [] }, { name: "Vinaigre de riz", allergenNames: [] }, + // Second Ciqual pass. + { name: "Huile de maïs", allergenNames: [] }, + { name: "Huile de pépins de raisin", allergenNames: [] }, + { name: "Huile de soja", allergenNames: ["Soja"] }, + { name: "Huile de palme", allergenNames: [] }, { name: "Mirin", icon: "DRINK", allergenNames: [] }, { name: "Saké (cuisine)", icon: "DRINK", allergenNames: [] }, { name: "Jus de citron", icon: "DRINK", allergenNames: [] }, diff --git a/apps/web/src/locales/fr/translation.json b/apps/web/src/locales/fr/translation.json index 10380a8..e610d97 100644 --- a/apps/web/src/locales/fr/translation.json +++ b/apps/web/src/locales/fr/translation.json @@ -385,6 +385,19 @@ "daikon": "Daikon", "fresh_green_chili": "Piment vert frais", "cardoon": "Cardon", + "radicchio": "Chicorée rouge", + "romanesco": "Chou romanesco", + "kohlrabi": "Chou-rave", + "napa_cabbage": "Chou chinois", + "celeriac": "Céleri-rave", + "okra": "Gombo", + "spring_onion": "Oignon nouveau", + "red_kuri_squash": "Potimarron", + "rutabaga": "Rutabaga", + "samphire": "Salicorne", + "salsify": "Salsifis", + "lambs_lettuce": "Mâche", + "escarole": "Scarole", "lemon": "Citron", "lime": "Citron vert", "apple": "Pomme", @@ -415,6 +428,10 @@ "quince": "Coing", "blackcurrant": "Cassis", "cranberry": "Canneberge", + "redcurrant": "Groseille", + "persimmon": "Kaki", + "nectarine": "Nectarine", + "tamarind": "Tamarin", "basil": "Basilic", "parsley": "Persil", "thyme": "Thym", @@ -472,6 +489,11 @@ "venison": "Cerf", "roe_deer": "Chevreuil", "wild_boar": "Sanglier", + "horse_meat": "Cheval", + "beef_heart": "Cœur de bœuf", + "foie_gras": "Foie gras", + "beef_muzzle": "Museau de bœuf", + "grisons_dried_beef": "Viande des Grisons", "chicken": "Poulet", "turkey": "Dinde", "duck": "Canard", @@ -480,6 +502,9 @@ "guinea_fowl": "Pintade", "goose": "Oie", "poultry_liver": "Foie de volaille", + "capon": "Chapon", + "pigeon": "Pigeon", + "pheasant": "Faisan", "salmon": "Saumon", "tuna": "Thon", "cod": "Cabillaud", @@ -512,6 +537,9 @@ "dried_fish": "Poisson séché", "eel": "Anguille", "plaice": "Carrelet (ou plie)", + "salt_cod": "Morue", + "lemon_sole": "Limande", + "scorpionfish": "Rascasse", "shrimp": "Crevettes", "langoustine": "Langoustines", "lobster": "Homard", @@ -526,6 +554,11 @@ "whelks": "Bulots", "spider_crab": "Araignée de mer", "periwinkle": "Bigorneau", + "crayfish": "Écrevisse", + "grey_shrimp": "Crevette grise", + "cockle": "Coque", + "snail": "Escargot", + "cuttlefish": "Seiche", "semolina": "Semoule", "couscous": "Couscous", "bulgur": "Boulgour", @@ -562,6 +595,8 @@ "fava_beans": "Fèves", "edamame": "Edamame", "pinto_beans": "Haricots pinto", + "flageolet_beans": "Haricots flageolets", + "golden_lentils": "Lentilles blondes", "peanuts_shelled": "Cacahuètes", "almonds": "Amandes", "walnuts": "Noix", @@ -609,6 +644,7 @@ "ciabatta": "Ciabatta", "corn_tortilla": "Tortilla de maïs", "wheat_tortilla": "Tortilla de blé", + "breadstick": "Gressin", "puff_pastry": "Pâte feuilletée", "shortcrust_pastry": "Pâte brisée", "pizza_dough": "Pâte à pizza", @@ -659,6 +695,13 @@ "crottin_de_chavignol": "Crottin de Chavignol", "abondance_cheese": "Abondance", "carre_de_l_est": "Carré de l'Est", + "edam": "Edam", + "gouda": "Gouda", + "mimolette": "Mimolette", + "maroilles": "Maroilles", + "mont_dor": "Mont d'or", + "kefir": "Kéfir", + "greek_yogurt": "Yaourt à la grecque", "egg": "Œuf", "coconut_milk": "Lait de coco", "coconut_cream": "Crème de coco", @@ -742,6 +785,9 @@ "red_curry_paste": "Pâte de curry rouge (thaï)", "green_curry_paste": "Pâte de curry vert (thaï)", "tahini": "Tahini", + "aioli": "Aïoli", + "vinaigrette": "Sauce vinaigrette", + "hummus": "Houmous", "olive_oil": "Huile d'olive", "sunflower_oil": "Huile de tournesol", "rapeseed_oil": "Huile de colza", @@ -752,8 +798,11 @@ "balsamic_vinegar": "Vinaigre balsamique", "capers": "Câpres", "olives": "Olives", + "black_olives": "Olives noires", + "green_olives": "Olives vertes", "white_wine": "Vin blanc (cuisine)", "red_wine": "Vin rouge (cuisine)", + "rose_wine": "Vin rosé (cuisine)", "red_wine_vinegar": "Vinaigre de vin rouge", "white_wine_vinegar": "Vinaigre de vin blanc", "sherry_vinegar": "Vinaigre de xérès", @@ -762,6 +811,10 @@ "peanut_oil": "Huile d'arachide", "chili_oil": "Huile pimentée", "rice_vinegar": "Vinaigre de riz", + "corn_oil": "Huile de maïs", + "grapeseed_oil": "Huile de pépins de raisin", + "soybean_oil": "Huile de soja", + "palm_oil": "Huile de palme", "mirin": "Mirin", "sake": "Saké (cuisine)", "lemon_juice": "Jus de citron",