From 8e01d8d654dba2816111647392898caf4ea8ce3d Mon Sep 17 00:00:00 2001 From: Marco Ciotola Date: Mon, 20 Jan 2025 10:44:35 +0100 Subject: [PATCH 01/18] taxonomy: translate and add ingredients (#11265) --- taxonomies/food/ingredients.txt | 47 ++++++++++++++++++++++----- taxonomies/ingredients_processing.txt | 19 ++++++----- taxonomies/packaging_recycling.txt | 2 +- 3 files changed, 50 insertions(+), 18 deletions(-) diff --git a/taxonomies/food/ingredients.txt b/taxonomies/food/ingredients.txt index 792a30f92f1b9..723f4d4975022 100644 --- a/taxonomies/food/ingredients.txt +++ b/taxonomies/food/ingredients.txt @@ -152,7 +152,7 @@ stopwords:hu: tartalmaz, változó arányban, min, zsírtartalom, összetevő, stopwords:id: mengandung stopwords:is: úr # example: COCCO in proporzione variabile -stopwords:it: di, del, dal, contiene, nella, in proporzione variabile, prodotto, prodotti, il, la, le, i, gli +stopwords:it: di, del, della, delle, dal, contiene, nella, in proporzione variabile, prodotto, prodotti, il, la, le, i, gli # Japanese stopwords are matched without word boundaries, do not put as stopwords characters or words that could be part of an actual ingredient entry stopwords:ja: 等, その他 stopwords:lt: iš, su, su pridėtiniu, mažiausiai, įskaitant @@ -25465,7 +25465,7 @@ es: cebada orgánica fi: luomuohra hr: organski ječam, eko ječam hu: bio árpa -it: Orzo biologico +it: orzo biologico nl: biologische gerst nn: økologisk bygg pt: cevada orgânica @@ -25480,7 +25480,7 @@ fi: idätetty ohra fr: orge germée hr: proklijali ječam hu: csíráztatott árpa -it: Orzo germogliato +it: orzo germogliato nl: gekiemde gerst nn: spiret bygg pl: jęczmień kiełkowany, kiełki jęczmienia @@ -25496,7 +25496,7 @@ fi: täysjyväohra fr: orge complète hr: integralni ječam hu: teljes kiőrésű árpa -it: Orzo integrale +it: orzo integrale nl: volkorengerst nn: fulkornsbygg pl: jeçzmień z pełnego przemiału @@ -25533,6 +25533,7 @@ de: Vollkorn-Gerstenflocken, Vollkorngerstenflocken, Gerstenvollkornflocken fi: täysjyväohrahiutale, täysjyväohrahiutaleet fr: flocons d'orge complète hr: ječmene pahuljice od cijelog zrna +it: fiocchi d'orzo integrale nl: volkoren gerstvlokken sv: fullkornskornflingor # ingredient/fr:flocons-d'orge-complete has 16 products in 4 languages @2020-06-08 @@ -28562,6 +28563,10 @@ ciqual_food_name:en: Soya flour ciqual_food_name:fr: Farine de soja < en:soya flour +en: restructured soya flour +it: farina di soia ristrutturata + +< en:restructured soya flour en: soya flour restructured and rehydrated it: farina di soia ristrutturata e reidratata @@ -33549,6 +33554,10 @@ de: Sojaeiweißerzeugnis fr: produit à base de protéines de soja allergens:en: en:soybeans +< en:soy protein product +en: proteic extruded soy, proteic extrusion of soy +it: estruso proteico di soia + < en:vegetable fiber en: soy fiber de: Sojafaser @@ -33569,6 +33578,7 @@ de: Rehydrierte Sojafaser, rehydrierte Sojafasern es: fibra de soja rehidratada fr: Fibre de soja réhydratée hr: rehidrirana sojina vlakna +it: fibre di soia reidratate < en:soy protein en: dehydrated soy protein @@ -33579,6 +33589,7 @@ fi: dehydratoitu soijaproteiini fr: protéines de soja déshydratées hr: dehidrirani protein soje hu: dehidratált szójafehérje +it: proteine di soia disidratate < en:soy protein en: textured soy protein, texturised soya protein @@ -33598,6 +33609,7 @@ fi: uudelleen hydratoitu soijaproteiini fr: protéines de soja réhydratées, protéines végétales de soja réhydratées, textures de soja réhydratées hr: rehidrirani protein soje hu: rehidratált szójafehérje +it: proteine di soia reidratate nl: gerehydrateerd soja-eiwit, gerehydrateerde soja-eiwit sv: rehydrerat sojaprotein @@ -33609,7 +33621,7 @@ es: Aislado de proteína de soja fi: soijaproteiini-isolaatti fr: isolat de protéine de soja hr: izolat proteina soje, izolat sojinih bjelančevina -it: Proteine isolate della soia, proteine isolate di soia +it: proteine isolate di soia, proteine di soia isolate pl: izolowane białko sojowe, izolat białka sojowego ru: изолированный белок сои @@ -38289,6 +38301,7 @@ ca: Fruits de bosc es: frutas del bosque fr: fruits des bois hr: šumsko voće +it: frutti di bosco, bacche di bosco nl: bosvruchten pl: owoce leśne, owoców leśnych @@ -41997,10 +42010,21 @@ pt: sumo de kumquat ################################################################################################### # -# Chinotto +# Less common citrus fruits # ################################################################################################### +< en:citrus fruit +en: citron +it: cedro +la: citrus medica +wikipedia:en: https://en.wikipedia.org/wiki/Citron + +< en:citron +< en:citrus fruit extract +en: citron extract +it: estratto di cedro + < en:citrus fruit en: chinotto, citrus myrtifolia it: chinotto, citrus myrtifolia @@ -89214,6 +89238,7 @@ en: rusk de: Zwieback fr: biscotte hr: dvopek +it: fetta biscottata nl: beschuit wikidata:en: Q5477096 wikipedia:en: https://en.wikipedia.org/wiki/Rusk @@ -89488,7 +89513,7 @@ fi: Napolilainen vohveli fr: gaufrette hr: napolitanska napolitanka hu: Nápolyi ostya -it: cialda +it: wafer, wafer ripieni, wafer ripieno nl: Neapolitan wafer tr: Gofret # 143 products in 5 @2021-09-06 @@ -89513,7 +89538,7 @@ es: oblea, obleas, barquillo, barquillo sin azúcares añadidos fi: Vohvelit fr: pain azyme hr: napolitanka -it: wafer +it: cialda, ostia, cialde, ostie nl: ongedesemd brood, ouwel pl: wafel, wafli # ingredient/fr:pain-azyme has 293 products in 6 languages @2019-03-07 @@ -89522,6 +89547,9 @@ pl: wafel, wafli < en:wafer de: Backoblate, Backoblaten +< en:wafer +en: starch wafer +it: ostia d'amido fr: biscuit d'enrobage @@ -89529,6 +89557,7 @@ fr: biscuit d'enrobage bg: Гризини de: Grissini fr: gressins +it: grissini nl: Broodstengels pt: gressinos sv: Grissini @@ -89977,7 +90006,7 @@ hr: krušne mrvice hu: zsemlemorzsa, kenyérmorzsa id: Tepung roti io: Raspo-pano -it: pangrattato, pane grattugiato +it: pangrattato, pane grattugiato, panatura ja: パン粉 ko: 빵가루 lt: Malti džiūvėsiai diff --git a/taxonomies/ingredients_processing.txt b/taxonomies/ingredients_processing.txt index d418a98435e4e..730a8cdb07da8 100644 --- a/taxonomies/ingredients_processing.txt +++ b/taxonomies/ingredients_processing.txt @@ -520,7 +520,7 @@ fi: kokonainen, kokonaiset fr: entier, entière, entiers, entières hr: cijele, cijeli hu: egész, egészben -it: intero, intera, interi, intere +it: intero, intera, interi, intere, integrale, integrali ja: 全 pl: całe, w całości, cała, cały pt: inteiro, inteira, inteiros, inteiras, integral @@ -851,7 +851,7 @@ fi: kuori, kuoret, kuorta fr: écorce de, écorces de, écorces d' hr: kora, korica, kora od hu: héj, héja -it: scorza di, scorze di, scorza d', scorze d' +it: scorza nl: schil, schillen #nl:false:schildje, met schil pl: skórka z @@ -1388,6 +1388,7 @@ de: rekonstituiert, rekonstituierte, rekonstituierter, rekonstituiertes, rekonst es: reconstituido, reconstituida, reconstituidos, reconstituidas fr: reconstitué, reconstituée, reconstitués, reconstituées hr: rekonstituirano +it: ricostituito, ricostituita, ricostituiti, ricostituite, riconstituito, riconstituita, riconstituiti, riconstituite lt: regeneruotas pl: odtworzony, odtworzone, odtworzona, odtworzonego, odtworzonej, odtworzonych pt: reconstituído, reconstituída, reconstituídos, reconstituídas @@ -1401,7 +1402,7 @@ es: parcialmente reconstituido, parcialmente reconstituida, parcialmente reconst fr: partiellement reconstitué, partiellement reconstituée, partiellement reconstitués, partiellement reconstituées hr: delomično rekonstituirano, delomično rekonstituirana, delomično rekonstituirani hu: részben rekonstituált -it: parzialmente riconstituito, parzialmente riconstituita, parzialmente riconstituiti, parzialmente riconstituite +it: parzialmente ricostituito, parzialmente ricostituita, parzialmente ricostituiti, parzialmente ricostituite nb: delvis rekonstituert, delvis rekonstituerte nl: gedeeltelijk gereconstitueerd pl: częściowo odtworzony, częściowo odtworzone, częściowo odtworzona, częściowo odtworzonego, częściowo odtworzonej, częściowo odtworzonych @@ -1421,9 +1422,9 @@ fr: extrait de, extrait d' #fr:falsePositive:sels mineraux extraits des eaux du bassin de vichy, Sucres extraits de fruits, Extraits naturels et aromates, Extraits végétaux à pouvoir colorant, extrait sec hr: ekstrahirane, ekstrahirani, ekstrakt, ekstrakti, ekstrakata hu: kivonat, kivonatból -it: estratto di, estratti di, estratto d', estratti d' -ja: エキス, 抽出物 +it: estratto, estratti #it:falsePositive:antiossidante estratto ricco di tocoferolo +ja: エキス, 抽出物 nb: ekstrakt, ekstrakter nl: extract pl: ekstrakt, ekstrakt z, ekstrakty z, ekstrakty, wyciąg, wyciąg z, wyciągi z, wyciągi @@ -1484,6 +1485,7 @@ sv: presset en: fresh pressed de: direkt gepresst, direkt gepresste, direkt gepresster, direkt gepresstes hu: frissen sajtolt, frissen préselt +it: fresco spremuto, fresca spremuta, freschi spremuti, fresche spremute pl: bezpośrednio wyciskany, bezpośrednio wyciskane, bezpośrednio wyciskana, bezpośrednio wyciskanego sv: nypressad @@ -1494,7 +1496,7 @@ de: mechanisch gepresst, mechanisch gepresste, mechanisch gepresster, mechanisch es: prensado mecánicamente, prensada mecánicamente fr: pressé mécaniquement, pressée mécaniquement, pressés mécaniquement, pressées mécaniquement hu: mechanikusan préselt, mechanikusan préselt, mechanikusan préselt -it: pressione meccanicamente, pressione meccanicamente, pressioni meccanicamente, pressioni meccanicamente +it: spremuto meccanicamente, spremuta meccanicamente, spremuti meccanicamente, spremute meccanicamente nl: mechanisch geperst, mechanisch geperste, mechanisch geperster, mechanisch geperstes pl: mechanicznie tłoczony, mechanicznie tłoczona, mechanicznie tłoczone pt: espremido mecanicamente, espremida mecanicamente, espremidos mecanicamente, espremidas mecanicamente @@ -1508,7 +1510,7 @@ es: prensado naturalmente, prensada naturalmente, prensados naturalmente, prensa fr: pressé naturellement, pressée naturellement, pressés naturellement, pressées naturellement hr: prirodno prešano, prirodno prešan, prirodno prešani hu: természetesen préselt, természetesen préselt, természetesen préselt -it: spremuto naturalmente, spremuta naturalmente, spremuti naturalmente, spremute naturalmente, spremuta naturalmente di, spremuta naturalmente d' +it: spremuto naturalmente, spremuta naturalmente, spremuti naturalmente, spremute naturalmente, spremuta naturale nl: natuurlijk geperst, natuurlijk geperste, natuurlijk geperster, natuurlijk geperstes pl: tłoczony naturalnie, tłoczona naturalnie, tłoczone naturalnie, tłoczone naturalnie pt: espremido naturalmente, espremida naturalmente, espremidos naturalmente, espremidas naturalmente @@ -1534,7 +1536,7 @@ es: prensado en frio, prensada en frio, prensados en frio, prensadas en frio fr: pression à froid, pressée à froid, obtenue par pression à froid, pressé à froid hr: hladno prešano hu: hidegen sajtolt -it: spremuto a freddo, spremuta a freddo, spremuti a freddo, spremute a freddo, spremuta a freddo di, spremuta a freddo d' +it: spremuto a freddo, spremuta a freddo, spremuti a freddo, spremute a freddo nl: koud geperst pl: tłoczony na zimno, tłoczona na zimno, tłoczone na zimno pt: espremido a frio, espremida a frio, espremidos a frio, espremidas a frio @@ -1983,6 +1985,7 @@ en: mixture, mixtures ca: barreja, barreja de es: mezcla, mezcla de hr: mješavina, miješano, melanž od, mješavina za +it: miscela, misto, mix pl: mieszanka, mieszanki #en:comment:salt has been added to the ingredient diff --git a/taxonomies/packaging_recycling.txt b/taxonomies/packaging_recycling.txt index c0c5d1218cc39..1bc63a79e2bd7 100644 --- a/taxonomies/packaging_recycling.txt +++ b/taxonomies/packaging_recycling.txt @@ -118,7 +118,7 @@ en: discard, to discard, throw away, to throw away, non-recyclable, to be thrown de: wegwerfen, nicht recycelbar, zum Wegwerfen fr: jeter, à jeter, non-recyclable hu: eldobható, eldobandó, eldobni, kidobható, kidobni, kidobandó, nem újrahasznosítható, szemét -it: non riciclabile +it: non riciclabile, indifferenziata nl: restafval, bij restafval, niet PMD pt: descartar, a descartar, para descartar, não-reciclável, não recicláel From f685cb019e67b0dabc049cb2a405ef0461cda0e3 Mon Sep 17 00:00:00 2001 From: Edouard Marquez Date: Mon, 20 Jan 2025 10:45:03 +0100 Subject: [PATCH 02/18] feat: Update the tagline to force the app upgrade (#11262) Hi everyone! We don't use these 2 JSON files for the tagline in the mobile app (hosted on GitHub instead). That's why we force the old users to update the app. --- .../files/tagline-off-android-v3.json | 677 ++++++++---------- html/resources/files/tagline-off-ios-v3.json | 676 ++++++++--------- 2 files changed, 625 insertions(+), 728 deletions(-) diff --git a/html/resources/files/tagline-off-android-v3.json b/html/resources/files/tagline-off-android-v3.json index 822b6b67da076..3092a5a5e2b50 100644 --- a/html/resources/files/tagline-off-android-v3.json +++ b/html/resources/files/tagline-off-android-v3.json @@ -1,476 +1,426 @@ { "news": { - "donation_campaign": { - "start_date": "2024-10-25 00:00:00", - "end_date": "2025-01-31 23:59:59", - "url": "https://world.openfoodfacts.org/donate-to-open-food-facts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024", + "app_update": { + "start_date": "2025-01-01 00:00:00", + "end_date": "2099-12-25 23:59:59", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "translations": { "default": { - "title": "Our application needs you!", - "message": "Help us inform **millions of consumers** on what they eat!", - "button_label": "Support", - "url": "https://world.openfoodfacts.org/donate-to-open-food-facts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024", + "title": "New update available!", + "message": "A new version of the application is available on the Google Play and F-Droid.", + "button_label": "Update", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", "width": 0.2, - "alt": "Support the Open Food Facts project" + "alt": "Update the Open Food Facts app" } }, - "fr_FR": { - "title": "Notre application a besoin de vous !", - "message": "Aidez-nous à informer **des millions de consommateurs** sur ce qu'ils mangent !", - "button_label": "Je soutiens", - "url": "https://fr.openfoodfacts.org/faire-un-don-a-open-food-facts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024", + "fr": { + "title": "Nouvelle mise à jour!", + "message": "Une nouvelle version de l'application est disponible sur le Google Play et F-Droid.", + "button_label": "Mettre à jour", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_fr.svg", "width": 0.2, - "alt": "Soutenir le projet Open Food Facts" + "alt": "Mettre à jour l'application Open Food Facts" } }, - "fr": { - "title": "Notre application a besoin de vous !", - "message": "Aidez-nous à informer **des millions de consommateurs** sur ce qu'ils mangent !", - "button_label": "Je soutiens", - "url": "https://world-fr.openfoodfacts.org/donate-to-open-food-facts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024", + "ar": { + "title": "تحديث جديد متاح!", + "message": "يتوفر إصدار جديد من التطبيق على Google Play و F-Droid.", + "button_label": "تحديث", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_fr.svg", + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_ar.svg", "width": 0.2, - "alt": "Soutenir le projet Open Food Facts" + "alt": "تحديث تطبيق Open Food Facts" } }, - "ar": { - "title": "تطبيقنا يحتاجك!", - "message": "ساعدنا في إبلاغ **ملايين المستهلكين** بما يأكلونه!", - "button_label": "أدعم", - "url": "https://world-ar.openfoodfacts.org/donate-to-open-food-facts-ar?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, "bg": { - "title": "Нашето приложение се нуждае от вас!", - "message": "Помогнете ни да информираме **милиони потребители** какво ядат!", - "button_label": "Поддръжка", - "url": "https://world-bg.openfoodfacts.org/даряване-на-openfoodfacts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" + "title": "Налична е нова актуализация!", + "message": "Нова версия на приложението е налична в Google Play и F-Droid.", + "button_label": "Актуализиране", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", + "image": { + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_bg.svg", + "width": 0.2, + "alt": "Актуализирайте приложението Open Food Facts" + } }, "bn": { - "title": "আমাদের অ্যাপ্লিকেশন আপনার প্রয়োজন!", - "message": "আমাদের **লক্ষ লক্ষ ভোক্তাদের** তাদের খাবার সম্পর্কে জানাতে সাহায্য করুন!", - "button_label": "সমর্থন" + "title": "একটি নতুন আপডেট উপলব্ধ!", + "message": "অ্যাপ্লিকেশনের একটি নতুন সংস্করণ Google Play এবং F-Droid-এ উপলব্ধ।", + "button_label": "আপডেট", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", + "image": { + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_bn.svg", + "width": 0.2, + "alt": "Open Food Facts অ্যাপ আপডেট করুন" + } }, "ca": { - "title": "La nostra aplicació et necessita!", - "message": "Ajuda'ns a informar **milions de consumidors** sobre el que mengen!", - "button_label": "Suport", - "url": "https://world-ca.openfoodfacts.org/dona-a-openfoodfacts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" + "title": "Hi ha una nova actualització disponible!", + "message": "Hi ha una nova versió de l'aplicació disponible a Google Play i F-Droid.", + "button_label": "Actualitzar", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", + "image": { + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_ca.svg", + "width": 0.2, + "alt": "Actualitza l'aplicació Open Food Facts" + } }, "cs": { - "title": "Naše aplikace vás potřebuje!", - "message": "Pomozte nám informovat **miliony spotřebitelů** o tom, co jedí!", - "button_label": "Podpora", - "url": "https://world-cs.openfoodfacts.org/darujte-openfoodfacts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" + "title": "Je k dispozici nová aktualizace!", + "message": "Nová verze aplikace je k dispozici na Google Play a F-Droid.", + "button_label": "Aktualizovat", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", + "image": { + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_cs.svg", + "width": 0.2, + "alt": "Aktualizujte aplikaci Open Food Facts" + } }, "da": { - "title": "Vores ansøgning har brug for dig!", - "message": "Hjælp os med at informere **millioner af forbrugere** om, hvad de spiser!", - "button_label": "Support", - "url": "https://world-da.openfoodfacts.org/doner-til-open-food-facts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" + "title": "En ny opdatering er tilgængelig!", + "message": "En ny version af applikationen er tilgængelig på Google Play og F-Droid.", + "button_label": "Opdater", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", + "image": { + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_da.svg", + "width": 0.2, + "alt": "Opdater Open Food Facts-appen" + } }, "de": { - "title": "Unsere Anwendung braucht Sie!", - "message": "Helfen Sie uns, **Millionen von Verbrauchern** darüber zu informieren, was sie essen!", - "button_label": "Unterstützen", - "url": "https://world-de.openfoodfacts.org/spenden?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" + "title": "Ein neues Update ist verfügbar!", + "message": "Eine neue Version der Anwendung ist auf Google Play und F-Droid verfügbar.", + "button_label": "Aktualisieren", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", + "image": { + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_de.svg", + "width": 0.2, + "alt": "Aktualisieren Sie die Open Food Facts App" + } }, "ee": { - "title": "Meie rakendus vajab teid!", - "message": "Aidake meil teavitada **miljoneid tarbijaid** sellest, mida nad söövad!", - "button_label": "Tugi", - "url": "https://world-ee.openfoodfacts.org/anneta-to-openfoodfacts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" + "title": "Uus värskendus on saadaval!", + "message": "Rakenduse uus versioon on saadaval Google Plays ja F-Droidis.", + "button_label": "Värskenda", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", + "image": { + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_ee.svg", + "width": 0.2, + "alt": "Värskendage Open Food Facts rakendust" + } }, "el": { - "title": "Η εφαρμογή μας σας χρειάζεται!", - "message": "Βοηθήστε μας να ενημερώσουμε **εκατομμύρια καταναλωτές** για το τι τρώνε!", - "button_label": "Υποστηρίζω", - "url": "https://world-el.openfoodfacts.org/dorea-se-openfoodfacts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" + "title": "Μια νέα ενημέρωση είναι διαθέσιμη!", + "message": "Μια νέα έκδοση της εφαρμογής είναι διαθέσιμη στο Google Play και στο F-Droid.", + "button_label": "Ενημέρωση", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", + "image": { + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_el.svg", + "width": 0.2, + "alt": "Ενημερώστε την εφαρμογή Open Food Facts" + } }, "es": { - "title": "¡Nuestra aplicación te necesita!", - "message": "¡Ayúdanos a informar a **millones de consumidores** sobre lo que comen!", - "button_label": "Apoyar", - "url": "https://world-es.openfoodfacts.org/haz-su-donacion-a-open-food-facts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" + "title": "¡Una nueva actualización está disponible!", + "message": "Una nueva versión de la aplicación está disponible en Google Play y F-Droid.", + "button_label": "Actualizar", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", + "image": { + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_es.svg", + "width": 0.2, + "alt": "Actualizar la aplicación Open Food Facts" + } }, "fa": { - "title": "برنامه ما به شما نیاز دارد!", - "message": "به ما کمک کنید تا **میلیون‌ها مصرف‌کننده** را در مورد آنچه می‌خورند مطلع کنیم!", - "button_label": "حمایت" + "title": "به‌روزرسانی جدیدی در دسترس است!", + "message": "نسخه جدیدی از برنامه در Google Play و F-Droid موجود است.", + "button_label": "به‌روزرسانی", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", + "image": { + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_fa.svg", + "width": 0.2, + "alt": "برنامه Open Food Facts را به‌روزرسانی کنید" + } }, "fi": { - "title": "Sovelluksemme tarvitsee sinua!", - "message": "Auta meitä kertomaan **miljoonille kuluttajille** siitä, mitä he syövät!", - "button_label": "Tuki", - "url": "https://world-fi.openfoodfacts.org/lahjoita-open-food-factsille?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" + "title": "Uusi päivitys on saatavilla!", + "message": "Sovelluksen uusi versio on saatavilla Google Playssa ja F-Droidissa.", + "button_label": "Päivitä", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", + "image": { + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_fi.svg", + "width": 0.2, + "alt": "Päivitä Open Food Facts -sovellus" + } }, "he": { - "title": "האפליקציה שלנו צריכה אותך!", - "message": "עזור לנו ליידע **מיליוני צרכנים** מה הם אוכלים!", - "button_label": "תמיכה", - "url": "https://world-he.openfoodfacts.org/donate-to-open-food-facts-he?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "hi": { - "title": "हमारे ऐप को आपकी जरूरत है!", - "message": "हमें **लाखों उपभोक्ताओं** को उनके खाने के बारे में सूचित करने में मदद करें!", - "button_label": "समर्थन" - }, - "ht": { - "title": "Aplikasyon nou an bezwen ou!", - "message": "Ede nou enfòme **dè milyon de konsomatè** sou sa yo manje!", - "button_label": "Sipò", - "url": "https://world-ht.openfoodfacts.org/donate-to-open-food-facts-ht?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "hu": { - "title": "Alkalmazásunknak szüksége van Önre!", - "message": "Segítsen bennünket, hogy **fogyasztók millióit** tájékoztassuk arról, hogy mit esznek!", - "button_label": "Támogatás", - "url": "https://world-hu.openfoodfacts.org/donate-to-open-food-facts-hu?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "id": { - "title": "Aplikasi kami membutuhkan Anda!", - "message": "Bantu kami memberi tahu **jutaan konsumen** tentang apa yang mereka makan!", - "button_label": "Dukung", - "url": "https://world-id.openfoodfacts.org/donate-to-open-food-facts-id?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "it": { - "title": "La nostra applicazione ha bisogno di te!", - "message": "Aiutaci a informare **milioni di consumatori** su ciò che mangiano!", - "button_label": "Sostieni", - "url": "https://world-it.openfoodfacts.org/dona-a-open-food-facts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "ja": { - "title": "私たちのアプリケーションはあなたを必要としています!", - "message": "何を食べているかについて**何百万人もの消費者**に知らせるのを手伝ってください!", - "button_label": "サポート", - "url": "https://world-ja.openfoodfacts.org/donate-to-open-food-facts-ja?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "ko": { - "title": "우리 애플리케이션이 당신을 필요로 합니다!", - "message": "**수백만 소비자**에게 그들이 먹는 것에 대해 알리는 데 도움을 주세요!", - "button_label": "지원" - }, - "lu": { - "title": "Onze applicatie heeft u nodig!", - "message": "Help ons om **miljoenen consumenten** te informeren over wat ze eten!", - "button_label": "Ondersteunen", - "url": "https://world-lu.openfoodfacts.org/donate-to-open-food-facts-lu?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "lt": { - "title": "Mūsų programai reikia jūsų!", - "message": "Padėkite mums informuoti **milijonus vartotojų** apie tai, ką jie valgo!", - "button_label": "Palaikymas", - "url": "https://world-lt.openfoodfacts.org/donate-to-open-food-facts-lt?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "ms": { - "title": "Aplikasi kami memerlukan anda!", - "message": "Bantu kami memaklumkan **jutaan pengguna** tentang apa yang mereka makan!", - "button_label": "Sokong", - "url": "https://world-ms.openfoodfacts.org/donate-to-open-food-facts-ms?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "nb": { - "title": "Vår applikasjon trenger deg!", - "message": "Hjelp oss å informere **millioner av forbrukere** om hva de spiser!", - "button_label": "Støtte", - "url": "https://world-nb.openfoodfacts.org/donate-to-open-food-facts-nb?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "nl": { - "title": "Onze applicatie heeft u nodig!", - "message": "Help ons om **miljoenen consumenten** te informeren over wat ze eten!", - "button_label": "Ondersteunen", - "url": "https://world-nl.openfoodfacts.org/doneren-aan-openfoodfacts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "pt": { - "title": "Nosso aplicativo precisa de você!", - "message": "Ajude-nos a informar **milhões de consumidores** sobre o que eles comem!", - "button_label": "Apoiar", - "url": "https://world-pt.openfoodfacts.org/fazer-um-donativo-ao-open-food-facts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "pl": { - "title": "Nasza aplikacja potrzebuje Ciebie!", - "message": "Pomóż nam informować **miliony konsumentów** o tym, co jedzą!", - "button_label": "Wspieram", - "url": "https://world-pl.openfoodfacts.org/pozhertvovat-open-food-facts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "ro": { - "title": "Aplicația noastră are nevoie de tine!", - "message": "Ajută-ne să informăm **milioane de consumatori** despre ce mănâncă!", - "button_label": "Suport", - "url": "https://world-ro.openfoodfacts.org/donate-to-open-food-facts-ro?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "ru": { - "title": "Наше приложение нуждается в вас!", - "message": "Помогите нам информировать **миллионы потребителей** о том, что они едят!", - "button_label": "Поддержать", - "url": "https://world-ru.openfoodfacts.org/donate-to-open-food-facts-ru?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "sk": { - "title": "Naša aplikácia vás potrebuje!", - "message": "Pomôžte nám informovať **milióny spotrebiteľov** o tom, čo jedia!", - "button_label": "Podpora", - "url": "https://world-bg.openfoodfacts.org/donate-to-open-food-facts-sk?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "sl": { - "title": "Naša aplikacija vas potrebuje!", - "message": "Pomagajte nam obveščati **milijone potrošnikov** o tem, kaj jedo!", - "button_label": "Podpora", - "url": "https://world-sl.openfoodfacts.org/doniraj-k-open-food-facts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "sv": { - "title": "Vår applikation behöver dig!", - "message": "Hjälp oss att informera **miljontals konsumenter** om vad de äter!", - "button_label": "Stöd", - "url": "https://world-sv.openfoodfacts.org/donate-to-open-food-facts-sv?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "th": { - "title": "แอปพลิเคชันของเราต้องการคุณ!", - "message": "ช่วยเราบอก **ผู้บริโภคหลายล้านคน** ว่าพวกเขากินอะไร!", - "button_label": "สนับสนุน", - "url": "https://world-th.openfoodfacts.org/donate-to-open-food-facts-th?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "tr": { - "title": "Uygulamamızın size ihtiyacı var!", - "message": "**Milyonlarca tüketiciyi** ne yedikleri konusunda bilgilendirmemize yardımcı olun!", - "button_label": "Destek", - "url": "https://world-tr.openfoodfacts.org/open-food-factse-bagista-bulununs?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "vi": { - "title": "Ứng dụng của chúng tôi cần bạn!", - "message": "Giúp chúng tôi thông báo cho **hàng triệu người tiêu dùng** về những gì họ ăn!", - "button_label": "Hỗ trợ" - }, - "zh": { - "title": "我们的应用程序需要你!", - "message": "帮助我们告知**数百万消费者**他们吃的是什么!", - "button_label": "支持", - "url": "https://world.openfoodfacts.org/donate-to-open-food-facts-cn?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - } - } - }, - "translate_openfoodfacts": { - "start_date": "2025-02-01 00:00:00", - "end_date": "2025-12-31 23:59:59", - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/en", - "translations": { - "default": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/en", - "title": "Bring food transparency to your language", - "message": "Translate the app, website and more to help others make informed food choices", - "button_label": "Join the translators team", + "title": "עדכון חדש זמין!", + "message": "גרסה חדשה של האפליקציה זמינה ב-Google Play וב-F-Droid.", + "button_label": "עדכון", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png", - "width": 0.2 + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_he.svg", + "width": 0.2, + "alt": "עדכן את אפליקציית Open Food Facts" } }, - "ar": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/ar", - "title": "اجعل شفافية الغذاء تصل إلى لغتك", - "message": "ترجم التطبيق والموقع الإلكتروني والمزيد لمساعدة الآخرين على اتخاذ خيارات غذائية مستنيرة", - "button_label": "انضم إلى فريق المترجمين", + "hi": { + "title": "एक नया अपडेट उपलब्ध है!", + "message": "एप्लिकेशन का एक नया संस्करण Google Play और F-Droid पर उपलब्ध है।", + "button_label": "अपडेट करें", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_hi.svg", + "width": 0.2, + "alt": "Open Food Facts ऐप को अपडेट करें" } }, - "bn": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/bn", - "title": "আপনার ভাষায় খাদ্য স্বচ্ছতা আনুন", - "message": "অন্যদের তথ্যবহুল খাদ্য পছন্দ করতে সাহায্য করার জন্য অ্যাপ, ওয়েবসাইট এবং আরও অনেক কিছু অনুবাদ করুন", - "button_label": "অনুবাদক দলে যোগ দিন", + "ht": { + "title": "Yon nouvo mizajou disponib!", + "message": "Yon nouvo vèsyon aplikasyon an disponib sou Google Play ak F-Droid.", + "button_label": "Mizajou", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_ht.svg", + "width": 0.2, + "alt": "Mizajou aplikasyon Open Food Facts la" } }, - "de": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/de", - "title": "Bringen Sie Lebensmitteltransparenz in Ihre Sprache", - "message": "Übersetzen Sie die App, die Website und mehr, um anderen zu helfen, informierte Entscheidungen über Lebensmittel zu treffen", - "button_label": "Dem Übersetzerteam beitreten", + "hu": { + "title": "Új frissítés érhető el!", + "message": "Az alkalmazás új verziója elérhető a Google Playen és az F-Droidon.", + "button_label": "Frissítés", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_hu.svg", + "width": 0.2, + "alt": "Frissítse az Open Food Facts alkalmazást" } }, - "el": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/el", - "title": "Φέρτε τη διαφάνεια τροφίμων στη γλώσσα σας", - "message": "Μεταφράστε την εφαρμογή, τον ιστότοπο και άλλα για να βοηθήσετε άλλους να κάνουν ενημερωμένες επιλογές τροφίμων", - "button_label": "Γίνετε μέλος της ομάδας μεταφραστών", + "id": { + "title": "Pembaruan baru tersedia!", + "message": "Versi baru aplikasi tersedia di Google Play dan F-Droid.", + "button_label": "Perbarui", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_id.svg", + "width": 0.2, + "alt": "Perbarui aplikasi Open Food Facts" } }, - "es": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/es", - "title": "Haz que la transparencia alimentaria llegue a tu idioma", - "message": "Traduce la aplicación, el sitio web y más para ayudar a otros a tomar decisiones alimentarias informadas", - "button_label": "Únete al equipo de traductores", + "it": { + "title": "È disponibile un nuovo aggiornamento!", + "message": "È disponibile una nuova versione dell'applicazione su Google Play e F-Droid.", + "button_label": "Aggiorna", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_it.svg", + "width": 0.2, + "alt": "Aggiorna l'app Open Food Facts" } }, - "fr": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/fr", - "title": "Rendez la transparence alimentaire accessible dans votre langue", - "message": "Traduisez l'application, le site web et plus encore pour aider les autres à faire des choix alimentaires éclairés", - "button_label": "Rejoindre l'équipe de traducteurs", + "ja": { + "title": "新しいアップデートが利用可能です!", + "message": "アプリケーションの新しいバージョンがGoogle PlayとF-Droidで利用可能です。", + "button_label": "更新", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_ja.svg", + "width": 0.2, + "alt": "Open Food Factsアプリを更新する" } }, - "hi": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/hi", - "title": "अपनी भाषा में खाद्य पारदर्शिता लाएँ", - "message": "दूसरों को सूचित खाद्य विकल्प बनाने में मदद करने के लिए ऐप, वेबसाइट और बहुत कुछ का अनुवाद करें", - "button_label": "अनुवादक टीम में शामिल हों", + "ko": { + "title": "새로운 업데이트가 있습니다!", + "message": "애플리케이션의 새로운 버전이 Google Play와 F-Droid에서 사용할 수 있습니다.", + "button_label": "업데이트", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_ko.svg", + "width": 0.2, + "alt": "Open Food Facts 앱을 업데이트하세요" } }, - "pt": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/pt", - "title": "Traga transparência alimentar para o seu idioma", - "message": "Traduza o aplicativo, o site e muito mais para ajudar outras pessoas a fazer escolhas alimentares informadas", - "button_label": "Junte-se à equipe de tradutores", + "lu": { + "title": "Een nieuwe update is beschikbaar!", + "message": "Een nieuwe versie van de applicatie is beschikbaar op Google Play en F-Droid.", + "button_label": "Bijwerken", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_lu.svg", + "width": 0.2, + "alt": "Update de Open Food Facts app" } }, - "it": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/it", - "title": "Porta la trasparenza alimentare nella tua lingua", - "message": "Traduci l'app, il sito web e altro ancora per aiutare gli altri a fare scelte alimentari informate", - "button_label": "Unisciti al team di traduttori", + "lt": { + "title": "Yra naujas atnaujinimas!", + "message": "Nauja programos versija pasiekiama „Google Play“ ir „F-Droid“.", + "button_label": "Atnaujinti", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_lt.svg", + "width": 0.2, + "alt": "Atnaujinkite „Open Food Facts“ programą" } }, - "ja": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/ja", - "title": "食品の透明性をあなたの言語で", - "message": "アプリ、ウェブサイトなどを翻訳して、他の人が情報に基づいた食品の選択をするのを手伝ってください", - "button_label": "翻訳チームに参加する", + "ms": { + "title": "Kemas kini baharu tersedia!", + "message": "Versi baharu aplikasi tersedia di Google Play dan F-Droid.", + "button_label": "Kemas kini", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_ms.svg", + "width": 0.2, + "alt": "Kemas kini aplikasi Open Food Facts" } }, - "ko": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/ko", - "title": "식품 투명성을 귀하의 언어로 가져오세요", - "message": "앱, 웹사이트 등을 번역하여 다른 사람들이 정보에 입각한 식품 선택을 할 수 있도록 돕습니다.", - "button_label": "번역 팀에 합류하기", + "nb": { + "title": "En ny oppdatering er tilgjengelig!", + "message": "En ny versjon av applikasjonen er tilgjengelig på Google Play og F-Droid.", + "button_label": "Oppdater", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_nb.svg", + "width": 0.2, + "alt": "Oppdater Open Food Facts-appen" } }, "nl": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/nl", - "title": "Breng voedseltransparantie naar uw taal", - "message": "Vertaal de app, website en meer om anderen te helpen weloverwogen voedselkeuzes te maken", - "button_label": "Word lid van het vertalersteam", + "title": "Een nieuwe update is beschikbaar!", + "message": "Een nieuwe versie van de applicatie is beschikbaar op Google Play en F-Droid.", + "button_label": "Bijwerken", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_nl.svg", + "width": 0.2, + "alt": "Update de Open Food Facts app" } }, - "pl": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/pl", - "title": "Przynieś przejrzystość żywności do swojego języka", - "message": "Przetłumacz aplikację, stronę internetową i wiele więcej, aby pomóc innym w podejmowaniu świadomych wyborów żywieniowych", - "button_label": "Dołącz do zespołu tłumaczy", + "pt": { + "title": "Uma nova atualização está disponível!", + "message": "Uma nova versão do aplicativo está disponível no Google Play e F-Droid.", + "button_label": "Atualizar", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_pt.svg", + "width": 0.2, + "alt": "Atualize o aplicativo Open Food Facts" } }, - "ru": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/ru", - "title": "Обеспечьте прозрачность пищевых продуктов на вашем языке", - "message": "Переведите приложение, веб-сайт и многое другое, чтобы помочь другим сделать осознанный выбор продуктов питания", - "button_label": "Присоединиться к команде переводчиков", + "pl": { + "title": "Dostępna jest nowa aktualizacja!", + "message": "Nowa wersja aplikacji jest dostępna w Google Play i F-Droid.", + "button_label": "Aktualizuj", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_pl.svg", + "width": 0.2, + "alt": "Zaktualizuj aplikację Open Food Facts" } }, - "sv": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/sv", - "title": "Ge din språklig insyn i livsmedel", - "message": "Översätt appen, webbplatsen och mer för att hjälpa andra att göra välgrundade val av livsmedel", - "button_label": "Gå med i översättarteamet", + "ro": { + "title": "O nouă actualizare este disponibilă!", + "message": "O nouă versiune a aplicației este disponibilă pe Google Play și F-Droid.", + "button_label": "Actualizați", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_ro.svg", + "width": 0.2, + "alt": "Actualizați aplicația Open Food Facts" } }, - "tr": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/tr", - "title": "Gıda şeffaflığını dilinize getirin", - "message": "Uygulamayı, web sitesini ve daha fazlasını çevirerek başkalarının bilinçli gıda seçimleri yapmasına yardımcı olun", - "button_label": "Çevirmenler ekibine katılın", + "ru": { + "title": "Доступно новое обновление!", + "message": "Новая версия приложения доступна в Google Play и F-Droid.", + "button_label": "Обновить", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_ru.svg", + "width": 0.2, + "alt": "Обновите приложение Open Food Facts" } }, - "uk": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/uk", - "title": "Зробіть прозорість харчових продуктів доступною вашою мовою", - "message": "Перекладіть додаток, веб-сайт та багато іншого, щоб допомогти іншим зробити усвідомлений вибір продуктів харчування", - "button_label": "Приєднатися до команди перекладачів", + "sk": { + "title": "K dispozícii je nová aktualizácia!", + "message": "Nová verzia aplikácie je k dispozícii na Google Play a F-Droid.", + "button_label": "Aktualizovať", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_sk.svg", + "width": 0.2, + "alt": "Aktualizujte aplikáciu Open Food Facts" } }, - "vi": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/vi", - "title": "Mang tính minh bạch về thực phẩm đến ngôn ngữ của bạn", - "message": "Dịch ứng dụng, trang web và hơn thế nữa để giúp người khác đưa ra lựa chọn thực phẩm sáng suốt", - "button_label": "Tham gia đội ngũ dịch thuật", + "sl": { + "title": "Na voljo je nova posodobitev!", + "message": "Nova različica aplikacije je na voljo v Google Play in F-Droid.", + "button_label": "Posodobi", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_sl.svg", + "width": 0.2, + "alt": "Posodobite aplikacijo Open Food Facts" } }, - "zh": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/zh", - "title": "将食品透明度带到您的语言", - "message": "翻译应用程序、网站等,帮助他人做出明智的食品选择", - "button_label": "加入翻译团队", + "sv": { + "title": "En ny uppdatering är tillgänglig!", + "message": "En ny version av applikationen är tillgänglig på Google Play och F-Droid.", + "button_label": "Uppdatera", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_sv.svg", + "width": 0.2, + "alt": "Uppdatera Open Food Facts-appen" } }, - "id": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/id", - "title": "Hadirkan transparansi makanan dalam bahasa Anda", - "message": "Terjemahkan aplikasi, situs web, dan lainnya untuk membantu orang lain membuat pilihan makanan yang tepat", - "button_label": "Bergabunglah dengan tim penerjemah", + "th": { + "title": "มีการอัปเดตใหม่!", + "message": "มีเวอร์ชันใหม่ของแอปพลิเคชันใน Google Play และ F-Droid", + "button_label": "อัปเดต", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_th.svg", + "width": 0.2, + "alt": "อัปเดตแอป Open Food Facts" } }, - "ms": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/ms", - "title": "Bawa ketelusan makanan ke bahasa anda", - "message": "Terjemahkan aplikasi, laman web dan banyak lagi untuk membantu orang lain membuat pilihan makanan yang bijak", - "button_label": "Sertai pasukan penterjemah", + "tr": { + "title": "Yeni bir güncelleme mevcut!", + "message": "Uygulamanın yeni bir sürümü Google Play ve F-Droid'de mevcut.", + "button_label": "Güncelle", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_tr.svg", + "width": 0.2, + "alt": "Open Food Facts uygulamasını güncelle" } }, - "th": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/th", - "title": "นำความโปร่งใสด้านอาหารมาสู่ภาษาของคุณ", - "message": "แปลแอป เว็บไซต์ และอื่นๆ เพื่อช่วยให้ผู้อื่นตัดสินใจเลือกอาหารได้อย่างชาญฉลาด", - "button_label": "เข้าร่วมทีมนักแปล", + "vi": { + "title": "Có bản cập nhật mới!", + "message": "Một phiên bản mới của ứng dụng có sẵn trên Google Play và F-Droid.", + "button_label": "Cập nhật", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_vi.svg", + "width": 0.2, + "alt": "Cập nhật ứng dụng Open Food Facts" } }, - "fa": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/fa", - "title": "شفافیت غذایی را به زبان خود بیاورید", - "message": "برنامه، وب‌سایت و موارد دیگر را ترجمه کنید تا به دیگران در انتخاب آگاهانه مواد غذایی کمک کنید", - "button_label": "به تیم مترجمین بپیوندید", + "zh": { + "title": "有新更新可用!", + "message": "Google Play 和 F-Droid 上有新版本的应用程序。", + "button_label": "更新", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_zh.svg", + "width": 0.2, + "alt": "更新 Open Food Facts 应用程序" } } } @@ -480,10 +430,7 @@ "default": { "news": [ { - "id": "donation_campaign" - }, - { - "id": "translate_openfoodfacts" + "id": "app_update" } ] } diff --git a/html/resources/files/tagline-off-ios-v3.json b/html/resources/files/tagline-off-ios-v3.json index eac1d5b39ce46..24956b224394d 100644 --- a/html/resources/files/tagline-off-ios-v3.json +++ b/html/resources/files/tagline-off-ios-v3.json @@ -1,473 +1,426 @@ { "news": { - "donation_campaign": { - "start_date": "2024-10-25 00:00:00", - "end_date": "2025-01-31 23:59:59", - "url": "https://world.openfoodfacts.org/donate-to-open-food-facts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024", + "app_update": { + "start_date": "2025-01-01 00:00:00", + "end_date": "2099-12-25 23:59:59", + "url": "https://play.google.com/store/apps/details?id=org.openfoodfacts.scanner", "translations": { "default": { - "title": "Our application needs you!", - "message": "Help us inform **millions of consumers** on what they eat!", - "button_label": "Support", - "url": "https://world.openfoodfacts.org/donate-to-open-food-facts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024", + "title": "New update available!", + "message": "A new version of the application is available on the App Store.", + "button_label": "Update", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", "width": 0.2, - "alt": "Support the Open Food Facts project" + "alt": "Update the Open Food Facts app" } }, - "fr_FR": { - "title": "Notre application a besoin de vous !", - "message": "Aidez-nous à informer **des millions de consommateurs** sur ce qu'ils mangent !", - "button_label": "Je soutiens", - "url": "https://fr.openfoodfacts.org/faire-un-don-a-open-food-facts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024", + "fr": { + "title": "Nouvelle mise à jour!", + "message": "Une nouvelle version de l'application est disponible sur l'App Store.", + "button_label": "Mettre à jour", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_fr.svg", + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", "width": 0.2, - "alt": "Soutenir le projet Open Food Facts" + "alt": "Mettre à jour l'application Open Food Facts" } }, - "fr": { - "title": "Notre application a besoin de vous !", - "message": "Aidez-nous à informer **des millions de consommateurs** sur ce qu'ils mangent !", - "button_label": "Je soutiens", - "url": "https://world-fr.openfoodfacts.org/donate-to-open-food-facts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024", + "ar": { + "title": "تحديث جديد متاح!", + "message": "يتوفر إصدار جديد من التطبيق على App Store.", + "button_label": "تحديث", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_fr.svg", + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", "width": 0.2, - "alt": "Soutenir le projet Open Food Facts" + "alt": "تحديث تطبيق Open Food Facts" } }, - "ar": { - "title": "تطبيقنا يحتاجك!", - "message": "ساعدنا في إبلاغ **ملايين المستهلكين** بما يأكلونه!", - "button_label": "أدعم", - "url": "https://world-ar.openfoodfacts.org/donate-to-open-food-facts-ar?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, "bg": { - "title": "Нашето приложение се нуждае от вас!", - "message": "Помогнете ни да информираме **милиони потребители** какво ядат!", - "button_label": "Поддръжка", - "url": "https://world-bg.openfoodfacts.org/даряване-на-openfoodfacts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" + "title": "Налична е нова актуализация!", + "message": "Нова версия на приложението е налична в App Store.", + "button_label": "Актуализиране", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", + "image": { + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Актуализирайте приложението Open Food Facts" + } }, "bn": { - "title": "আমাদের অ্যাপ্লিকেশন আপনার প্রয়োজন!", - "message": "আমাদের **লক্ষ লক্ষ ভোক্তাদের** তাদের খাবার সম্পর্কে জানাতে সাহায্য করুন!", - "button_label": "সমর্থন" + "title": "একটি নতুন আপডেট উপলব্ধ!", + "message": "অ্যাপ্লিকেশনের একটি নতুন সংস্করণ App Store-এ উপলব্ধ।", + "button_label": "আপডেট", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", + "image": { + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Open Food Facts অ্যাপ আপডেট করুন" + } }, "ca": { - "title": "La nostra aplicació et necessita!", - "message": "Ajuda'ns a informar **milions de consumidors** sobre el que mengen!", - "button_label": "Suport", - "url": "https://world-ca.openfoodfacts.org/dona-a-openfoodfacts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" + "title": "Hi ha una nova actualització disponible!", + "message": "Hi ha una nova versió de l'aplicació disponible a l'App Store.", + "button_label": "Actualitzar", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", + "image": { + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Actualitza l'aplicació Open Food Facts" + } }, "cs": { - "title": "Naše aplikace vás potřebuje!", - "message": "Pomozte nám informovat **miliony spotřebitelů** o tom, co jedí!", - "button_label": "Podpora", - "url": "https://world-cs.openfoodfacts.org/darujte-openfoodfacts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" + "title": "Je k dispozici nová aktualizace!", + "message": "Nová verze aplikace je k dispozici na App Store.", + "button_label": "Aktualizovat", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", + "image": { + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Aktualizujte aplikaci Open Food Facts" + } }, "da": { - "title": "Vores ansøgning har brug for dig!", - "message": "Hjælp os med at informere **millioner af forbrugere** om, hvad de spiser!", - "button_label": "Support", - "url": "https://world-da.openfoodfacts.org/doner-til-open-food-facts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" + "title": "En ny opdatering er tilgængelig!", + "message": "En ny version af applikationen er tilgængelig på App Store.", + "button_label": "Opdater", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", + "image": { + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Opdater Open Food Facts-appen" + } }, "de": { - "title": "Unsere Anwendung braucht Sie!", - "message": "Helfen Sie uns, **Millionen von Verbrauchern** darüber zu informieren, was sie essen!", - "button_label": "Unterstützen", - "url": "https://world-de.openfoodfacts.org/spenden?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" + "title": "Ein neues Update ist verfügbar!", + "message": "Eine neue Version der Anwendung ist im App Store verfügbar.", + "button_label": "Aktualisieren", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", + "image": { + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Aktualisieren Sie die Open Food Facts App" + } }, "ee": { - "title": "Meie rakendus vajab teid!", - "message": "Aidake meil teavitada **miljoneid tarbijaid** sellest, mida nad söövad!", - "button_label": "Tugi", - "url": "https://world-ee.openfoodfacts.org/anneta-to-openfoodfacts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" + "title": "Uus värskendus on saadaval!", + "message": "Rakenduse uus versioon on saadaval App Store'is.", + "button_label": "Värskenda", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", + "image": { + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Värskendage Open Food Facts rakendust" + } }, "el": { - "title": "Η εφαρμογή μας σας χρειάζεται!", - "message": "Βοηθήστε μας να ενημερώσουμε **εκατομμύρια καταναλωτές** για το τι τρώνε!", - "button_label": "Υποστηρίζω", - "url": "https://world-el.openfoodfacts.org/dorea-se-openfoodfacts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" + "title": "Μια νέα ενημέρωση είναι διαθέσιμη!", + "message": "Μια νέα έκδοση της εφαρμογής είναι διαθέσιμη στο App Store.", + "button_label": "Ενημέρωση", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", + "image": { + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Ενημερώστε την εφαρμογή Open Food Facts" + } }, "es": { - "title": "¡Nuestra aplicación te necesita!", - "message": "¡Ayúdanos a informar a **millones de consumidores** sobre lo que comen!", - "button_label": "Apoyar", - "url": "https://world-es.openfoodfacts.org/haz-su-donacion-a-open-food-facts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" + "title": "¡Una nueva actualización está disponible!", + "message": "Una nueva versión de la aplicación está disponible en el App Store.", + "button_label": "Actualizar", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", + "image": { + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Actualizar la aplicación Open Food Facts" + } }, "fa": { - "title": "برنامه ما به شما نیاز دارد!", - "message": "به ما کمک کنید تا **میلیون‌ها مصرف‌کننده** را در مورد آنچه می‌خورند مطلع کنیم!", - "button_label": "حمایت" + "title": "به‌روزرسانی جدیدی در دسترس است!", + "message": "نسخه جدیدی از برنامه در App Store موجود است.", + "button_label": "به‌روزرسانی", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", + "image": { + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "برنامه Open Food Facts را به‌روزرسانی کنید" + } }, "fi": { - "title": "Sovelluksemme tarvitsee sinua!", - "message": "Auta meitä kertomaan **miljoonille kuluttajille** siitä, mitä he syövät!", - "button_label": "Tuki", - "url": "https://world-fi.openfoodfacts.org/lahjoita-open-food-factsille?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" + "title": "Uusi päivitys on saatavilla!", + "message": "Sovelluksen uusi versio on saatavilla App Storessa.", + "button_label": "Päivitä", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", + "image": { + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Päivitä Open Food Facts -sovellus" + } }, "he": { - "title": "האפליקציה שלנו צריכה אותך!", - "message": "עזור לנו ליידע **מיליוני צרכנים** מה הם אוכלים!", - "button_label": "תמיכה", - "url": "https://world-he.openfoodfacts.org/donate-to-open-food-facts-he?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "hi": { - "title": "हमारे ऐप को आपकी जरूरत है!", - "message": "हमें **लाखों उपभोक्ताओं** को उनके खाने के बारे में सूचित करने में मदद करें!", - "button_label": "समर्थन" - }, - "ht": { - "title": "Aplikasyon nou an bezwen ou!", - "message": "Ede nou enfòme **dè milyon de konsomatè** sou sa yo manje!", - "button_label": "Sipò", - "url": "https://world-ht.openfoodfacts.org/donate-to-open-food-facts-ht?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "hu": { - "title": "Alkalmazásunknak szüksége van Önre!", - "message": "Segítsen bennünket, hogy **fogyasztók millióit** tájékoztassuk arról, hogy mit esznek!", - "button_label": "Támogatás", - "url": "https://world-hu.openfoodfacts.org/donate-to-open-food-facts-hu?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "id": { - "title": "Aplikasi kami membutuhkan Anda!", - "message": "Bantu kami memberi tahu **jutaan konsumen** tentang apa yang mereka makan!", - "button_label": "Dukung", - "url": "https://world-id.openfoodfacts.org/donate-to-open-food-facts-id?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "it": { - "title": "La nostra applicazione ha bisogno di te!", - "message": "Aiutaci a informare **milioni di consumatori** su ciò che mangiano!", - "button_label": "Sostieni", - "url": "https://world-it.openfoodfacts.org/dona-a-open-food-facts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "ja": { - "title": "私たちのアプリケーションはあなたを必要としています!", - "message": "何を食べているかについて**何百万人もの消費者**に知らせるのを手伝ってください!", - "button_label": "サポート" - }, - "ko": { - "title": "우리 애플리케이션이 당신을 필요로 합니다!", - "message": "**수백만 소비자**에게 그들이 먹는 것에 대해 알리는 데 도움을 주세요!", - "button_label": "지원" - }, - "lu": { - "title": "Onze applicatie heeft u nodig!", - "message": "Help ons om **miljoenen consumenten** te informeren over wat ze eten!", - "button_label": "Ondersteunen", - "url": "https://world-lu.openfoodfacts.org/donate-to-open-food-facts-lu?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "lt": { - "title": "Mūsų programai reikia jūsų!", - "message": "Padėkite mums informuoti **milijonus vartotojų** apie tai, ką jie valgo!", - "button_label": "Palaikymas", - "url": "https://world-lt.openfoodfacts.org/donate-to-open-food-facts-lt?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "ms": { - "title": "Aplikasi kami memerlukan anda!", - "message": "Bantu kami memaklumkan **jutaan pengguna** tentang apa yang mereka makan!", - "button_label": "Sokong" - }, - "nb": { - "title": "Vår applikasjon trenger deg!", - "message": "Hjelp oss å informere **millioner av forbrukere** om hva de spiser!", - "button_label": "Støtte", - "url": "https://world-nb.openfoodfacts.org/donate-to-open-food-facts-nb?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "nl": { - "title": "Onze applicatie heeft u nodig!", - "message": "Help ons om **miljoenen consumenten** te informeren over wat ze eten!", - "button_label": "Ondersteunen", - "url": "https://world-nl.openfoodfacts.org/doneren-aan-openfoodfacts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "pt": { - "title": "Nosso aplicativo precisa de você!", - "message": "Ajude-nos a informar **milhões de consumidores** sobre o que eles comem!", - "button_label": "Apoiar", - "url": "https://world-pt.openfoodfacts.org/fazer-um-donativo-ao-open-food-facts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "pl": { - "title": "Nasza aplikacja potrzebuje Ciebie!", - "message": "Pomóż nam informować **miliony konsumentów** o tym, co jedzą!", - "button_label": "Wspieram", - "url": "https://world-pl.openfoodfacts.org/pozhertvovat-open-food-facts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "ro": { - "title": "Aplicația noastră are nevoie de tine!", - "message": "Ajută-ne să informăm **milioane de consumatori** despre ce mănâncă!", - "button_label": "Suport", - "url": "https://world-ro.openfoodfacts.org/donate-to-open-food-facts-ro?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "ru": { - "title": "Наше приложение нуждается в вас!", - "message": "Помогите нам информировать **миллионы потребителей** о том, что они едят!", - "button_label": "Поддержать", - "url": "https://world-ru.openfoodfacts.org/donate-to-open-food-facts-ru?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "sk": { - "title": "Naša aplikácia vás potrebuje!", - "message": "Pomôžte nám informovať **milióny spotrebiteľov** o tom, čo jedia!", - "button_label": "Podpora", - "url": "https://world-bg.openfoodfacts.org/donate-to-open-food-facts-sk?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "sl": { - "title": "Naša aplikacija vas potrebuje!", - "message": "Pomagajte nam obveščati **milijone potrošnikov** o tem, kaj jedo!", - "button_label": "Podpora", - "url": "https://world-sl.openfoodfacts.org/doniraj-k-open-food-facts?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "sv": { - "title": "Vår applikation behöver dig!", - "message": "Hjälp oss att informera **miljontals konsumenter** om vad de äter!", - "button_label": "Stöd", - "url": "https://world-sv.openfoodfacts.org/donate-to-open-food-facts-sv?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "th": { - "title": "แอปพลิเคชันของเราต้องการคุณ!", - "message": "ช่วยเราบอก **ผู้บริโภคหลายล้านคน** ว่าพวกเขากินอะไร!", - "button_label": "สนับสนุน" - }, - "tr": { - "title": "Uygulamamızın size ihtiyacı var!", - "message": "**Milyonlarca tüketiciyi** ne yedikleri konusunda bilgilendirmemize yardımcı olun!", - "button_label": "Destek", - "url": "https://world-tr.openfoodfacts.org/open-food-factse-bagista-bulununs?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - }, - "vi": { - "title": "Ứng dụng của chúng tôi cần bạn!", - "message": "Giúp chúng tôi thông báo cho **hàng triệu người tiêu dùng** về những gì họ ăn!", - "button_label": "Hỗ trợ" - }, - "zh": { - "title": "我们的应用程序需要你!", - "message": "帮助我们告知**数百万消费者**他们吃的是什么!", - "button_label": "支持", - "url": "https://world.openfoodfacts.org/donate-to-open-food-facts-cn?utm_source=off&utf_medium=smooth-app&utm_campaign=donation-2024" - } - } - }, - "translate_openfoodfacts": { - "start_date": "2025-02-01 00:00:00", - "end_date": "2025-12-31 23:59:59", - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/en", - "translations": { - "default": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/en", - "title": "Bring food transparency to your language", - "message": "Translate the app, website and more to help others make informed food choices", - "button_label": "Join the translators team", + "title": "עדכון חדש זמין!", + "message": "גרסה חדשה של האפליקציה זמינה ב-App Store.", + "button_label": "עדכון", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png", - "width": 0.2 + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "עדכן את אפליקציית Open Food Facts" } }, - "ar": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/ar", - "title": "اجعل شفافية الغذاء تصل إلى لغتك", - "message": "ترجم التطبيق والموقع الإلكتروني والمزيد لمساعدة الآخرين على اتخاذ خيارات غذائية مستنيرة", - "button_label": "انضم إلى فريق المترجمين", + "hi": { + "title": "एक नया अपडेट उपलब्ध है!", + "message": "एप्लिकेशन का एक नया संस्करण App Store पर उपलब्ध है।", + "button_label": "अपडेट करें", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Open Food Facts ऐप को अपडेट करें" } }, - "bn": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/bn", - "title": "আপনার ভাষায় খাদ্য স্বচ্ছতা আনুন", - "message": "অন্যদের তথ্যবহুল খাদ্য পছন্দ করতে সাহায্য করার জন্য অ্যাপ, ওয়েবসাইট এবং আরও অনেক কিছু অনুবাদ করুন", - "button_label": "অনুবাদক দলে যোগ দিন", + "ht": { + "title": "Yon nouvo mizajou disponib!", + "message": "Yon nouvo vèsyon aplikasyon an disponib sou App Store.", + "button_label": "Mizajou", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Mizajou aplikasyon Open Food Facts la" } }, - "de": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/de", - "title": "Bringen Sie Lebensmitteltransparenz in Ihre Sprache", - "message": "Übersetzen Sie die App, die Website und mehr, um anderen zu helfen, informierte Entscheidungen über Lebensmittel zu treffen", - "button_label": "Dem Übersetzerteam beitreten", + "hu": { + "title": "Új frissítés érhető el!", + "message": "Az alkalmazás új verziója elérhető az App Store-ban.", + "button_label": "Frissítés", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Frissítse az Open Food Facts alkalmazást" } }, - "el": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/el", - "title": "Φέρτε τη διαφάνεια τροφίμων στη γλώσσα σας", - "message": "Μεταφράστε την εφαρμογή, τον ιστότοπο και άλλα για να βοηθήσετε άλλους να κάνουν ενημερωμένες επιλογές τροφίμων", - "button_label": "Γίνετε μέλος της ομάδας μεταφραστών", + "id": { + "title": "Pembaruan baru tersedia!", + "message": "Versi baru aplikasi tersedia di App Store.", + "button_label": "Perbarui", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Perbarui aplikasi Open Food Facts" } }, - "es": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/es", - "title": "Haz que la transparencia alimentaria llegue a tu idioma", - "message": "Traduce la aplicación, el sitio web y más para ayudar a otros a tomar decisiones alimentarias informadas", - "button_label": "Únete al equipo de traductores", + "it": { + "title": "È disponibile un nuovo aggiornamento!", + "message": "È disponibile una nuova versione dell'applicazione su App Store.", + "button_label": "Aggiorna", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Aggiorna l'app Open Food Facts" } }, - "fr": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/fr", - "title": "Rendez la transparence alimentaire accessible dans votre langue", - "message": "Traduisez l'application, le site web et plus encore pour aider les autres à faire des choix alimentaires éclairés", - "button_label": "Rejoindre l'équipe de traducteurs", + "ja": { + "title": "新しいアップデートが利用可能です!", + "message": "アプリケーションの新しいバージョンがApp Storeで利用可能です。", + "button_label": "更新", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Open Food Factsアプリを更新する" } }, - "hi": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/hi", - "title": "अपनी भाषा में खाद्य पारदर्शिता लाएँ", - "message": "दूसरों को सूचित खाद्य विकल्प बनाने में मदद करने के लिए ऐप, वेबसाइट और बहुत कुछ का अनुवाद करें", - "button_label": "अनुवादक टीम में शामिल हों", + "ko": { + "title": "새로운 업데이트가 있습니다!", + "message": "애플리케이션의 새로운 버전이 App Store에서 사용할 수 있습니다.", + "button_label": "업데이트", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Open Food Facts 앱을 업데이트하세요" } }, - "pt": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/pt", - "title": "Traga transparência alimentar para o seu idioma", - "message": "Traduza o aplicativo, o site e muito mais para ajudar outras pessoas a fazer escolhas alimentares informadas", - "button_label": "Junte-se à equipe de tradutores", + "lu": { + "title": "Een nieuwe update is beschikbaar!", + "message": "Een nieuwe versie van de applicatie is beschikbaar op de App Store.", + "button_label": "Bijwerken", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Update de Open Food Facts app" } }, - "it": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/it", - "title": "Porta la trasparenza alimentare nella tua lingua", - "message": "Traduci l'app, il sito web e altro ancora per aiutare gli altri a fare scelte alimentari informate", - "button_label": "Unisciti al team di traduttori", + "lt": { + "title": "Yra naujas atnaujinimas!", + "message": "Nauja programos versija pasiekiama „App Store“.", + "button_label": "Atnaujinti", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Atnaujinkite „Open Food Facts“ programą" } }, - "ja": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/ja", - "title": "食品の透明性をあなたの言語で", - "message": "アプリ、ウェブサイトなどを翻訳して、他の人が情報に基づいた食品の選択をするのを手伝ってください", - "button_label": "翻訳チームに参加する", + "ms": { + "title": "Kemas kini baharu tersedia!", + "message": "Versi baharu aplikasi tersedia di App Store.", + "button_label": "Kemas kini", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Kemas kini aplikasi Open Food Facts" } }, - "ko": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/ko", - "title": "식품 투명성을 귀하의 언어로 가져오세요", - "message": "앱, 웹사이트 등을 번역하여 다른 사람들이 정보에 입각한 식품 선택을 할 수 있도록 돕습니다.", - "button_label": "번역 팀에 합류하기", + "nb": { + "title": "En ny oppdatering er tilgjengelig!", + "message": "En ny versjon av applikasjonen er tilgjengelig på App Store.", + "button_label": "Oppdater", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Oppdater Open Food Facts-appen" } }, "nl": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/nl", - "title": "Breng voedseltransparantie naar uw taal", - "message": "Vertaal de app, website en meer om anderen te helpen weloverwogen voedselkeuzes te maken", - "button_label": "Word lid van het vertalersteam", + "title": "Nieuwe update beschikbaar!", + "message": "Een nieuwe versie van de applicatie is beschikbaar in de App Store.", + "button_label": "Bijwerken", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Update de Open Food Facts app" } }, - "pl": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/pl", - "title": "Przynieś przejrzystość żywności do swojego języka", - "message": "Przetłumacz aplikację, stronę internetową i wiele więcej, aby pomóc innym w podejmowaniu świadomych wyborów żywieniowych", - "button_label": "Dołącz do zespołu tłumaczy", + "pt": { + "title": "Nova atualização disponível!", + "message": "Uma nova versão do aplicativo está disponível na App Store.", + "button_label": "Atualizar", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Atualize o aplicativo Open Food Facts" } }, - "ru": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/ru", - "title": "Обеспечьте прозрачность пищевых продуктов на вашем языке", - "message": "Переведите приложение, веб-сайт и многое другое, чтобы помочь другим сделать осознанный выбор продуктов питания", - "button_label": "Присоединиться к команде переводчиков", + "pl": { + "title": "Dostępna jest nowa aktualizacja!", + "message": "Nowa wersja aplikacji jest dostępna w App Store.", + "button_label": "Aktualizuj", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Zaktualizuj aplikację Open Food Facts" } }, - "sv": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/sv", - "title": "Ge din språklig insyn i livsmedel", - "message": "Översätt appen, webbplatsen och mer för att hjälpa andra att göra välgrundade val av livsmedel", - "button_label": "Gå med i översättarteamet", + "ro": { + "title": "O nouă actualizare este disponibilă!", + "message": "O nouă versiune a aplicației este disponibilă în App Store.", + "button_label": "Actualizați", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Actualizați aplicația Open Food Facts" } }, - "tr": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/tr", - "title": "Gıda şeffaflığını dilinize getirin", - "message": "Uygulamayı, web sitesini ve daha fazlasını çevirerek başkalarının bilinçli gıda seçimleri yapmasına yardımcı olun", - "button_label": "Çevirmenler ekibine katılın", + "ru": { + "title": "Доступно новое обновление!", + "message": "Новая версия приложения доступна в App Store.", + "button_label": "Обновить", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Обновите приложение Open Food Facts" } }, - "uk": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/uk", - "title": "Зробіть прозорість харчових продуктів доступною вашою мовою", - "message": "Перекладіть додаток, веб-сайт та багато іншого, щоб допомогти іншим зробити усвідомлений вибір продуктів харчування", - "button_label": "Приєднатися до команди перекладачів", + "sk": { + "title": "K dispozícii je nová aktualizácia!", + "message": "Nová verzia aplikácie je k dispozícii v App Store.", + "button_label": "Aktualizovať", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Aktualizujte aplikáciu Open Food Facts" } }, - "vi": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/vi", - "title": "Mang tính minh bạch về thực phẩm đến ngôn ngữ của bạn", - "message": "Dịch ứng dụng, trang web và hơn thế nữa để giúp người khác đưa ra lựa chọn thực phẩm sáng suốt", - "button_label": "Tham gia đội ngũ dịch thuật", + "sl": { + "title": "Na voljo je nova posodobitev!", + "message": "Nova različica aplikacije je na voljo v App Store.", + "button_label": "Posodobi", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Posodobite aplikacijo Open Food Facts" } }, - "zh": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/zh", - "title": "将食品透明度带到您的语言", - "message": "翻译应用程序、网站等,帮助他人做出明智的食品选择", - "button_label": "加入翻译团队", + "sv": { + "title": "En ny uppdatering är tillgänglig!", + "message": "En ny version av applikationen är tillgänglig i App Store.", + "button_label": "Uppdatera", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Uppdatera Open Food Facts-appen" } }, - "id": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/id", - "title": "Hadirkan transparansi makanan dalam bahasa Anda", - "message": "Terjemahkan aplikasi, situs web, dan lainnya untuk membantu orang lain membuat pilihan makanan yang tepat", - "button_label": "Bergabunglah dengan tim penerjemah", + "th": { + "title": "มีการอัปเดตใหม่!", + "message": "มีเวอร์ชันใหม่ของแอปพลิเคชันใน App Store", + "button_label": "อัปเดต", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "อัปเดตแอป Open Food Facts" } }, - "ms": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/ms", - "title": "Bawa ketelusan makanan ke bahasa anda", - "message": "Terjemahkan aplikasi, laman web dan banyak lagi untuk membantu orang lain membuat pilihan makanan yang bijak", - "button_label": "Sertai pasukan penterjemah", + "tr": { + "title": "Yeni bir güncelleme mevcut!", + "message": "Uygulamanın yeni bir sürümü App Store'da mevcut.", + "button_label": "Güncelle", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Open Food Facts uygulamasını güncelle" } }, - "th": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/th", - "title": "นำความโปร่งใสด้านอาหารมาสู่ภาษาของคุณ", - "message": "แปลแอป เว็บไซต์ และอื่นๆ เพื่อช่วยให้ผู้อื่นตัดสินใจเลือกอาหารได้อย่างชาญฉลาด", - "button_label": "เข้าร่วมทีมนักแปล", + "vi": { + "title": "Có bản cập nhật mới!", + "message": "Một phiên bản mới của ứng dụng có sẵn trên App Store.", + "button_label": "Cập nhật", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "Cập nhật ứng dụng Open Food Facts" } }, - "fa": { - "url": "https://translate.openfoodfacts.org/project/openfoodfacts/fa", - "title": "شفافیت غذایی را به زبان خود بیاورید", - "message": "برنامه، وب‌سایت و موارد دیگر را ترجمه کنید تا به دیگران در انتخاب آگاهانه مواد غذایی کمک کنید", - "button_label": "به تیم مترجمین بپیوندید", + "zh": { + "title": "有新更新可用!", + "message": "App Store 上有新版本的应用程序。", + "button_label": "更新", + "url": "https://apps.apple.com/app/open-food-facts/id588797948", "image": { - "url": "https://world.openfoodfacts.org/images/misc/tagline-images/worldwide.png" + "url": "https://raw.githubusercontent.com/openfoodfacts/smooth-app_assets/refs/heads/main/prod/tagline/ios/assets/donation_campaign/donation_campaign_en.svg", + "width": 0.2, + "alt": "更新 Open Food Facts 应用程序" } } } @@ -477,10 +430,7 @@ "default": { "news": [ { - "id": "donation_campaign" - }, - { - "id": "translate_openfoodfacts" + "id": "app_update" } ] } From 4916be82d3e7549877b0b2a67455e8f7305f1d46 Mon Sep 17 00:00:00 2001 From: OpenChris Date: Mon, 20 Jan 2025 15:58:10 +0100 Subject: [PATCH 03/18] taxonomy: various insertions (#11198) A small number of insertions --------- Co-authored-by: Open Food Facts Bot --- taxonomies/food/categories.txt | 49 ++++++++++++++++++- ...ategories-string-fr-tart-get-synonyms.json | 8 +-- 2 files changed, 52 insertions(+), 5 deletions(-) diff --git a/taxonomies/food/categories.txt b/taxonomies/food/categories.txt index 073488fabda37..cfdb4c8f6566e 100644 --- a/taxonomies/food/categories.txt +++ b/taxonomies/food/categories.txt @@ -6286,6 +6286,12 @@ ciqual_food_code:en: 18345 ciqual_food_name:en: Fruit soft drink, carbonated (less than 10% of fruit juice), without sugar and artificial sweetener(s) ciqual_food_name:fr: Boisson gazeuse aux fruits (à moins de 10% de jus), non sucrée, sans édulcorant +< en:Carbonated drinks +en: Carbonated soft drinks with tea extract +fr: Boissons gazeuses au thé aromatisées, Boisson gazeuse au thé aromatisée +agribalyse_proxy_food_code:en: 18015 +agribalyse_proxy_food_name:en: Still soft drink with tea extract, with sugar and artificial sweetener(s) + < en:Sodas en: Tonic water bg: Тоник @@ -6663,6 +6669,11 @@ ciqual_food_code:en: 18039 ciqual_food_name:en: Lemonade with a flavoured syrup ciqual_food_name:fr: Diabolo (limonade et sirop) +< en: Lemonades +en: Chinotto +fr: Chinotto +it: Chinotto + < en:Sodas en: Colas, Cola, Cola sodas bg: Кола @@ -8580,7 +8591,10 @@ it: Succo di barbabietola ja: ビートルートジュース, ビーツジュース lt: Burokėlių sultys nl: Rode bietensappen, Rode bietensap -agribalyse_food_code:en: 1 +agribalyse_food_code:en: 0001 +ciqual_food_code:en: 1 +ciqual_food_name:en: Beetroot juice, pure juice +ciqual_food_name:fr: Jus de betterave < en:Tomatoes and their products < en:Vegetable juices @@ -13060,6 +13074,15 @@ fr: Alsace Pinot gris < fr:Vin d'Alsace fr: Alsace Riesling, Riesling d'Alsace +< fr:Vin d'Alsace +fr: Edelzwicker, Alsace edelzwicker +origins:en: en:france +wikidata:en: Q1283481 + +< fr:Vin d'Alsace +fr: Sylvaner d'Alsace, Alsace sylvaner, Sylvaner +origins:en: en:france + < en:Wines from France fr: Anjou, Anjou Val de Loire origins:en: en:france, en:loire-valley @@ -32994,6 +33017,16 @@ ciqual_food_code:en: 5201 ciqual_food_name:en: Wine, white, sparkling ciqual_food_name:fr: Vin blanc mousseux +< en:Red wines +< en:Sparkling wines +en: Sparkling red wine +fr: Vin rouge pétillant + +< en:Rosé wines +< en:Sparkling wines +en: Sparkling Rosé wine +fr: Vin rosé pétillant + < en:Flavoured wines < en:Sparkling wines < en:White wines @@ -64342,6 +64375,10 @@ zh: 香精 fr: Arômes pâtisserie, Arôme pâtisserie nl: Gebaksaromas +< en:Food additives +en: Citric acid +fr: Acide citrique + < en:Food additives en: Food colorings, Food dyes, Color additives, Food colourings, Food coloring, Food colouring de: Lebensmittelfarbe, Lebensmittelfarbstoffe @@ -95425,6 +95462,10 @@ hr: Tartlete od krušaka it: Tortini di pera nl: Peertaartjes +< en:Fruit tartlets +en: Frozen fruit tartlets +fr: Tartelettes aux fruits surgelées + < en:Specific products en: Products sold before year 2000, products sold before 2000 de: Produkte die vor dem Jahr 2000 verkauft wurden, Produkte die vor 2000 verkauft wurden @@ -100487,6 +100528,11 @@ agribalyse_food_code:en: 26111 ciqual_food_code:en: 26111 ciqual_food_name:en: Salema, raw +< en:Fishes +en: Bleak +fr: Ablette +wikidata:en: Q200473 + < en:Cooked cods en: Roasted cods, Baked cods fr: Cabillauds rôtis, Cabillauds cuits au four @@ -118464,3 +118510,4 @@ fr: Spirales de blé dur complet en: Semi whole durum wheat spirals fr: Spirales de blé dur semi-complet + diff --git a/tests/integration/expected_test_results/api_v3_taxonomy_suggestions/categories-string-fr-tart-get-synonyms.json b/tests/integration/expected_test_results/api_v3_taxonomy_suggestions/categories-string-fr-tart-get-synonyms.json index 784401c517709..b7338ede336e0 100644 --- a/tests/integration/expected_test_results/api_v3_taxonomy_suggestions/categories-string-fr-tart-get-synonyms.json +++ b/tests/integration/expected_test_results/api_v3_taxonomy_suggestions/categories-string-fr-tart-get-synonyms.json @@ -24,8 +24,8 @@ "Tartelettes au chocolat" : "Tartelettes au chocolat", "Tartelettes au citron" : "Tartelettes au citron", "Tartelettes aux fruits entiers ou coupés" : "Tartelettes aux fruits entiers ou coupés", - "Tartelettes à l'abricot" : "Tartelettes à l'abricot", - "Tartelettes à la fraise" : "Tartelettes à la fraise" + "Tartelettes aux fruits surgelées" : "Tartelettes aux fruits surgelées", + "Tartelettes à l'abricot" : "Tartelettes à l'abricot" }, "status" : "success", "suggestions" : [ @@ -52,8 +52,8 @@ "Tartelettes au chocolat", "Tartelettes au citron", "Tartelettes aux fruits entiers ou coupés", - "Tartelettes à l'abricot", - "Tartelettes à la fraise" + "Tartelettes aux fruits surgelées", + "Tartelettes à l'abricot" ], "warnings" : [] } From 7a6c11c9d41c1a777466ca3aeb916d5eaa379d7b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2025 18:49:17 +0100 Subject: [PATCH 04/18] build(deps): bump crowdin/github-action from 2.5.0 to 2.5.1 (#11270) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [crowdin/github-action](https://github.com/crowdin/github-action) from 2.5.0 to 2.5.1.
Release notes

Sourced from crowdin/github-action's releases.

v2.5.1

What's Changed

Full Changelog: https://github.com/crowdin/github-action/compare/v2.5.0...v2.5.1

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=crowdin/github-action&package-manager=github_actions&previous-version=2.5.0&new-version=2.5.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/crowdin-per-language.yml | 2 +- .github/workflows/crowdin.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/crowdin-per-language.yml b/.github/workflows/crowdin-per-language.yml index b1ff23b59237d..2af9dee66d7c6 100644 --- a/.github/workflows/crowdin-per-language.yml +++ b/.github/workflows/crowdin-per-language.yml @@ -22,7 +22,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Matrix - uses: crowdin/github-action@v2.5.0 + uses: crowdin/github-action@v2.5.1 with: upload_translations: false # default is false download_translations: true diff --git a/.github/workflows/crowdin.yml b/.github/workflows/crowdin.yml index 32626f0000104..9f1c04fe4f3b8 100644 --- a/.github/workflows/crowdin.yml +++ b/.github/workflows/crowdin.yml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: crowdin action - uses: crowdin/github-action@v2.5.0 + uses: crowdin/github-action@v2.5.1 with: upload_translations: false # default is false # Use this option to upload translations for a single specified language From ffac83003c6b6d628b1cb8e8f01688007c39c9e8 Mon Sep 17 00:00:00 2001 From: Roto15 <99144065+Roto15@users.noreply.github.com> Date: Wed, 22 Jan 2025 12:23:52 +0200 Subject: [PATCH 05/18] taxonomy: Bulgarian additions (#11274) --- taxonomies/food/categories.txt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/taxonomies/food/categories.txt b/taxonomies/food/categories.txt index cfdb4c8f6566e..7bab0845d350e 100644 --- a/taxonomies/food/categories.txt +++ b/taxonomies/food/categories.txt @@ -34302,7 +34302,7 @@ wikidata:en: Q2936384 < en:Dry biscuits en: Cantucci, cantuccini xx: Cantucci -bg: Кантучи +bg: Кантучи, кантучини fr: Cantucci, cantuccini it: Cantucci, cantuccini nl: Cantucci @@ -41532,6 +41532,7 @@ ciqual_food_name:fr: Igname, épluchée, bouillie/cuite à l'eau < en:Cereals and potatoes en: Gnocchi +bg: Ньоки de: Gnocchi es: Ñoquis fi: Gnocchi @@ -44604,6 +44605,7 @@ wikidata:en: Q3088299 < en:Cow cheeses en: Provolone xx: Provolone +bg: Проволоне de: Provolone es: Provolone fi: Provolone @@ -81851,6 +81853,7 @@ ciqual_food_name:fr: Petit salé ou saucisse aux lentilles < en:Meals en: Focaccia +bg: Фокача fr: Focaccia hr: Focaccia ja: フォカッチャ @@ -93612,6 +93615,7 @@ fr: Ravioli frais à la viande < en:Pasta stuffed with meat < en:ravioli en: Meat ravioli +bg: Равиоли с месо de: Fleischravioli es: Ravioli de carne fr: Ravioli à la viande @@ -93623,6 +93627,7 @@ agribalyse_proxy_food_code:en: 25019 < en:Pasta stuffed with vegetables < en:ravioli en: Ravioli with vegetables, Vegetable ravioli, Ravioli filled with vegetables +bg: Равиоли със зеленчуци de: Gemüseravioli, Gemüse-Ravioli es: Ravioli con verduras, Ravioles con verduras, Ravioli de verduras, Raviolis de verduras fi: Raviolia kasviksilla @@ -94070,6 +94075,7 @@ nl: Tortellini met kip < en:Stuffed Pastas en: Tortelloni xx: Tortelloni +bg: Тортелони wikidata:en: Q20061 < en:Pastas @@ -94807,6 +94813,7 @@ wikidata:en: Q2746070 < en:Pastries en: Cream puff, Pastry cream puff +bg: Профитероли de: Windbeutel, Profiterole, Profiteroles es: Bocadito de nata, Profiterol, Profiteroles fr: Profiteroles, Profiterole, Profiterolles, Choux à la crème, Chou à la crème @@ -112063,6 +112070,7 @@ ciqual_food_name:fr: Câpres, au vinaigre < en:Condiments en: Capers +bg: Каперси de: Kapernbeeren hr: Kapari ja: ケッパー From 4e45a34d4cacae39d13deca68bff72c1035a05d7 Mon Sep 17 00:00:00 2001 From: Malte Wilhelm <25488086+github-throwaway@users.noreply.github.com> Date: Wed, 22 Jan 2025 11:32:59 +0100 Subject: [PATCH 06/18] fix: Add more german stopwords (#11266) ### What ### Related issue(s) and discussion - Part to solve #11215 --- lib/ProductOpener/Ingredients.pm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/ProductOpener/Ingredients.pm b/lib/ProductOpener/Ingredients.pm index 037c63e1f762b..eaeee28cdd718 100644 --- a/lib/ProductOpener/Ingredients.pm +++ b/lib/ProductOpener/Ingredients.pm @@ -5193,6 +5193,8 @@ my %phrases_after_ingredients_list = ( '100 (ml|g) enthalten durchschnittlich', '\d\d\d\sg\s\w*\swerden aus\s\d\d\d\sg\s\w*\shergestellt' , # 100 g Salami werden aus 120 g Schweinefleisch hergestellt. + 'Alle Zutaten sind aus biologischem Anbau', + 'außer die mit * markierten Bestandteile' ], el => [ From 8f54f808ce708f619259ae2d4028d38c713e8041 Mon Sep 17 00:00:00 2001 From: Pierre Slamich Date: Wed, 22 Jan 2025 11:34:09 +0100 Subject: [PATCH 07/18] feat: add common categories found on re-commerce websites (#11263) ### What feat: add common categories found on re-commerce websites --------- Co-authored-by: Open Food Facts Bot --- taxonomies/product/categories.txt | 89 +++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/taxonomies/product/categories.txt b/taxonomies/product/categories.txt index 97c94afb32e9e..900a1cb8b6881 100644 --- a/taxonomies/product/categories.txt +++ b/taxonomies/product/categories.txt @@ -5,10 +5,64 @@ # - carbon_impact_fr_impactco2:en: co2 equivalent in kg per unit (1 product) from https://impactco2.fr/ # - carbon_impact_fr_impactco2_link:en: URL for the category on https://impactco2.fr/ +en: Furniture + +en: Appliances + +< en:Appliances +en: Fridge + +< en:Appliances +en: Freezer + +< en:Appliances +en: Dishwasher + +< en:Appliances +en: Micro-waves + +< en:Appliances +en: Ovens + +en: Cooking equipment + +en: Sport equipment + +< en:Sport equipment +en: Bikes + +< en:Sport equipment +en: Bike equipment + +< en:Sport equipment +en: Swimming equipment + +< en:Sport equipment +en: Sport clothes + +en: Fitness equipment + +< en:Sport equipment +en: Sport shoes + +en: Baby equipment + en: Electronic products, electronics fr: Appareils électroniques secondhand_used:en: backmarket +< en: Electronic products +en: TVs + +< en: Electronic products +en: Printers + +< en: Electronic products +en: USB cables + +< en: Electronic products +en: Headphones + < en: electronic products en: Digital tablets fr: Tablettes numériques, tablette numérique @@ -51,6 +105,31 @@ carbon_impact_fr_impactco2_link:en: https://impactco2.fr/outils/habillement/tshi unit_name:xx: t-shirt unit_name:en: t-shirt +< en: Clothes +en: Women clothes + +< en: Clothes +en: Men clothes + +en: Women shoes + +< en: Clothes +en: Socks + +< en: Clothes +en: Jeans + +< en: Clothes +en: Skirts + +< en: Clothes +en: Dresses + +< en: Clothes +en: Pull-Over + +en: Jewelry + en: Books de: Bücher es: Libros @@ -170,6 +249,16 @@ de: Videospiele es: Videojuegos fr: Jeux vidéo +en: DVDs + +en: Blue-Ray + +en: VHS + +en: CDs + +en: Music instruments + en: Paper pads de: Notizblöcke es: Blocs de notas From 94de6d0ffcd697b58634f97259ea7406094e4aca Mon Sep 17 00:00:00 2001 From: Pierre Slamich Date: Wed, 22 Jan 2025 11:35:42 +0100 Subject: [PATCH 08/18] feat: Add common cosmetic allegations (#11264) ### What - feat: Add common cosmetic allegations --------- Co-authored-by: Open Food Facts Bot --- taxonomies/beauty/labels.txt | 271 ++++++++++++++++++++++++++++++++++- 1 file changed, 269 insertions(+), 2 deletions(-) diff --git a/taxonomies/beauty/labels.txt b/taxonomies/beauty/labels.txt index 02bd716dacee7..a9348976b1efa 100644 --- a/taxonomies/beauty/labels.txt +++ b/taxonomies/beauty/labels.txt @@ -1,4 +1,4 @@ -stopwords:en:ingredients, from, with, of, by, the, verified, certified, approved, 100%, pure, product, guaranty, guaranteed, standard +stopwords:en: ingredients, from, with, of, by, the, verified, certified, approved, 100%, pure, product, guaranty, guaranteed, standard stopwords:fr: ingrédients, issus, de, l', convient, peut convenir, au, aux, régime, régimes, conforme, validé, vérifié, certifié, par, un, une, approuvé, 100%, pur, garantie, garanti, produit, sas stopwords:es: por, la, las, los, el, apto, para, certificado, controlado, registrado, 100% @@ -40,6 +40,82 @@ fr: 100% naturel nl: 100% natuurlijk nl_be: 100% natuurlijk +en: Without PEG +fr: Sans PEG + +en: Without PPD +fr: Sans PPD + +en: Without propellant gas +fr: Sans gaz propulseur + +en: Without butane +fr: Sans butane + +en: Without propane +fr: Sans propane + +en: Without camphor +fr: Sans camphre + +en: Without synthetic camphor +fr: Sans camphre synthetique + +en: Without rinsing +fr: sans rincage + +en: Without sodium laureth sulfate +fr: sans sodium-laureth-sulfate, sans sodium-lauryl-laureth-sulfate, sans sodium-laureth-sulfates + +en: Without titanium dioxide +fr: Sans dioxyde de titane + + +en: Without toluene +fr: Sans toluene + +en: Without methylisothiazolinone +fr: Sans methylisothiazolinone + +en: Without aluminum chlorohydrate +fr: Sans aluminium chlorohydrate + +en: Without cotton +fr: Sans Coton + +en: Without soda +fr: Sans soude + +en: Without sodium lauryl sulfates +fr: Sans sodium lauryl sulfates + +en: Without alkaline soap +fr: Sans savon alcalin + +en: Without soap +fr: Sans savon + +en: Without resorcinol +fr: Sans resorcine + +en: Without synthetic antiperspirant +fr: Sans anti transpirant synthetique + +en: Without picramic acid +fr: Sans acide picramique + +en: Without SLS SLES +fr: Sans SLS SLES + +en: Without metallic salts +fr: Sans sels metalliques + +en: Without peroxides +fr: Sans peroxydes, sans peroxyde, sans peroxide d'hydrogene + +en: Without chlorine bleaching +fr: Sans blanchissement au chlore + en: Carbon compensated product, carbon neutral fr: Produit compensé carbone, Carbone neutre, neutre en carbone, carbone compensé @@ -126,6 +202,22 @@ de: Ohne paraben, Parabenfrei es: Sin Parabenos fr: Sans paraben, Sans parabenes, 0 parabens, 0 paraben, Sans parabene, Sans parabens, Zero paraben nl: Zonder parabeen +pt: Sem parabenos, livre de parabenos + +en: Without paraffins +fr: Sans paraffines, sans paraffine + +en: Without EDTA, EDTA free, No EDTA +de: Ohne EDTA +es: Sin EDTA +fr: Sans EDTA +it: Senza EDTA +ja: EDTA不使用 +ko: EDTA 없음 +nl: Zonder EDTA +pt: Sem EDTA +zh-CN: 不含EDTA +zh-TW: 不含EDTA en: Organic de: Bio, Öko, Biologisch, Ökologisch, Kontrolliert biologisch, Kontrolliert ökologisch, biologische Landwirtschaft, ökologische Landwirtschaft, biologischer Landbau, ökologischer Landbau @@ -1238,6 +1330,12 @@ wikidata:en: Q748367 en: No animal derived ingredients fr: Pas de composant animal, Sans matière animale +en: Without animal fat +fr: Sans graisse animale, sans graisses animales + +en: Without bisphenol +fr: Sans bisphenol + en: PEFC, Pan European Forest Certification, Program for the Endorsement of Forest Certification, Program for the Endorsement of Forest Certification schemes fr: PEFC @@ -1338,8 +1436,15 @@ en: Nordic Ecolabel en: Hypoallergenic de: Hypoallergen +es: Hipoalergénico fr: Hypoallergénique +it: Ipoallergenico +ja: 低刺激性 +ko: 저자극성 nl: Hypoallergeen +pt: Hipoalergênico +zh-CN: 低过敏性 +zh-TW: 低過敏性 # already in food labels.txt # en: Green point @@ -1360,6 +1465,7 @@ nl: Neutrale pH-waarde voor de huid, neutrale pH-waarde, pH-waarde neutraal voor en: Dermatologically tested, Dermatologically approved, Tested by dermatologists, Dermo tested fr: Testé dermatologiquement, Testé dermatologiquemment, Testé sous controle dermatologique, Tolérance testée sous controle dermatologique, Tolerance-cutanee-testee-dermatologiquement, Tolerance-cutanee-testee-sous-controle-dermatologique, testée dermatologiquement, testées dermatologiquement, Approuvé dermatologiquement, dermato-testé +pt: Dermatologicamente testado en: Fully recyclable packaging de: Vollständig recycelbare Verpackung @@ -1374,7 +1480,16 @@ fr: Facilement inflammable nl: Makkelijk ontvlambaar en: Without phthalates, without phtalates, 0 phthalates +de: Ohne Phthalate +es: Sin ftalatos fr: Sans phtalates, Sans phtalate, 0 phtalate, zero phtalate +it: Senza ftalati +ja: フタル酸エステル不使用 +ko: 프탈레이트 없음 +nl: Zonder ftalaten +pt: Sem ftalatos +zh-CN: 不含邻苯二甲酸酯 +zh-TW: 不含鄰苯二甲酸酯 en: No colorings, without colorings, no colourings, without colourings, no colour, no color fr: Sans colorants, pas de colorants, 0 colorant, zero colorant @@ -1388,13 +1503,25 @@ en: Without soap, soap free de: Ohne Seife es: Sin jabón fr: Sans savon +it: Senza sapone +ja: 石鹸不使用 +ko: 비누 없음 nl: Zonder zeep +pt: Sem sabão +zh-CN: 不含皂 +zh-TW: 不含皂 en: Without perfume, no perfume, perfume free de: Ohne Parfüm es: Sin perfume fr: Sans parfum +it: Senza profumo +ja: 無香料 +ko: 향료 없음 nl: Zonder parfum +pt: Sem perfume +zh-CN: 无香精 +zh-TW: 無香精 en: Synthetic scent free, free from synthesis fragrance, synthesis fragrance free, free from synthetic fragrances, synthetic fragrances free de: Ohne synthetischen Duft, frei von synthetischen Duftstoffen, synthetische Duftstoffe frei @@ -1414,7 +1541,7 @@ es: Sin sales de aluminio fr: Sans sels d'aluminium nl: Zonder aluminiumzouten -en: Without silicon, Silicon free +en: Without silicon, Silicon free, Without silicone de: Ohne Silikon es: Sin silicona fr: Sans silicone, 0 silicones, Sans silicones @@ -1422,12 +1549,26 @@ it: Senza silicone nl: Zonder silicone pt: Sem silicone +fr: sans huile de silicone + en: Without acetone de: Ohne Aceton es: Sin acetona fr: Sans acétone nl: Zonder aceton +en: Condom compatible +de: Kondomfreundlich +es: Compatible con preservativos, Compatible con condones +fr: Compatible avec les preservatifs +it: Compatibile con i preservativi +ja: コンドームとの併用可 +ko: 콘돔과 함께 사용 가능 +nl: Condoomvriendelijk +pt: Compatível com preservativos +zh-CN: 可与避孕套一起使用 +zh-TW: 可與保險套一起使用 + # already in food labels.txt # fr: Sans alcool, Pas d'alcool # en: No alcohol, 0 alcohol, without alcohol, alcohol free @@ -1457,13 +1598,132 @@ en: Without ammonia de: Ohne Ammoniak es: Sin amoníaco fr: Sans ammoniaque +it: Senza ammoniaca +ja: アンモニアフリー +ko: 암모니아 없음 nl: Zonder ammoniak +pt: Sem amônia +zh-CN: 不含氨 + +en: Without ammonium +fr: Sans ammonium en: Without triclosan, Triclosan free, No triclosan de: Ohne Triclosan es: Sin triclosán fr: Sans triclosan +it: Senza triclosan +ja: トリクロサン不使用 +ko: 트리클로산 없음 nl: Zonder triclosan +pt: Sem triclosan +zh-CN: 不含三氯生 + +en: Without mineral oil, Mineral oil free, No mineral oil +de: Ohne Mineralöl +es: Sin aceite mineral +fr: Sans huile minérale +it: Senza olio minerale +ja: ミネラルオイル不使用 +ko: 미네랄 오일 없음 +nl: Zonder minerale olie +pt: Sem óleo mineral +zh-CN: 不含矿物油 +zh-TW: 不含礦物油 + +en: Without ingredients derived from petroleum +fr: Sans ingredients issus du pétrole, sans derive du pétrole + +en: Without microplastics, Microplastic free, No microplastics +de: Ohne Mikroplastik +es: Sin microplásticos +fr: Sans microplastiques +it: Senza microplastiche +ja: マイクロプラスチックフリー +ko: 미세 플라스틱 없음 +nl: Zonder microplastics +pt: Sem microplásticos +zh-CN: 不含微塑料 +zh-TW: 不含微塑膠 + +en: Without plastic microbeads +fr: sans-microbilles-de-plastique, sans-mirobilles-de-plastique, sans-micro-billes-de-plastique, formule-sans-microplastique + +en: Without binder +fr: Sans agent liant + +en: Ophthalmologically tested, Ophthalmologist tested +de: Augenärztlich getestet +es: Oftalmológicamente probado, Probado oftalmológicamente +fr: Testé ophtalmologiquement +it: Testato oftalmologicamente +ja: 眼科医によるテスト済み +ko: 안과 의사 테스트 완료 +nl: Oftalmologisch getest +pt: Testado oftalmologicamente +zh-CN: 经眼科医生测试 +zh-TW: 經眼科醫生測試 + +en: Tested under ophthalmological control +de: Unter augenärztlicher Kontrolle getestet +es: Testado bajo control oftalmológico +fr: Testé sous contrôle ophtalmologique +it: Testato sotto controllo oftalmologico +ja: 眼科医の管理下でテスト済み +ko: 안과 전문의의 관리하에 테스트됨 +nl: Getest onder oogheelkundige controle +pt: Testado sob controle oftalmológico +zh-CN: 经眼科医生监控测试 +zh-TW: 經眼科醫生監控測試 + +en: Tested under gynecological control +de: Unter gynäkologischer Kontrolle getestet +es: Testado bajo control ginecológico +it: Testato sotto controllo ginecologico +ja: 婦人科医の管理下でテスト済み +ko: 산부인과 전문의의 관리하에 테스트됨 +nl: Getest onder gynaecologische controle +pt: Testado sob controle ginecológico +zh-CN: 经妇科医生监控测试 +zh-TW: 經婦科醫生監控測試 + +en: Gynecologically tested +de: Gynäkologisch getestet +es: Ginecológicamente probado +it: Testato ginecologicamente +ja: 婦人科医によるテスト済み +ko: 산부인과 전문의 테스트 완료 +nl: Gynaecologisch getest +pt: Testado ginecologicamente +zh-CN: 经妇科医生测试 +zh-TW: 經婦科醫生測試 + +en: Clinically tested +de: Klinisch getestet +es: Clínicamente probado +fr: Testé cliniquement +it: Clinicamente testato +ja: 臨床的にテスト済み +ko: 임상적으로 테스트됨 +nl: Klinisch getest +pt: Testado clinicamente +zh-CN: 经临床测试 +zh-TW: 經臨床測試 + +en: Without essential oil +fr: Sans huile essentielle + +en: Without menthol +fr: Sans menthol + +en: Without mint +fr: Sans menthe + +en: Without lotion +fr: Sans lotion + +en: Without ionization +fr: Sans ionisation # already in food labels.txt # en:Palm oil free, Without palm oil, No palm oil @@ -1487,6 +1747,13 @@ nl: Prikt niet in de ogen, Geen tranen, Geen tranen formule fr: Non comédogène, Non obstruant les pores en: Non comedogenic, Non pore-clogging +de: Nicht komedogen, Nicht porenverstopfend +es: No comedogénico, No obstruye los poros +it: Non comedogenico, Non ostruisce i pori +ja: ノンコメドジェニック、毛穴を詰まらせない +ko: 논코메도제닉, 모공을 막지 않음 +pt: Nao comedogenico +zh-CN: 非致粉刺性,不堵塞毛孔 # already in food labels.txt # fr:Sans conservateurs, sans conservateur, 0 conservateur From 68360de5582f73cbd514693754f3ede83f404df6 Mon Sep 17 00:00:00 2001 From: Alex Garel Date: Wed, 22 Jan 2025 11:36:17 +0100 Subject: [PATCH 09/18] chore: fix nginx configuration (apache port and request time) (#11276) * fix apache_port regexp so that all cgi but search and facets goes to priority server * add request_time in access logging for simple perf assessments --- conf/nginx/conf.d/log_format_realip.conf | 3 ++- conf/nginx/sites-available/off | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/conf/nginx/conf.d/log_format_realip.conf b/conf/nginx/conf.d/log_format_realip.conf index 2127ae532971e..93a8869f159f8 100644 --- a/conf/nginx/conf.d/log_format_realip.conf +++ b/conf/nginx/conf.d/log_format_realip.conf @@ -1,6 +1,7 @@ # a log format for behing a proxy +# also adding time the request took log_format proxied_requests '$http_x_forwarded_for - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' - '"$http_referer" "$http_user_agent"'; + '"$http_referer" "$http_user_agent" $request_time'; diff --git a/conf/nginx/sites-available/off b/conf/nginx/sites-available/off index 42c70249b825e..92c001e634bbe 100644 --- a/conf/nginx/sites-available/off +++ b/conf/nginx/sites-available/off @@ -25,7 +25,7 @@ map $uri $apache_port { # product API read / write "~*^/api/v./product/" 8002; # whitelist most cgi (but display and search) - "~*^/cgi/(?!display|search).pl" 8002; + "~*^/cgi/(?!display\.pl|search\.pl)" 8002; } # variables definitions for expiry headers are loaded from /etc/nginx/conf.d/expires-no-json-xml.conf From a46c96732b6b1accc7e491100ef3720c4808b799 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Gigandet?= Date: Wed, 22 Jan 2025 12:12:48 +0100 Subject: [PATCH 10/18] feat: new import_images.pl script for pro platform (#11225) The import of images in the pro platform is currently tied to the import of product data: we import images only of they come with product data. Some producers can send us product photos in bulk, without sending product data at the same time. The new image_import.pl script is to load those photos. The script essentially uses existing code from Import.pm (which has been moved a bit in separate functions). --------- Co-authored-by: Pierre Slamich Co-authored-by: Alex Garel --- cgi/product_image_move.pl | 2 +- cgi/product_image_upload.pl | 2 +- cgi/product_multilingual.pl | 2 +- cgi/search.pl | 4 +- lib/ProductOpener/Import.pm | 547 +++++++++++++++++-------------- lib/ProductOpener/Products.pm | 22 +- scripts/check_photos.pl | 4 +- scripts/import_images.pl | 257 +++++++++++++++ scripts/import_systemeu.pl | 5 +- scripts/tag_stores_magasins_u.pl | 4 +- 10 files changed, 575 insertions(+), 274 deletions(-) create mode 100755 scripts/import_images.pl diff --git a/cgi/product_image_move.pl b/cgi/product_image_move.pl index 874d2a220495a..5701cd6792c7c 100644 --- a/cgi/product_image_move.pl +++ b/cgi/product_image_move.pl @@ -145,7 +145,7 @@ exit(0); } -my $product_ref = product_exists($product_id); # returns 0 if not +my $product_ref = retrieve_product($product_id); if (not $product_ref) { $log->warn("product does not exist", {code => $code, product_id => $product_id}); diff --git a/cgi/product_image_upload.pl b/cgi/product_image_upload.pl index c72fd42ae92ee..f768440a40b9b 100755 --- a/cgi/product_image_upload.pl +++ b/cgi/product_image_upload.pl @@ -197,7 +197,7 @@ exit(0); } - my $product_ref = product_exists($product_id); # returns 0 if not + my $product_ref = retrieve_product($product_id); if (not $product_ref) { $log->info("product code does not exist yet, creating product", {code => $code}); diff --git a/cgi/product_multilingual.pl b/cgi/product_multilingual.pl index d6d2c415c14da..cff15d02f51f4 100755 --- a/cgi/product_multilingual.pl +++ b/cgi/product_multilingual.pl @@ -251,7 +251,7 @@ ($product_ref) $product_id = product_id_for_owner($Owner_id, $code); $log->debug("we have a code", {code => $code, product_id => $product_id}) if $log->is_debug(); - $product_ref = product_exists($product_id); # returns 0 if not + $product_ref = retrieve_product($product_id); if ($product_ref) { $log->info("product exists, redirecting to page", {code => $code}) if $log->is_info(); diff --git a/cgi/search.pl b/cgi/search.pl index 0e78ce4f6de98..b8fc4059358a0 100755 --- a/cgi/search.pl +++ b/cgi/search.pl @@ -32,7 +32,7 @@ use ProductOpener::Display qw/:all/; use ProductOpener::HTTP qw/write_cors_headers/; use ProductOpener::Users qw/$Owner_id/; -use ProductOpener::Products qw/normalize_code normalize_search_terms product_exists product_id_for_owner product_url/; +use ProductOpener::Products qw/normalize_code normalize_search_terms retrieve_product product_id_for_owner product_url/; use ProductOpener::Food qw/%nutriments_lists/; use ProductOpener::Tags qw/:all/; use ProductOpener::PackagerCodes qw/normalize_packager_codes/; @@ -166,7 +166,7 @@ if ((defined $code) and (length($code) > 0)) { my $product_id = product_id_for_owner($Owner_id, $code); - my $product_ref = product_exists($product_id); # returns 0 if not + my $product_ref = retrieve_product($product_id); if ($product_ref) { $log->info("product code exists, redirecting to product page", {code => $code}); diff --git a/lib/ProductOpener/Import.pm b/lib/ProductOpener/Import.pm index 2661351570b82..dcd5c1d771f1e 100644 --- a/lib/ProductOpener/Import.pm +++ b/lib/ProductOpener/Import.pm @@ -71,6 +71,8 @@ BEGIN { &import_csv_file &import_products_categories_from_public_database + &list_product_images_files_in_dir + &upload_images_for_product ); # symbols to export on request %EXPORT_TAGS = (all => [@EXPORT_OK]); @@ -126,7 +128,27 @@ $IMPORT_MAX_PACKAGING_COMPONENTS = 10; # image_dir: path to image directory # stats: stats map # return -sub import_images_from_dir ($image_dir, $stats) { + +=head2 list_product_images_files_in_dir ($image_dir, $stats) + +List product images files in a directory. +The resulting list can be used by import_images_for_product() to upload the images. + +=head3 Arguments + +=head4 $image_dir Image directory + +=head4 $stats Stats reference + +=head3 Returns + +A reference to a hash of product codes with image types (front, ingredients, nutrition, other) with optional language codes as keys, +and image file names as values. + +=cut + +sub list_product_images_files_in_dir ($image_dir, $stats) { + my $images_ref = {}; if (not -d $image_dir) { @@ -239,6 +261,278 @@ sub import_images_from_dir ($image_dir, $stats) { return $images_ref; } +=head2 upload_images_for_product ($args_ref, $images_ref, $product_ref, $imported_product_ref, $product_id, $code, $user_id, $comment, $stats_ref) + +Given a list of images for a product with possible image types (front, ingredients, nutrition, other), +upload them to the server and select the image type. + +This function is called by import_csv_file() as CSV file can contain links to images, or we may have associated images in a directory +(loaded with list_product_images_files_in_dir()). + +It is is also called directly by the import_images.pl script, to upload images from a directory. + +=head3 Arguments + +=head4 $args_ref Import arguments reference + +=head4 $images_ref Images reference for the product + +=head4 $product_ref Product reference + +Only needed to get the "images" field, and "lc" field to determine the language of the product. + +=head4 $imported_product_ref Imported product reference: from a CSV file, may contain image coordinates + +=head4 $product_id Product ID + +=head4 $code Product code + +=head4 $user_id User ID used to upload and select the pictures + +=head4 $stats_ref Stats reference to keep track of the number of images added + +=cut + +sub upload_images_for_product($args_ref, $images_ref, $product_ref, $imported_product_ref, $product_id, $code, + $user_id, $comment, $stats_ref) +{ + + if ( (not $args_ref->{test}) + and (not((defined $args_ref->{do_not_upload_images}) and ($args_ref->{do_not_upload_images})))) + { + + $log->debug("uploading images for product", + {code => $code, images_ref => $images_ref, product_ref => $product_ref}) + if $log->is_debug(); + + # Keep track of the images we select so that we don't select multiple images for the same field + my %selected_images = (); + + foreach my $imagefield (sort keys %{$images_ref}) { + + $log->debug("uploading image for product", {imagefield => $imagefield, code => $code}) + if $log->is_debug(); + + # compute imgid for new image + my $current_max_imgid = -1; + + if (defined $product_ref->{images}) { + foreach my $imgid (keys %{$product_ref->{images}}) { + if (($imgid =~ /^\d/) and ($imgid > $current_max_imgid)) { + $current_max_imgid = $imgid; + } + } + } + + # if the language is not specified in column name, + # use the language of the product + + my $imagefield_with_lc = $imagefield; + + # we might have more than one column for image_other + # image_other_url.2 -> remove the number + $imagefield_with_lc =~ s/(\.|_)(\d+)$//; + + if ($imagefield_with_lc !~ /_\w\w/) { + $imagefield_with_lc .= "_" . $product_ref->{lc}; + } + + # upload the image + my $file = $images_ref->{$imagefield}; + + # Skip PDF file, as we have issues to convert them, and they are sometimes not images about the product + # but multi-pages product sheets, certificates etc. + if ($file =~ /\.pdf$/) { + $log->debug("skipping PDF file", {file => $file, imagefield => $imagefield, code => $code}) + if $log->is_debug(); + } + elsif (-e "$file") { + $log->debug("found image file", {file => $file, imagefield => $imagefield, code => $code}) + if $log->is_debug(); + + # upload a photo + my $imgid; + my $debug; + my $return_code + = process_image_upload($product_id, "$file", $user_id, undef, $comment, \$imgid, \$debug); + $log->debug( + "process_image_upload", + { + file => $file, + imagefield => $imagefield, + code => $code, + return_code => $return_code, + imgid => $imgid, + imagefield_with_lc => $imagefield_with_lc, + debug => $debug + } + ) if $log->is_debug(); + + if (($imgid > 0) and ($imgid > $current_max_imgid)) { + $stats_ref->{products_images_added}{$code} = 1; + } + + my $x1 = $imported_product_ref->{"image_" . $imagefield . "_x1"} || -1; + my $y1 = $imported_product_ref->{"image_" . $imagefield . "_y1"} || -1; + my $x2 = $imported_product_ref->{"image_" . $imagefield . "_x2"} || -1; + my $y2 = $imported_product_ref->{"image_" . $imagefield . "_y2"} || -1; + my $coordinates_image_size + = $imported_product_ref->{"image_" . $imagefield . "_coordinates_image_size"} || $crop_size; + my $angle = $imported_product_ref->{"image_" . $imagefield . "_angle"} || 0; + my $normalize = $imported_product_ref->{"image_" . $imagefield . "_normalize"} || "false"; + my $white_magic = $imported_product_ref->{"image_" . $imagefield . "_white_magic"} || "false"; + + $log->debug( + "select and crop image?", + { + code => $code, + imgid => $imgid, + current_max_imgid => $current_max_imgid, + imagefield_with_lc => $imagefield_with_lc, + x1 => $x1, + y1 => $y1, + x2 => $x2, + y2 => $y2, + angle => $angle, + normalize => $normalize, + white_magic => $white_magic + } + ) if $log->is_debug(); + + # select the photo + if ( + ($imagefield_with_lc =~ /front|ingredients|nutrition|packaging/) + and ( + ( + not( (defined $args_ref->{only_select_not_existing_images}) + and ($args_ref->{only_select_not_existing_images})) + ) + or ( (not defined $product_ref->{images}) + or (not defined $product_ref->{images}{$imagefield_with_lc})) + ) + ) + { + + if (($imgid > 0) and ($imgid > $current_max_imgid)) { + + $log->debug( + "assigning image imgid to imagefield_with_lc", + { + code => $code, + current_max_imgid => $current_max_imgid, + imgid => $imgid, + imagefield_with_lc => $imagefield_with_lc, + x1 => $x1, + y1 => $y1, + x2 => $x2, + y2 => $y2, + angle => $angle, + normalize => $normalize, + white_magic => $white_magic + } + ) if $log->is_debug(); + $selected_images{$imagefield_with_lc} = 1; + eval { + process_image_crop($user_id, $product_id, $imagefield_with_lc, $imgid, $angle, + $normalize, $white_magic, $x1, $y1, $x2, $y2, $coordinates_image_size); + }; + } + else { + $log->debug("returned imgid $imgid not greater than the previous max imgid: $current_max_imgid", + {imgid => $imgid, current_max_imgid => $current_max_imgid}) + if $log->is_debug(); + + # overwrite already selected images + # if the selected image is not the same + # or if we have non null crop coordinates that differ + if ( + ($imgid > 0) + and (exists $product_ref->{images}) + and ( + (not exists $product_ref->{images}{$imagefield_with_lc}) + or ( + ( + ($product_ref->{images}{$imagefield_with_lc}{imgid} != $imgid) + or ( ($x1 > 1) + and ($product_ref->{images}{$imagefield_with_lc}{x1} != $x1)) + or ( ($x2 > 1) + and ($product_ref->{images}{$imagefield_with_lc}{x2} != $x2)) + or ( ($y1 > 1) + and ($product_ref->{images}{$imagefield_with_lc}{y1} != $y1)) + or ( ($y2 > 1) + and ($product_ref->{images}{$imagefield_with_lc}{y2} != $y2)) + or ($product_ref->{images}{$imagefield_with_lc}{angle} != $angle) + ) + ) + ) + ) + { + $log->debug( + "re-assigning image imgid to imagefield_with_lc", + { + code => $code, + imgid => $imgid, + imagefield_with_lc => $imagefield_with_lc, + x1 => $x1, + y1 => $y1, + x2 => $x2, + y2 => $y2, + coordinates_image_size => $coordinates_image_size, + angle => $angle, + normalize => $normalize, + white_magic => $white_magic + } + ) if $log->is_debug(); + $selected_images{$imagefield_with_lc} = 1; + eval { + process_image_crop($user_id, $product_id, $imagefield_with_lc, $imgid, $angle, + $normalize, $white_magic, $x1, $y1, $x2, $y2, $coordinates_image_size); + }; + } + } + } + # If the image type is "other" and we don't have a front image, assign it + # This is in particular for producers that send us many images without specifying their type: assume the first one is the front + elsif ( ($imgid > 0) + and ($imagefield_with_lc =~ /^other/) + and (not defined $product_ref->{images}{"front_" . $product_ref->{lc}}) + and (not defined $selected_images{"front_" . $product_ref->{lc}})) + { + $log->debug( + "selecting front image as we don't have one", + { + imgid => $imgid, + imagefield => $imagefield, + front_imagefield => "front_" . $product_ref->{lc}, + x1 => $x1, + y1 => $y1, + x2 => $x2, + y2 => $y2, + coordinates_image_size => $coordinates_image_size, + angle => $angle, + normalize => $normalize, + white_magic => $white_magic + } + ) if $log->is_debug(); + # Keep track that we have selected an image, so that we don't select another one after, + # as we don't reload the product_ref after calling process_image_crop() + $selected_images{"front_" . $product_ref->{lc}} = 1; + eval { + process_image_crop($user_id, $product_id, "front_" . $product_ref->{lc}, + $imgid, $angle, $normalize, $white_magic, $x1, $y1, $x2, $y2, $coordinates_image_size); + }; + } + } + else { + $log->debug("did not find image file", {file => $file, imagefield => $imagefield, code => $code}) + if $log->is_debug(); + } + } + } + + return; +} + # download image at given url parameter sub download_image ($image_url) { @@ -1433,7 +1727,7 @@ sub import_csv_file ($args_ref) { # Read images from directory if supplied my $images_ref = {}; if ((defined $args_ref->{images_dir}) and ($args_ref->{images_dir} ne '')) { - $images_ref = import_images_from_dir($args_ref->{images_dir}, $stats_ref); + $images_ref = list_product_images_files_in_dir($args_ref->{images_dir}, $stats_ref); } $log->debug("importing products", {csv_file => $args_ref->{csv_file}}) if $log->is_debug(); @@ -1877,7 +2171,7 @@ sub import_csv_file ($args_ref) { } # TODO: check what happens if the product exists with a different product type than the current server - my $product_ref = product_exists($product_id); # returns 0 if not + my $product_ref = retrieve_product($product_id); my $product_comment = $args_ref->{comment}; if ((defined $imported_product_ref->{comment}) and ($imported_product_ref->{comment} ne "")) { @@ -1893,9 +2187,9 @@ sub import_csv_file ($args_ref) { $skip_not_existing++; next; } + else { + $new++; - $new++; - if (1 and (not $product_ref)) { $log->debug("creating not existing product", {code => $code, product_id => $product_id}) if $log->is_debug(); @@ -2496,246 +2790,11 @@ sub import_csv_file ($args_ref) { # Upload images if (defined $images_ref->{$code}) { - $stats_ref->{products_with_images}{$code} = 1; - - if ( (not $args_ref->{test}) - and (not((defined $args_ref->{do_not_upload_images}) and ($args_ref->{do_not_upload_images})))) - { - - $log->debug("uploading images for product", {code => $code}) if $log->is_debug(); - - my $images_ref = $images_ref->{$code}; - - # Keep track of the images we select so that we don't select multiple images for the same field - my %selected_images = (); - - foreach my $imagefield (sort keys %{$images_ref}) { - - $log->debug("uploading image for product", {imagefield => $imagefield, code => $code}) - if $log->is_debug(); - - my $current_max_imgid = -1; - - if (defined $product_ref->{images}) { - foreach my $imgid (keys %{$product_ref->{images}}) { - if (($imgid =~ /^\d/) and ($imgid > $current_max_imgid)) { - $current_max_imgid = $imgid; - } - } - } - - # if the language is not specified, assign it to the language of the product - - my $imagefield_with_lc = $imagefield; - - # image_other_url.2 -> remove the number - $imagefield_with_lc =~ s/(\.|_)(\d+)$//; - - if ($imagefield_with_lc !~ /_\w\w/) { - $imagefield_with_lc .= "_" . $product_ref->{lc}; - } - - # upload the image - my $file = $images_ref->{$imagefield}; - - # Skip PDF file has we have issues to convert them, and they are sometimes not images about the product - # but multi-pages product sheets, certificates etc. - if ($file =~ /\.pdf$/) { - $log->debug("skipping PDF file", {file => $file, imagefield => $imagefield, code => $code}) - if $log->is_debug(); - } - elsif (-e "$file") { - $log->debug("found image file", {file => $file, imagefield => $imagefield, code => $code}) - if $log->is_debug(); - - # upload a photo - my $imgid; - my $debug; - my $return_code - = process_image_upload($product_id, "$file", $user_id, undef, $product_comment, \$imgid, - \$debug); - $log->debug( - "process_image_upload", - { - file => $file, - imagefield => $imagefield, - code => $code, - return_code => $return_code, - imgid => $imgid, - imagefield_with_lc => $imagefield_with_lc, - debug => $debug - } - ) if $log->is_debug(); - - if (($imgid > 0) and ($imgid > $current_max_imgid)) { - $stats_ref->{products_images_added}{$code} = 1; - } - - my $x1 = $imported_product_ref->{"image_" . $imagefield . "_x1"} || -1; - my $y1 = $imported_product_ref->{"image_" . $imagefield . "_y1"} || -1; - my $x2 = $imported_product_ref->{"image_" . $imagefield . "_x2"} || -1; - my $y2 = $imported_product_ref->{"image_" . $imagefield . "_y2"} || -1; - my $coordinates_image_size - = $imported_product_ref->{"image_" . $imagefield . "_coordinates_image_size"} || $crop_size; - my $angle = $imported_product_ref->{"image_" . $imagefield . "_angle"} || 0; - my $normalize = $imported_product_ref->{"image_" . $imagefield . "_normalize"} || "false"; - my $white_magic = $imported_product_ref->{"image_" . $imagefield . "_white_magic"} || "false"; - - $log->debug( - "select and crop image?", - { - code => $code, - imgid => $imgid, - current_max_imgid => $current_max_imgid, - imagefield_with_lc => $imagefield_with_lc, - x1 => $x1, - y1 => $y1, - x2 => $x2, - y2 => $y2, - angle => $angle, - normalize => $normalize, - white_magic => $white_magic - } - ) if $log->is_debug(); - - # select the photo - if ( - ($imagefield_with_lc =~ /front|ingredients|nutrition|packaging/) - and ( - ( - not( (defined $args_ref->{only_select_not_existing_images}) - and ($args_ref->{only_select_not_existing_images})) - ) - or ( (not defined $product_ref->{images}) - or (not defined $product_ref->{images}{$imagefield_with_lc})) - ) - ) - { - - if (($imgid > 0) and ($imgid > $current_max_imgid)) { - - $log->debug( - "assigning image imgid to imagefield_with_lc", - { - code => $code, - current_max_imgid => $current_max_imgid, - imgid => $imgid, - imagefield_with_lc => $imagefield_with_lc, - x1 => $x1, - y1 => $y1, - x2 => $x2, - y2 => $y2, - angle => $angle, - normalize => $normalize, - white_magic => $white_magic - } - ) if $log->is_debug(); - $selected_images{$imagefield_with_lc} = 1; - eval { - process_image_crop($user_id, $product_id, $imagefield_with_lc, $imgid, $angle, - $normalize, $white_magic, $x1, $y1, $x2, $y2, $coordinates_image_size); - }; - # $modified++; - - } - else { - $log->debug( - "returned imgid $imgid not greater than the previous max imgid: $current_max_imgid", - {imgid => $imgid, current_max_imgid => $current_max_imgid} - ) if $log->is_debug(); - - # overwrite already selected images - # if the selected image is not the same - # or if we have non null crop coordinates that differ - if ( - ($imgid > 0) - and (exists $product_ref->{images}) - and ( - (not exists $product_ref->{images}{$imagefield_with_lc}) - or ( - ( - ($product_ref->{images}{$imagefield_with_lc}{imgid} != $imgid) - or ( ($x1 > 1) - and ($product_ref->{images}{$imagefield_with_lc}{x1} != $x1)) - or ( ($x2 > 1) - and ($product_ref->{images}{$imagefield_with_lc}{x2} != $x2)) - or ( ($y1 > 1) - and ($product_ref->{images}{$imagefield_with_lc}{y1} != $y1)) - or ( ($y2 > 1) - and ($product_ref->{images}{$imagefield_with_lc}{y2} != $y2)) - or ($product_ref->{images}{$imagefield_with_lc}{angle} != $angle) - ) - ) - ) - ) - { - $log->debug( - "re-assigning image imgid to imagefield_with_lc", - { - code => $code, - imgid => $imgid, - imagefield_with_lc => $imagefield_with_lc, - x1 => $x1, - y1 => $y1, - x2 => $x2, - y2 => $y2, - coordinates_image_size => $coordinates_image_size, - angle => $angle, - normalize => $normalize, - white_magic => $white_magic - } - ) if $log->is_debug(); - $selected_images{$imagefield_with_lc} = 1; - eval { - process_image_crop($user_id, $product_id, $imagefield_with_lc, $imgid, $angle, - $normalize, $white_magic, $x1, $y1, $x2, $y2, $coordinates_image_size); - }; - # $modified++; - } - - } - } - # If the image type is "other" and we don't have a front image, assign it - # This is in particular for producers that send us many images without specifying their type: assume the first one is the front - elsif ( ($imgid > 0) - and ($imagefield_with_lc =~ /^other/) - and (not defined $product_ref->{images}{"front_" . $product_ref->{lc}}) - and (not defined $selected_images{"front_" . $product_ref->{lc}})) - { - $log->debug( - "selecting front image as we don't have one", - { - imgid => $imgid, - imagefield => $imagefield, - front_imagefield => "front_" . $product_ref->{lc}, - x1 => $x1, - y1 => $y1, - x2 => $x2, - y2 => $y2, - coordinates_image_size => $coordinates_image_size, - angle => $angle, - normalize => $normalize, - white_magic => $white_magic - } - ) if $log->is_debug(); - # Keep track that we have selected an image, so that we don't select another one after, - # as we don't reload the product_ref after calling process_image_crop() - $selected_images{"front_" . $product_ref->{lc}} = 1; - eval { - process_image_crop($user_id, $product_id, "front_" . $product_ref->{lc}, - $imgid, $angle, $normalize, $white_magic, $x1, $y1, $x2, $y2, - $coordinates_image_size); - }; - } - } - else { - $log->debug("did not find image file", - {file => $file, imagefield => $imagefield, code => $code}) - if $log->is_debug(); - } - } - } + upload_images_for_product( + $args_ref, $images_ref->{$code}, $product_ref, $imported_product_ref, $product_id, + $code, $user_id, $product_comment, $stats_ref + ); } else { $log->debug("no images for product", {code => $code}) if $log->is_debug(); diff --git a/lib/ProductOpener/Products.pm b/lib/ProductOpener/Products.pm index 95ba9f34c6be9..5044332652e5f 100644 --- a/lib/ProductOpener/Products.pm +++ b/lib/ProductOpener/Products.pm @@ -76,7 +76,6 @@ BEGIN { &product_path &product_path_from_id &product_id_from_path - &product_exists &get_owner_id &normalize_product_data &init_product @@ -716,20 +715,6 @@ sub product_id_from_path ($product_path) { return $id; } -sub product_exists ($product_id) { - - # deprecated, just use retrieve_product() - - my $product_ref = retrieve_product($product_id); - - if (not defined $product_ref) { - return 0; - } - else { - return $product_ref; - } -} - sub get_owner_id ($userid, $orgid, $ownerid) { if ($server_options{private_products}) { @@ -2909,12 +2894,13 @@ sub compute_codes ($product_ref) { my $ean = undef; + # Note: we now normalize codes, so we should not have conflicts if (length($code) == 12) { $ean = '0' . $code; - if (product_exists('0' . $code)) { + if (retrieve_product('0' . $code)) { push @codes, "conflict-with-ean-13"; } - elsif (-e ("$BASE_DIRS{PRODUCTS}/" . product_path_from_id("0" . $code))) { + elsif (retrieve_product('0' . $code), 1) { push @codes, "conflict-with-deleted-ean-13"; } } @@ -2923,7 +2909,7 @@ sub compute_codes ($product_ref) { $ean = $code; my $upc = $code; $upc =~ s/^.//; - if (product_exists($upc)) { + if (retrieve_product($upc)) { push @codes, "conflict-with-upc-12"; } } diff --git a/scripts/check_photos.pl b/scripts/check_photos.pl index 88c3d61fc10b1..f66e4de2b5d61 100755 --- a/scripts/check_photos.pl +++ b/scripts/check_photos.pl @@ -34,7 +34,7 @@ use ProductOpener::Images qw/scan_code/; use ProductOpener::Lang qw/:all/; use ProductOpener::Mail qw/:all/; -use ProductOpener::Products qw/product_exists/; +use ProductOpener::Products qw/retrieve_product/; use ProductOpener::Food qw/:all/; use ProductOpener::Ingredients qw/:all/; use ProductOpener::Images qw/:all/; @@ -88,7 +88,7 @@ $j++; - my $product_ref = product_exists($code); + my $product_ref = retrieve_product($code); if ($product_ref) { $exists++; print "code $code exists\n"; diff --git a/scripts/import_images.pl b/scripts/import_images.pl new file mode 100755 index 0000000000000..fe7ee93b23324 --- /dev/null +++ b/scripts/import_images.pl @@ -0,0 +1,257 @@ +#!/usr/bin/perl -w + +# This file is part of Product Opener. +# +# Product Opener +# Copyright (C) 2011-2023 Association Open Food Facts +# Contact: contact@openfoodfacts.org +# Address: 21 rue des Iles, 94100 Saint-Maur des Fossés, France +# +# Product Opener is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +use ProductOpener::PerlStandards; + +use Log::Any qw($log); + +use ProductOpener::Config qw/:all/; +use ProductOpener::Paths qw/%BASE_DIRS/; +use ProductOpener::Store qw/:all/; +use ProductOpener::Index qw/:all/; +use ProductOpener::Display qw/:all/; +use ProductOpener::Tags qw/:all/; +use ProductOpener::Images qw/:all/; +use ProductOpener::Lang qw/:all/; +use ProductOpener::Mail qw/send_email_to_producers_admin/; +use ProductOpener::Products qw/:all/; +use ProductOpener::Users qw/:all/; +use ProductOpener::Import qw/list_product_images_files_in_dir upload_images_for_product/; +use ProductOpener::LoadData qw/load_data/; + +use Storable qw/dclone/; +use Encode; +use Time::Local; +use Data::Dumper; +use Getopt::Long; + +use Log::Any::Adapter 'TAP', filter => "none"; + +my $usage = < \$import_lc, + "csv_file=s" => \$csv_file, + "images_dir=s" => \$images_dir, + "user_id=s" => \$user_id, + "org_id=s" => \$org_id, + "owner_id=s" => \$owner_id, + "comment=s" => \$comment, + "source_id=s" => \$source_id, + "source_name=s" => \$source_name, + "source_url=s" => \$source_url, + "source_licence=s" => \$source_licence, + "source_licence_url=s" => \$source_licence_url, + "test" => \$test, + "manufacturer" => \$manufacturer, + "no_source" => \$no_source, +) or die("Error in command line arguments:\n\n$usage"); + +print STDERR "import_csv_file.pl +- import_lc: $import_lc +- user_id: $user_id +- org_id: $org_id +- owner_id: $owner_id +- images_dir: $images_dir +- comment: $comment +- source_id: $source_id +- source_name: $source_name +- source_url: $source_url +- source_licence: $source_licence +- source_licence_url: $source_licence_url +- manufacturer: $manufacturer +- testing: $test +"; + +my $missing_arg = 0; + +if (not defined $import_lc) { + print STDERR "missing --import_lc parameter\n"; + $missing_arg++; +} + +if (not defined $images_dir) { + print STDERR "missing --images_dir parameter\n"; + $missing_arg++; +} + +if (not defined $user_id) { + print STDERR "missing --user_id parameter\n"; + $missing_arg++; +} + +if (not $no_source) { + + if (not defined $source_id) { + print STDERR "missing --source_id parameter\n"; + $missing_arg++; + } + + if (not defined $source_name) { + print STDERR "missing --source_name parameter\n"; + $missing_arg++; + } + + if (not defined $source_url) { + print STDERR "missing --source_url parameter\n"; + $missing_arg++; + } +} + +$missing_arg and exit(); + +load_data(); + +my $args_ref = { + user_id => $user_id, + org_id => $org_id, + owner_id => $owner_id, + global_values => {lc => $import_lc}, + images_dir => $images_dir, + comment => $comment, + source_id => $source_id, + source_name => $source_name, + source_url => $source_url, + source_licence => $source_licence, + source_licence_url => $source_licence_url, + test => $test, + manufacturer => $manufacturer, + no_source => $no_source, +}; + +$Org_id = $org_id; +$Owner_id = get_owner_id($User_id, $Org_id, $args_ref->{owner_id}); + +my $stats_ref = { + products_created => {}, + products_with_images => {}, +}; + +my $images_ref = list_product_images_files_in_dir($args_ref->{images_dir}, $stats_ref); + +foreach my $code (sort keys %{$images_ref}) { + + print STDERR "code: $code\n"; + + my $product_id = product_id_for_owner($Owner_id, $code); + + my $product_ref = retrieve_product($product_id); + + if (not defined $product_ref) { + $stats_ref->{products_created}{$code} = 1; + + $product_ref = init_product($user_id, $org_id, $code, undef); + $product_ref->{lc} = $import_lc; + $product_ref->{lang} = $import_lc; + + delete $product_ref->{countries}; + delete $product_ref->{countries_tags}; + delete $product_ref->{countries_hierarchy}; + + store_product($user_id, $product_ref, "Creating product (import_images) - " . ($comment || "")); + } + + # Upload images + + $stats_ref->{products_with_images}{$code} = 1; + upload_images_for_product($args_ref, $images_ref->{$code}, $product_ref, {}, $product_id, $code, $user_id, + "Adding photo (import_images) - " . ($comment || ""), $stats_ref); +} + +print STDERR "\n\nstats:\n\n"; + +foreach my $stat (sort keys %{$stats_ref}) { + + print STDERR $stat . "\t" . (scalar keys %{$stats_ref->{$stat}}) . "\n"; + + open(my $out, ">", "$BASE_DIRS{CACHE_TMP}/import_images.$stat.txt") + or print "Could not create import_images.$stat.txt : $!\n"; + + foreach my $code (sort keys %{$stats_ref->{$stat}}) { + print $out $code . "\n"; + } + close($out); +} + +# Send an e-mail notification to admins + +my $template_data_ref = { + args => $args_ref, + stats => $stats_ref, +}; + +my $mail = ''; +process_template("emails/import_csv_file_admin_notification.tt.html", $template_data_ref, \$mail) + or print STDERR "emails/import_csv_file_admin_notification.tt.html template error: " . $tt->error(); +if ($mail =~ /^\s*Subject:\s*(.*)\n/i) { + my $subject = $1; + my $body = $'; + $body =~ s/^\n+//; + + send_email_to_producers_admin($subject, $body); + + print "email subject: $subject\n\n"; + print "email body:\n$body\n\n"; +} + +if ($stats_ref->{error}) { + print STDERR "An error occured: " . $stats_ref->{error}{error} . "\n"; + exit(1); +} diff --git a/scripts/import_systemeu.pl b/scripts/import_systemeu.pl index 810254f9531ad..89aebb6b9c626 100755 --- a/scripts/import_systemeu.pl +++ b/scripts/import_systemeu.pl @@ -36,8 +36,7 @@ use ProductOpener::Images qw/process_image_crop process_image_upload/; use ProductOpener::Lang qw/$lc lang/; use ProductOpener::Mail qw/:all/; -use ProductOpener::Products - qw/analyze_and_enrich_product_data init_product product_exists retrieve_product store_product/; +use ProductOpener::Products qw/analyze_and_enrich_product_data init_product retrieve_product store_product/; use ProductOpener::Food qw/:all/; use ProductOpener::Units qw/unit_to_g/; use ProductOpener::Ingredients qw/:all/; @@ -459,7 +458,7 @@ print "product $i - code: $code\n"; - my $product_ref = product_exists("org-systeme-u/" . $code); # returns 0 if not + my $product_ref = retrieve_product("org-systeme-u/" . $code); # returns 0 if not if (not $product_ref) { print "- does not exist in OFF yet\n"; diff --git a/scripts/tag_stores_magasins_u.pl b/scripts/tag_stores_magasins_u.pl index 965993292cb96..cc85a1604f9c9 100755 --- a/scripts/tag_stores_magasins_u.pl +++ b/scripts/tag_stores_magasins_u.pl @@ -36,7 +36,7 @@ use ProductOpener::Images qw/:all/; use ProductOpener::Lang qw/$lc/; use ProductOpener::Mail qw/:all/; -use ProductOpener::Products qw/product_exists store_product/; +use ProductOpener::Products qw/retrieve_product store_product/; use ProductOpener::Food qw/:all/; use ProductOpener::Ingredients qw/:all/; use ProductOpener::Images qw/:all/; @@ -140,7 +140,7 @@ print "PRODUCT LINE NUMBER $i - CODE $code"; - my $product_ref = product_exists($code); # returns 0 if not + my $product_ref = retrieve_product($code); # returns 0 if not if (not $product_ref) { print "- does not exist in OFF yet\n"; From 75a873b53acbe8c9bd1de3ebdbcfed9c5fa1a115 Mon Sep 17 00:00:00 2001 From: Alex Garel Date: Wed, 22 Jan 2025 15:19:36 +0100 Subject: [PATCH 11/18] fix: link of nutri-score knowledge panel on pro platform (#11272) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fixes: #11242 --------- Co-authored-by: Stéphane Gigandet --- lib/ProductOpener/Display.pm | 7 +++++++ .../health/nutriscore/nutriscore_new_computation.tt.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/ProductOpener/Display.pm b/lib/ProductOpener/Display.pm index 8c9d506abc3af..a9c8ff7ca395e 100644 --- a/lib/ProductOpener/Display.pm +++ b/lib/ProductOpener/Display.pm @@ -114,6 +114,7 @@ BEGIN { $images_subdomain $static_subdomain $producers_platform_url + $public_platform_url $test @lcs $country @@ -345,6 +346,7 @@ sub process_template ($template_filename, $template_data_ref, $result_content_re $template_data_ref->{server_options_private_products} = $server_options{private_products}; $template_data_ref->{server_options_producers_platform} = $server_options{producers_platform}; $template_data_ref->{producers_platform_url} = $producers_platform_url; + $template_data_ref->{public_platform_url} = $public_platform_url; $template_data_ref->{server_domain} = $server_domain; $template_data_ref->{static_subdomain} = $static_subdomain; $template_data_ref->{images_subdomain} = $images_subdomain; @@ -907,11 +909,16 @@ CSS # call format_subdomain($subdomain) only once $formatted_subdomain = format_subdomain($subdomain); $producers_platform_url = $formatted_subdomain . '/'; + $public_platform_url = $formatted_subdomain . '/'; # If we are not already on the producers platform: add .pro if ($producers_platform_url !~ /\.pro\.open/) { $producers_platform_url =~ s/\.open/\.pro\.open/; } + # and the contrary for public platform + if ($public_platform_url =~ /\.pro\.open/) { + $public_platform_url =~ s/\.pro\.open/\.open/; + } # Enable or disable user food preferences: used to compute attributes and to display # personalized product scores and search results diff --git a/templates/api/knowledge-panels/health/nutriscore/nutriscore_new_computation.tt.json b/templates/api/knowledge-panels/health/nutriscore/nutriscore_new_computation.tt.json index 969c1468d988a..4bce6cc1c7925 100644 --- a/templates/api/knowledge-panels/health/nutriscore/nutriscore_new_computation.tt.json +++ b/templates/api/knowledge-panels/health/nutriscore/nutriscore_new_computation.tt.json @@ -25,7 +25,7 @@ // Display the link to the new Nutri-Score computation page // on mobile: keep the /nutriscore-v2 link until the app can handle the new URLs "html": ` -

[% lang('nutriscore_new_computation_link_text') %]

+

[% lang('nutriscore_new_computation_link_text') %]

` }, }, From bb5a2098544cb54d325b7024fd2877b734d2e4ba Mon Sep 17 00:00:00 2001 From: Alex Garel Date: Wed, 22 Jan 2025 15:37:22 +0100 Subject: [PATCH 12/18] chore: add more api requests into priority apache (#11278) So that contribution is fast again --- conf/nginx/sites-available/off | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/nginx/sites-available/off b/conf/nginx/sites-available/off index 92c001e634bbe..d6d1b0a0d5008 100644 --- a/conf/nginx/sites-available/off +++ b/conf/nginx/sites-available/off @@ -26,6 +26,8 @@ map $uri $apache_port { "~*^/api/v./product/" 8002; # whitelist most cgi (but display and search) "~*^/cgi/(?!display\.pl|search\.pl)" 8002; + # whitelist most api (but search) + "~*^/api/v./(?!search\b)" 8002; } # variables definitions for expiry headers are loaded from /etc/nginx/conf.d/expires-no-json-xml.conf From bd34aa9fe0a1c910c0d38e0218e6a5bea5842e50 Mon Sep 17 00:00:00 2001 From: Open Food Facts Bot <119524357+openfoodfacts-bot@users.noreply.github.com> Date: Wed, 22 Jan 2025 15:56:18 +0100 Subject: [PATCH 13/18] chore(main): release 2.56.0 (#11256) :robot: I have created a release *beep* *boop* --- ## [2.56.0](https://github.com/openfoodfacts/openfoodfacts-server/compare/v2.55.0...v2.56.0) (2025-01-22) ### Features * add common categories found on re-commerce websites ([#11263](https://github.com/openfoodfacts/openfoodfacts-server/issues/11263)) ([8f54f80](https://github.com/openfoodfacts/openfoodfacts-server/commit/8f54f808ce708f619259ae2d4028d38c713e8041)) * Add common cosmetic allegations ([#11264](https://github.com/openfoodfacts/openfoodfacts-server/issues/11264)) ([94de6d0](https://github.com/openfoodfacts/openfoodfacts-server/commit/94de6d0ffcd697b58634f97259ea7406094e4aca)) * add link on pro platform to see nutriscore evolution [#11246](https://github.com/openfoodfacts/openfoodfacts-server/issues/11246) ([#11247](https://github.com/openfoodfacts/openfoodfacts-server/issues/11247)) ([c0518c1](https://github.com/openfoodfacts/openfoodfacts-server/commit/c0518c16562ca4b1ee92b458effed749fe3b654d)) * new import_images.pl script for pro platform ([#11225](https://github.com/openfoodfacts/openfoodfacts-server/issues/11225)) ([a46c967](https://github.com/openfoodfacts/openfoodfacts-server/commit/a46c96732b6b1accc7e491100ef3720c4808b799)) * Update the tagline to force the app upgrade ([#11262](https://github.com/openfoodfacts/openfoodfacts-server/issues/11262)) ([f685cb0](https://github.com/openfoodfacts/openfoodfacts-server/commit/f685cb019e67b0dabc049cb2a405ef0461cda0e3)) ### Bug Fixes * Add more german stopwords ([#11266](https://github.com/openfoodfacts/openfoodfacts-server/issues/11266)) ([4e45a34](https://github.com/openfoodfacts/openfoodfacts-server/commit/4e45a34d4cacae39d13deca68bff72c1035a05d7)) * link of nutri-score knowledge panel on pro platform ([#11272](https://github.com/openfoodfacts/openfoodfacts-server/issues/11272)) ([75a873b](https://github.com/openfoodfacts/openfoodfacts-server/commit/75a873b53acbe8c9bd1de3ebdbcfed9c5fa1a115)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- CHANGELOG.md | 17 +++++++++++++++++ version.txt | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9599907d28b94..b14de68f5f938 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ # Changelog +## [2.56.0](https://github.com/openfoodfacts/openfoodfacts-server/compare/v2.55.0...v2.56.0) (2025-01-22) + + +### Features + +* add common categories found on re-commerce websites ([#11263](https://github.com/openfoodfacts/openfoodfacts-server/issues/11263)) ([8f54f80](https://github.com/openfoodfacts/openfoodfacts-server/commit/8f54f808ce708f619259ae2d4028d38c713e8041)) +* Add common cosmetic allegations ([#11264](https://github.com/openfoodfacts/openfoodfacts-server/issues/11264)) ([94de6d0](https://github.com/openfoodfacts/openfoodfacts-server/commit/94de6d0ffcd697b58634f97259ea7406094e4aca)) +* add link on pro platform to see nutriscore evolution [#11246](https://github.com/openfoodfacts/openfoodfacts-server/issues/11246) ([#11247](https://github.com/openfoodfacts/openfoodfacts-server/issues/11247)) ([c0518c1](https://github.com/openfoodfacts/openfoodfacts-server/commit/c0518c16562ca4b1ee92b458effed749fe3b654d)) +* new import_images.pl script for pro platform ([#11225](https://github.com/openfoodfacts/openfoodfacts-server/issues/11225)) ([a46c967](https://github.com/openfoodfacts/openfoodfacts-server/commit/a46c96732b6b1accc7e491100ef3720c4808b799)) +* Update the tagline to force the app upgrade ([#11262](https://github.com/openfoodfacts/openfoodfacts-server/issues/11262)) ([f685cb0](https://github.com/openfoodfacts/openfoodfacts-server/commit/f685cb019e67b0dabc049cb2a405ef0461cda0e3)) + + +### Bug Fixes + +* Add more german stopwords ([#11266](https://github.com/openfoodfacts/openfoodfacts-server/issues/11266)) ([4e45a34](https://github.com/openfoodfacts/openfoodfacts-server/commit/4e45a34d4cacae39d13deca68bff72c1035a05d7)) +* link of nutri-score knowledge panel on pro platform ([#11272](https://github.com/openfoodfacts/openfoodfacts-server/issues/11272)) ([75a873b](https://github.com/openfoodfacts/openfoodfacts-server/commit/75a873b53acbe8c9bd1de3ebdbcfed9c5fa1a115)) + ## [2.55.0](https://github.com/openfoodfacts/openfoodfacts-server/compare/v2.54.0...v2.55.0) (2025-01-17) diff --git a/version.txt b/version.txt index c2576f1624838..5f46e11eedbe0 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.55.0 +2.56.0 From a47589faed32dcb45d8946c290fd3e913a431021 Mon Sep 17 00:00:00 2001 From: Teiron <12804636+Teiron@users.noreply.github.com> Date: Thu, 23 Jan 2025 22:25:49 +0100 Subject: [PATCH 14/18] taxonomy: add Polish translations (#11281) ### What - add pork tripe (important part of Polish dish https://en.wikipedia.org/wiki/Flaki) - add honey flavouring - add more Polish assorted translations of taxonomy --- taxonomies/food/ingredients.txt | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/taxonomies/food/ingredients.txt b/taxonomies/food/ingredients.txt index 723f4d4975022..fd76d0c8697c3 100644 --- a/taxonomies/food/ingredients.txt +++ b/taxonomies/food/ingredients.txt @@ -762,7 +762,7 @@ hu: sertészselatin it: gelatina di maiale lt: kiaulienos želatina nl: varkensgelatine -pl: żelatyna wieprzowa +pl: żelatyna wieprzowa, żelatynę wieprzową pt: Gelatina de porco # ingredient/fr:gélatine-de-porc has 891 products in 8 languages @2019-02-10 vegan:en: no @@ -2943,6 +2943,7 @@ fr: lait sans lactose hr: mlijeko bez laktoze it: latte delattosato nl: lactosevrije melk +pl: mleko bez laktozy < en:lactose-free milk en: whole lactose-free milk, lactose-free whole milk @@ -11610,6 +11611,7 @@ en: beef tripe de: Rinderkutteln, Rinder-Kutteln es: callos de vacuno hr: goveđi tripice +pl: flaki wołowe, żołądki wołowe < en:beef meat en: beef lung @@ -13426,6 +13428,10 @@ vegan:en: no vegetarian:en: no wikidata:en: Q104223737 +< en:pork +en: pork tripe +pl: żołądki wieprzowe + < en:pork en: pigs trotters de: Schweinepfoten @@ -23427,6 +23433,10 @@ pt: sabor a trufa ro: aromă de trufe sv: tryffelarom +< en: flavouring +en: honey flavouring +pl: aromat miodu + < en:natural flavouring en: natural honey flavouring de: natürliches Honigaroma, natürliches Honig-Aroma @@ -47034,6 +47044,7 @@ es: caqui fr: kaki hr: dragun it: cachi +pl: kaki ciqual_food_code:en: 13066 ciqual_food_name:en: Persimmon, pulp, raw ciqual_food_name:fr: Kaki, pulpe, cru @@ -59906,7 +59917,7 @@ hr: crveni grah it: fagioli rossi ja: 金時豆, 赤インゲン豆 nl: Rode bonen -pl: fasola czerwona, fasoli czerwonej +pl: fasola czerwona, fasoli czerwonej, czerwona fasola pt: Feijões vermelhos ru: фасоль красная, красная фасоль, Фасоль крупа красная sv: röda kidneybönor, kidneybönor From 640ef018723ce004bcb01dbf3341ee286f69d7e8 Mon Sep 17 00:00:00 2001 From: Malte <25488086+github-throwaway@users.noreply.github.com> Date: Thu, 23 Jan 2025 22:26:05 +0100 Subject: [PATCH 15/18] taxonomy: Improve german taxonomy (#11280) Add missing german words --------- Co-authored-by: Malte Wilhelm --- .gitignore | 2 +- taxonomies/food/ingredients.txt | 77 ++++++++++++++++++--------------- 2 files changed, 44 insertions(+), 35 deletions(-) diff --git a/.gitignore b/.gitignore index d485683d232e0..c041698bc3dd8 100644 --- a/.gitignore +++ b/.gitignore @@ -39,7 +39,7 @@ tests/integration/outputs/ # Local files -.DS_Store? +.DS_Store ._* .Spotlight-V100 .Trashes diff --git a/taxonomies/food/ingredients.txt b/taxonomies/food/ingredients.txt index fd76d0c8697c3..d7e2a070c124f 100644 --- a/taxonomies/food/ingredients.txt +++ b/taxonomies/food/ingredients.txt @@ -11149,7 +11149,7 @@ be: тэфтэлі bg: кюфте, кюфтета ca: mandonguilla cs: masové koule -de: fleischklößchen +de: fleischklößchen, Frikadelle el: κεφτές eo: viandobulo es: albóndiga @@ -11239,7 +11239,7 @@ bg: говедо, говеждо ca: carn de vaca cs: Hovězí da: oksekød -de: Rind +de: Rind, Rinderfleisch fi: nauta, naudan, härkä, härän fr: bœuf, boeuf, Boeufs hr: goveđa, goveđi, govedi, govedina @@ -12500,7 +12500,7 @@ pl: dziczyzna en: deer bg: елен da: hjort -de: Hirsch +de: Hirsch, Reh fi: hirvieläin fr: biche hr: jelen @@ -12592,6 +12592,7 @@ sv: renbog < en:game animal en: wild boar, boar +de: Wildschwein fr: sanglier hr: divlji vepar pl: dzik, dzika @@ -14547,6 +14548,7 @@ fr: jus concentré d'os et de viande de bœuf, jus concentré d'os et de viande # category:en:sausages < en:meat en: sausage, sausages +de: Wurst, Würstchen hr: kobasica pl: kiełbasa, kiełbasy @@ -24633,7 +24635,7 @@ ca: blat dur cs: pšenice tvrdá cy: gwenith barfog da: durumhvede, hård hvede -de: Hartweizen +de: Hartweizen, Durumweizen el: σιτάρι Durum, σκληρός σίτος eo: durum-tritiko es: trigo duro, trigo candeal @@ -27318,7 +27320,7 @@ br: yell ca: espelta cs: špalda, pšenice špalda da: spelt -de: Dinkel +de: Dinkel, Spelt el: όλυρα, ντίνκελ, σπέλτα eo: spelto es: espelta, escanda @@ -31131,7 +31133,7 @@ pt: açúcar caramelizado em pó < en:sugar en: white sugar bg: бяла захар -de: weißer Zucker +de: weißer Zucker, Weißzucker es: Azúcar blanco, Azúcar blanco comun, azúcar blanquilla fi: valkoinen sokeri fr: sucre blanc @@ -31316,6 +31318,7 @@ ja: メープルシュガー en: sugarcane, sugar cane bg: захарна тръстика +de: Zuckerrohr fr: canne à sucre, cannes à sucre hr: šećerne repice vegan:en: yes @@ -34240,7 +34243,7 @@ bs: kakao maslac ca: mantega de cacau cs: kakaové máslo da: kakaosmør -de: Kakaobutter +de: Kakaobutter, Kakaofett el: βούτυρο κακάου eo: kakaa butero es: manteca de cacao, manteca de cacao pura, grasa de cacao @@ -38287,6 +38290,7 @@ de: Trauben < en:fruit en: berries, berry da: Bær +de: Beere es: bayas fi: marja, marjat, marjoja fr: baies, baie @@ -38665,7 +38669,7 @@ co: Baracuccu cs: meruňka cy: bricyllen da: abrikos, abrikoser -de: Aprikose, Aprikosen +de: Aprikose, Aprikosen, Marille el: Βερίκοκο eo: Abrikoto es: albaricoque, albaricoques, damasco @@ -42743,7 +42747,7 @@ cs: pomeranč cv: Апельсин cy: Oren da: appelsin, appelsiner -de: Orange, Orangen +de: Orange, Orangen, Apfelsine dv: ނާރިނގު el: πορτοκάλι eo: oranĝo @@ -43773,7 +43777,7 @@ be: Ягаднік bg: боровинка, боровинки cs: Borůvka da: bølle -de: Heidelbeeren, Blaubeeren +de: Heidelbeeren, Blaubeeren, Heidelbeere eo: mirtelo es: arándano, arándanos, mirtilo et: mustikas, mustikad @@ -50056,7 +50060,7 @@ bo: རྗེན་ཚལ་ ca: Lletuga, enciam cs: locika, locika setá cy: Letysen -de: Lattich, Gartensalat +de: Lattich, Gartensalat, Kopfsalat eo: Laktuko, Kultiva laktuko es: Lechuga, Lechugas, Lechuga roja, Lechuga de hoja roja et: Salat, Aedsalat @@ -50163,7 +50167,7 @@ bn: রোমাইন লেটুস ca: enciam llarg cs: římský salát da: romainesalat, romersk salat, bindsalat -de: Römersalat, römischer Salat, Bindesalat +de: Römersalat, römischer Salat, Bindesalat, Romanasalat el: θρίδαξ ο μακρόφυλλος ο ρωμαϊκός eo: roma laktuko es: lechuga romana, lechuga larga, lechugon @@ -51415,7 +51419,7 @@ bo: པད་ལོག cs: hlávkové zelí, zelí cy: bresychen da: hvidkål -de: Weißkohl, Weisskohl +de: Weißkohl, Weisskohl, Weißkraut el: λάχανο eo: blanka brasiko es: col blanca @@ -51544,7 +51548,7 @@ br: kaol ruz ca: col llombarda cs: červené zelí da: rødkål -de: rotkohl +de: rotkohl, Rotkraut el: κόκκινο λάχανο eo: ruĝa brasiko es: cacho lombarda, col lombarda @@ -53246,7 +53250,7 @@ bg: преснен лук, зелен лук ca: ceba tendra, cebeta, ceballot cs: jarní cibulka da: forårsløg -de: Frühlingszwiebel +de: Frühlingszwiebel, Lauchzwiebel el: φρέσκο κρεμμυδακι eo: askolonio es: cebolla de primavera, cebolletas tiernas @@ -57062,7 +57066,7 @@ br: roketez co: rutulella cs: roketa setá da: rucola, rucolasalat, salatsennep -de: Rucola, Garten-Senfrauke +de: Rucola, Garten-Senfrauke, Rauke, Rukola el: ρόκα eo: kultiva eruko es: rúcula, rúcola, rúgula, arrúgula, arúgula, jaramago, oruga, roqueta, ruca @@ -57913,6 +57917,7 @@ br: paprika bs: paprika ca: pebre vermell, piment vermell, pebre vermell picant cy: Paprica +de: Paprika el: πάπρικα eo: papriko es: pimentón, paprika @@ -60311,7 +60316,7 @@ ca: fava cs: bob obecný cy: Ffeuen y gerddi da: Hestebønne -de: Ackerbohne, Ackerbohnen, Fava Bohnen +de: Ackerbohne, Ackerbohnen, Fava Bohnen, Saubohne el: Κουκιά eo: Fabo es: haba, habas, habas tiernas @@ -61472,7 +61477,7 @@ cs: oříšek, skořápkové plody, jiné skořápkové plody cv: Мăйăр cy: Cneuen da: nød, nødder -de: Nüssen, Nusskernmischung, Nussfrucht, Nußfrucht, Schalenfrüchte, Nüsse, Schalenfrüchten, andere Nüsse, anderen Nüssen, andere Schalenfrüchte, andere Schalenfrüchten, anderen Schalenfrüchte, anderen Schalenfrüchten, anderer Schalenfrüchte, anderer Schalenfrüchten +de: Nüssen, Nusskernmischung, Nussfrucht, Nußfrucht, Schalenfrüchte, Nüsse, Schalenfrüchten, andere Nüsse, anderen Nüssen, andere Schalenfrüchte, andere Schalenfrüchten, anderen Schalenfrüchte, anderen Schalenfrüchten, anderer Schalenfrüchte, anderer Schalenfrüchten, Nuss el: Κάρυο, καρποί με κέλυφος, καρύδια eo: nukso es: frutos secos, frutos de cáscara, frutos con cáscara, frutos secos de cáscara, otros frutos secos de cáscara, otros frutos de cáscara, frutos de cáscara y derivados, otros nueces @@ -61992,7 +61997,7 @@ bg: кашу ca: anacards cs: kešu ořechy da: cashewnødder -de: Cashewkerne, Kaschunüsse, Cashewnüsse, Cashew +de: Cashewkerne, Kaschunüsse, Cashewnüsse, Cashew, Cashewnuss el: καρύδια κάσιους es: anacardos, nueces de anacardos, castañas de cajú et: kašupähklid, India pähkel, kašupähkleid @@ -68838,6 +68843,7 @@ wikipedia:en: https://en.wikipedia.org/wiki/Calendula_officinalis < en:herb en: sweet woodruff, woodruff +de: Waldmeister fr: aspérule odorante, gaillet odorant hr: slatka šumarica la: galium odoratum, asperula odorata @@ -68980,7 +68986,7 @@ bg: риган ca: orenga, herba musca, roca morera cs: oregano da: oregano -de: oregano +de: oregano, Origano el: ρίξανη es: orégano et: pune, oregaano @@ -70872,7 +70878,7 @@ br: Te ruz ca: Rooibos cs: Rooibos da: Rooibos -de: Rooibos +de: Rooibos, Rotbusch eo: Rojbos-arbusto es: rooibos et: Rooibos, Tee-punapõõsas @@ -73872,7 +73878,7 @@ ca: xampinyó, bolet cultivat cs: pečárka dvouvýtrusá cy: Madarch meithrin da: Havechampignon, champignon, champignoner -de: Champignons, Zucht-Champignon +de: Champignons, Zucht-Champignon, Champignon eo: Ĉampinjono es: Agaricus bisporus, champinon cultivado, champinon cultivados et: šampinjon, šampinjonid, aedšampinjon @@ -76027,6 +76033,7 @@ ciqual_food_name:fr: Capelan, cru < en:fish en: carp +de: Karpfen fr: carpe hr: šaran nl: karper @@ -76060,7 +76067,7 @@ ar: قد ca: bacallà cs: Treska da: Torsk -de: Kabeljau +de: Kabeljau, Dorsch el: Μπακαλιάρος es: bacalao fa: کاد @@ -79382,7 +79389,7 @@ ca: truita cs: pstruh cv: Ăркай cy: brithyll -de: Forellen +de: Forellen, Forelle eo: Truto es: Trucha, trucha de cria et: Forell @@ -81436,7 +81443,7 @@ ca: Crustaci, crustacis cs: korýši cy: Cramennog da: krebsdyr -de: Krebstiere +de: Krebstiere, Krustentier el: καρκινοειδή eo: krustacoj es: crustáceos @@ -82081,7 +82088,7 @@ br: Chevrenn ca: gamba cs: krevety da: Reje, rejer -de: Garnele, Garnelen, crevetten +de: Garnele, Garnelen, Crevetten, Crevette eo: salikoko es: gamba, langostino, gambon eu: Izkira @@ -85225,6 +85232,7 @@ fr: Viande de haut de cuisse de poulet sans peau < en:chicken meat en: roast chicken +de: Brathähnchen fr: poulet rôti hr: pečeno pile pl: kurczak pieczony @@ -88080,6 +88088,7 @@ nl: inactief deeg < en:pasta en: macaroni +de: Makkaroni hr: makaroni nb: makaroni nn: makaroni @@ -89216,7 +89225,7 @@ fr: pain spécial de campagne < en:special bread en: bread roll -de: brötchen +de: brötchen, Semmel fi: sämpylä hr: pogača pl: bułka, bułki @@ -89670,7 +89679,7 @@ br: Gwispid ca: Galetes, galeta cy: Bisged da: kiks -de: Kekse, Biskuit +de: Kekse, Biskuit, Keks el: Μπισκότο eo: biskvito es: galleta @@ -89865,7 +89874,7 @@ en: coating, seasoning bg: Покритие bs: smjesa za paniranje cs: ochucující -de: Beschichtung +de: Beschichtung, Überzug es: envolviendo, sobrimiento, sazonador et: kate fi: päällyste @@ -91034,7 +91043,7 @@ bn: সুরুয়া ca: brou cs: vývar da: bouillon -de: Brühe, Brühen, Bouillons +de: Brühe, Brühen, Bouillons, Bouillon el: ζωμός eo: buljono es: caldo, Caldos @@ -91621,7 +91630,7 @@ wikipedia:en: https://en.wikipedia.org/wiki/Chorizo < en:meat en: black pudding ca: baldana -de: Black Pudding +de: Black Pudding, Blutwurst es: morcilla hr: crni puding @@ -91646,7 +91655,7 @@ ca: gelat, gelats cs: zmrzlina cy: Hufen iâ da: flødeis -de: Speiseeis, Eiskrem +de: Speiseeis, Eiscreme el: Παγωτό eo: glaciaĵo es: helado, helados @@ -91797,7 +91806,7 @@ description:en: ICE CREAM is a sweetened frozen food typically eaten as a snack en: vanilla ice cream bg: ванилов сладолед ca: gelat de vainilla -de: Vanille-Eis +de: Vanille-Eis, Vanilleeis eo: vanila glaciaĵo es: helado de vainilla fa: بستنی وانیلی @@ -92021,7 +92030,7 @@ ca: salsa cs: omáčka cy: Saws da: sovs -de: Sauce +de: Sauce, Soße el: σάλτσα eo: saŭco es: salsa From e349d6e760083069f64b44507118cb15e9a624cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 25 Jan 2025 12:13:35 +0100 Subject: [PATCH 16/18] build(deps-dev): bump the lint group with 3 updates (#11268) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the lint group with 3 updates: [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin), [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) and [stylelint-scss](https://github.com/stylelint-scss/stylelint-scss). Updates `@typescript-eslint/eslint-plugin` from 8.19.1 to 8.20.0
Release notes

Sourced from @​typescript-eslint/eslint-plugin's releases.

v8.20.0

8.20.0 (2025-01-13)

🚀 Features

  • standardize debug namespaces to file paths (#10599)
  • eslint-plugin: [no-misused-spread] add new rule (#10551)
  • eslint-plugin: [no-deprecated] add allow options (#10585)
  • eslint-plugin: [consistent-type-assertions] add arrayLiteralTypeAssertions options (#10565)

🩹 Fixes

  • eslint-plugin: [no-shadow] ignore ordering of type declarations (#10593)
  • eslint-plugin: [no-unnecessary-condition] don't flag optional chaining for union types with an unconstrained type parameters (#10602)

❤️ Thank You

You can read about our versioning strategy and releases on our website.

Changelog

Sourced from @​typescript-eslint/eslint-plugin's changelog.

8.20.0 (2025-01-13)

🚀 Features

  • eslint-plugin: [consistent-type-assertions] add arrayLiteralTypeAssertions options (#10565)
  • eslint-plugin: [no-deprecated] add allow options (#10585)
  • eslint-plugin: [no-misused-spread] add new rule (#10551)

🩹 Fixes

  • eslint-plugin: [no-unnecessary-condition] don't flag optional chaining for union types with an unconstrained type parameters (#10602)
  • eslint-plugin: [no-shadow] ignore ordering of type declarations (#10593)

❤️ Thank You

You can read about our versioning strategy and releases on our website.

Commits
  • ea6fbea chore(release): publish 8.20.0
  • a7fc28c feat(eslint-plugin): [consistent-type-assertions] add arrayLiteralTypeAsserti...
  • d6e5978 fix(eslint-plugin): [no-unnecessary-condition] don't flag optional chaining f...
  • 63135f7 fix(eslint-plugin): [no-shadow] ignore ordering of type declarations (#10593)
  • 6dda0a4 feat(eslint-plugin): [no-deprecated] add allow options (#10585)
  • 04166e0 feat(eslint-plugin): [no-misused-spread] add new rule (#10551)
  • b17c7f2 chore: export all Options and MessageIds types from rule files (#10556)
  • 03d9639 test(eslint-plugin): add extra tests (#10587)
  • e697cfa chore: fix CI snapshot failure (#10624)
  • See full diff in compare view

Updates `@typescript-eslint/parser` from 8.19.1 to 8.20.0
Release notes

Sourced from @​typescript-eslint/parser's releases.

v8.20.0

8.20.0 (2025-01-13)

🚀 Features

  • standardize debug namespaces to file paths (#10599)
  • eslint-plugin: [no-misused-spread] add new rule (#10551)
  • eslint-plugin: [no-deprecated] add allow options (#10585)
  • eslint-plugin: [consistent-type-assertions] add arrayLiteralTypeAssertions options (#10565)

🩹 Fixes

  • eslint-plugin: [no-shadow] ignore ordering of type declarations (#10593)
  • eslint-plugin: [no-unnecessary-condition] don't flag optional chaining for union types with an unconstrained type parameters (#10602)

❤️ Thank You

You can read about our versioning strategy and releases on our website.

Changelog

Sourced from @​typescript-eslint/parser's changelog.

8.20.0 (2025-01-13)

This was a version bump only for parser to align it with other projects, there were no code changes.

You can read about our versioning strategy and releases on our website.

Commits

Updates `stylelint-scss` from 6.10.0 to 6.10.1
Release notes

Sourced from stylelint-scss's releases.

6.10.1

  • Fixed: declaration-property-value-no-unknown fix trailing whitespace in value parsing (#1089).
  • Fixed: no-global-function-names allow CSS round function (#1097).

Full Changelog: https://github.com/stylelint-scss/stylelint-scss/compare/v6.10.0...v6.10.1

Changelog

Sourced from stylelint-scss's changelog.

6.10.1

  • Fixed: declaration-property-value-no-unknown fix trailing whitespace in value parsing (#1089).
  • Fixed: no-global-function-names allow CSS round function (#1097).

Full Changelog: https://github.com/stylelint-scss/stylelint-scss/compare/v6.10.0...v6.10.1

Commits

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 114 +++++++++++++++++++++------------------------- package.json | 6 +-- 2 files changed, 55 insertions(+), 65 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4698be8e94342..2cb29c270b142 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,8 +44,8 @@ "@types/gulp-sourcemaps": "^0.0.38", "@types/gulp-svgmin": "^1.2.4", "@types/gulp-terser": "^1.2.6", - "@typescript-eslint/eslint-plugin": "^8.19.0", - "@typescript-eslint/parser": "^8.19.0", + "@typescript-eslint/eslint-plugin": "^8.20.0", + "@typescript-eslint/parser": "^8.20.0", "chai": "^5.1.2", "chai-http": "^5.1.1", "dotenv": "^16.4.7", @@ -64,7 +64,7 @@ "stylelint": "^16.2.1", "stylelint-config-recommended": "^14.0.0", "stylelint-config-recommended-scss": "^14.1.0", - "stylelint-scss": "^6.10.0", + "stylelint-scss": "^6.10.1", "ts-node": "^10.9.2", "typescript": "^5.5.4" }, @@ -2745,17 +2745,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.19.1.tgz", - "integrity": "sha512-tJzcVyvvb9h/PB96g30MpxACd9IrunT7GF9wfA9/0TJ1LxGOJx1TdPzSbBBnNED7K9Ka8ybJsnEpiXPktolTLg==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.20.0.tgz", + "integrity": "sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.19.1", - "@typescript-eslint/type-utils": "8.19.1", - "@typescript-eslint/utils": "8.19.1", - "@typescript-eslint/visitor-keys": "8.19.1", + "@typescript-eslint/scope-manager": "8.20.0", + "@typescript-eslint/type-utils": "8.20.0", + "@typescript-eslint/utils": "8.20.0", + "@typescript-eslint/visitor-keys": "8.20.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -2775,16 +2774,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.19.1.tgz", - "integrity": "sha512-67gbfv8rAwawjYx3fYArwldTQKoYfezNUT4D5ioWetr/xCrxXxvleo3uuiFuKfejipvq+og7mjz3b0G2bVyUCw==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.20.0.tgz", + "integrity": "sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.19.1", - "@typescript-eslint/types": "8.19.1", - "@typescript-eslint/typescript-estree": "8.19.1", - "@typescript-eslint/visitor-keys": "8.19.1", + "@typescript-eslint/scope-manager": "8.20.0", + "@typescript-eslint/types": "8.20.0", + "@typescript-eslint/typescript-estree": "8.20.0", + "@typescript-eslint/visitor-keys": "8.20.0", "debug": "^4.3.4" }, "engines": { @@ -2800,14 +2798,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.19.1.tgz", - "integrity": "sha512-60L9KIuN/xgmsINzonOcMDSB8p82h95hoBfSBtXuO4jlR1R9L1xSkmVZKgCPVfavDlXihh4ARNjXhh1gGnLC7Q==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.20.0.tgz", + "integrity": "sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.19.1", - "@typescript-eslint/visitor-keys": "8.19.1" + "@typescript-eslint/types": "8.20.0", + "@typescript-eslint/visitor-keys": "8.20.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2818,14 +2815,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.19.1.tgz", - "integrity": "sha512-Rp7k9lhDKBMRJB/nM9Ksp1zs4796wVNyihG9/TU9R6KCJDNkQbc2EOKjrBtLYh3396ZdpXLtr/MkaSEmNMtykw==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.20.0.tgz", + "integrity": "sha512-bPC+j71GGvA7rVNAHAtOjbVXbLN5PkwqMvy1cwGeaxUoRQXVuKCebRoLzm+IPW/NtFFpstn1ummSIasD5t60GA==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.19.1", - "@typescript-eslint/utils": "8.19.1", + "@typescript-eslint/typescript-estree": "8.20.0", + "@typescript-eslint/utils": "8.20.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.0" }, @@ -2842,11 +2838,10 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.19.1.tgz", - "integrity": "sha512-JBVHMLj7B1K1v1051ZaMMgLW4Q/jre5qGK0Ew6UgXz1Rqh+/xPzV1aW581OM00X6iOfyr1be+QyW8LOUf19BbA==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.20.0.tgz", + "integrity": "sha512-cqaMiY72CkP+2xZRrFt3ExRBu0WmVitN/rYPZErA80mHjHx/Svgp8yfbzkJmDoQ/whcytOPO9/IZXnOc+wigRA==", "dev": true, - "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -2856,14 +2851,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.19.1.tgz", - "integrity": "sha512-jk/TZwSMJlxlNnqhy0Eod1PNEvCkpY6MXOXE/WLlblZ6ibb32i2We4uByoKPv1d0OD2xebDv4hbs3fm11SMw8Q==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.20.0.tgz", + "integrity": "sha512-Y7ncuy78bJqHI35NwzWol8E0X7XkRVS4K4P4TCyzWkOJih5NDvtoRDW4Ba9YJJoB2igm9yXDdYI/+fkiiAxPzA==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.19.1", - "@typescript-eslint/visitor-keys": "8.19.1", + "@typescript-eslint/types": "8.20.0", + "@typescript-eslint/visitor-keys": "8.20.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -2887,7 +2881,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -2896,16 +2889,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.19.1.tgz", - "integrity": "sha512-IxG5gLO0Ne+KaUc8iW1A+XuKLd63o4wlbI1Zp692n1xojCl/THvgIKXJXBZixTh5dd5+yTJ/VXH7GJaaw21qXA==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.20.0.tgz", + "integrity": "sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.19.1", - "@typescript-eslint/types": "8.19.1", - "@typescript-eslint/typescript-estree": "8.19.1" + "@typescript-eslint/scope-manager": "8.20.0", + "@typescript-eslint/types": "8.20.0", + "@typescript-eslint/typescript-estree": "8.20.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2920,13 +2912,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.19.1.tgz", - "integrity": "sha512-fzmjU8CHK853V/avYZAvuVut3ZTfwN5YtMaoi+X9Y9MA9keaWNHC3zEQ9zvyX/7Hj+5JkNyK1l7TOR2hevHB6Q==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.20.0.tgz", + "integrity": "sha512-v/BpkeeYAsPkKCkR8BDwcno0llhzWVqPOamQrAEMdpZav2Y9OVjd9dwJyBLJWwf335B5DmlifECIkZRJCaGaHA==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.19.1", + "@typescript-eslint/types": "8.20.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -2942,7 +2933,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -10464,15 +10454,15 @@ } }, "node_modules/stylelint-scss": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.10.0.tgz", - "integrity": "sha512-y03if6Qw9xBMoVaf7tzp5BbnYhYvudIKzURkhSHzcHG0bW0fAYvQpTUVJOe7DyhHaxeThBil4ObEMvGbV7+M+w==", + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.10.1.tgz", + "integrity": "sha512-CBqs0jecftIyhic6xba+4OvZUp4B0wNbX19w6Rq1fPo+lBDmTevk+olo8H7u/WQpTSDCDbBN4f3oocQurvXLTQ==", "dev": true, "dependencies": { "css-tree": "^3.0.1", "is-plain-object": "^5.0.0", "known-css-properties": "^0.35.0", - "mdn-data": "^2.12.2", + "mdn-data": "^2.14.0", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.6", "postcss-selector-parser": "^7.0.0", @@ -10511,9 +10501,9 @@ "dev": true }, "node_modules/stylelint-scss/node_modules/mdn-data": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", - "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.15.0.tgz", + "integrity": "sha512-KIrS0lFPOqA4DgeO16vI5fkAsy8p++WBlbXtB5P1EQs8ubBgguAInNd1DnrCeTRfGchY0kgThgDOOIPyOLH2dQ==", "dev": true }, "node_modules/stylelint-scss/node_modules/postcss-selector-parser": { diff --git a/package.json b/package.json index 25e916498d9b8..5d20ee2c171d0 100644 --- a/package.json +++ b/package.json @@ -67,8 +67,8 @@ "@types/gulp-sourcemaps": "^0.0.38", "@types/gulp-svgmin": "^1.2.4", "@types/gulp-terser": "^1.2.6", - "@typescript-eslint/eslint-plugin": "^8.19.0", - "@typescript-eslint/parser": "^8.19.0", + "@typescript-eslint/eslint-plugin": "^8.20.0", + "@typescript-eslint/parser": "^8.20.0", "chai": "^5.1.2", "chai-http": "^5.1.1", "dotenv": "^16.4.7", @@ -87,7 +87,7 @@ "stylelint": "^16.2.1", "stylelint-config-recommended": "^14.0.0", "stylelint-config-recommended-scss": "^14.1.0", - "stylelint-scss": "^6.10.0", + "stylelint-scss": "^6.10.1", "ts-node": "^10.9.2", "typescript": "^5.5.4" }, From 7bb7550ab1df3af5d04ea707e9f1b27adcd94dd0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 25 Jan 2025 12:14:40 +0100 Subject: [PATCH 17/18] build(deps-dev): bump sass from 1.83.1 to 1.83.4 (#11269) Bumps [sass](https://github.com/sass/dart-sass) from 1.83.1 to 1.83.4.
Release notes

Sourced from sass's releases.

Dart Sass 1.83.4

To install Sass 1.83.4, download one of the packages below and add it to your PATH, or see the Sass website for full installation instructions.

Changes

  • No user-visible changes.

See the full changelog for changes in earlier releases.

Dart Sass 1.83.3

To install Sass 1.83.3, download one of the packages below and add it to your PATH, or see the Sass website for full installation instructions.

Changes

  • No user-visible changes.

See the full changelog for changes in earlier releases.

Dart Sass 1.83.2

To install Sass 1.83.2, download one of the packages below and add it to your PATH, or see the Sass website for full installation instructions.

Changes

  • Properly display deprecation IDs for the JS Sass API.

  • Don't display deprecation IDs for user-defined deprecations.

See the full changelog for changes in earlier releases.

Changelog

Sourced from sass's changelog.

1.83.4

  • No user-visible changes.

1.83.3

  • No user-visible changes.

1.83.2

  • Properly display deprecation IDs for the JS Sass API.

  • Don't display deprecation IDs for user-defined deprecations.

Commits
  • 89a5394 Fix more bugs in the sass-parser release process (#2491)
  • 46686ed Merge pull request #2490 from sass/sass-parser-release
  • 1261767 Use a file: dependency for local Sass development
  • 173f39b Use the Dart Sass version for the sass-parser dependency
  • ddb14b2 Fix deprecation ID displays in JS mode (#2483)
  • b12b508 Compile sass-parser before deploying (#2489)
  • b19b57f Merge pull request #2478 from sass/if
  • 23ff19d Merge branch 'main' into if
  • 8818d93 Properly override the sass-parser dependency on sass during release (#2487)
  • adb7016 Merge pull request #2488 from sass/sdk-formatter
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=sass&package-manager=npm_and_yarn&previous-version=1.83.1&new-version=1.83.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 9 ++++----- package.json | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2cb29c270b142..d67f3a837714e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -60,7 +60,7 @@ "gulp-svgmin": "^4.1.0", "gulp-terser": "^2.1.0", "mocha": "^10.3.0", - "sass": "^1.83.0", + "sass": "^1.83.4", "stylelint": "^16.2.1", "stylelint-config-recommended": "^14.0.0", "stylelint-config-recommended-scss": "^14.1.0", @@ -9677,11 +9677,10 @@ } }, "node_modules/sass": { - "version": "1.83.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.1.tgz", - "integrity": "sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.4.tgz", + "integrity": "sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA==", "dev": true, - "license": "MIT", "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", diff --git a/package.json b/package.json index 5d20ee2c171d0..e3684d68fee44 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "gulp-svgmin": "^4.1.0", "gulp-terser": "^2.1.0", "mocha": "^10.3.0", - "sass": "^1.83.0", + "sass": "^1.83.4", "stylelint": "^16.2.1", "stylelint-config-recommended": "^14.0.0", "stylelint-config-recommended-scss": "^14.1.0", From 9141b722bebd605b8a98b3e84f2c86695b4c4abf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 25 Jan 2025 12:17:14 +0100 Subject: [PATCH 18/18] build(deps): bump @yaireo/tagify from 4.32.1 to 4.33.1 (#11235) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [@yaireo/tagify](https://github.com/yairEO/tagify) from 4.32.1 to 4.33.1.
Release notes

Sourced from @​yaireo/tagify's releases.

v4.33.1

  • fixes #1421 - suggestions dropdown overflows outside the right side of the viewport if positionTo == &#39;text&#39; is set and the typed text is at the right edge of the viewport a57b4c0
  • fix: remove unreachable return statement in events.js to streamline tag input handling f102c7b
  • fix: improve optional chaining for closest method in isNodeBelongsToThisTagifyInstance function 7f9120c
  • bugfix: when in mix-mode and tyrping a tag, and suggestions show only one item (the thing being typed) it wasn&#39;t able to be added using ENTER key 2f936f4
  • #1429 - pasting doesn&#39;t work in select mode and does not fire a "paste" event 29f0120
  • fixes #1431 - if multiple instances of (Select) Tagify exists, tabbing is impossible as the first instance is trapping the focus 73df18a
  • fixes #1432 - "Tag element does not exist" 4c0bd8e

https://github.com/yairEO/tagify/compare/v4.33.0...v4.33.1

v4.33.0

  • fixes #1422 - in "select-mode" editing existing value does not re-filters the suggestions list fd2c208
  • accessibility bugfix: when Tagify gets focused (through tab), the component&#39;s input should be focused and if there is already a selected value, the caret should be places at the end 52c37a4
  • fixes #1420: when selecting a suggestion with the keyboard, keep the same highlighted suggestion if includeSelectedTags setting is true or else, highlight the next/prev suggestion - rehydrate suggestions list when selecting a suggestion with the mouse 5746d7a
  • #1420 - on select-mode, do not call dropdown.hide within onEditTagDone after a suggestion was selected ca64ac7
  • re-implemented #1425 in a better way 3e9819a
  • fixes #1428 - fixed the compatibility layer. I assume now Tagify only supports React v17 and above 108c6bc
  • slightly increased $tag-inset-shadow-size CSS variable 2d8abd2
  • Fix Tab key after click Tab key didn&#39;t work after you select a suggestion with mouse because the input lose focus cbb6864

https://github.com/yairEO/tagify/compare/v4.32.2...v4.33.0

v4.32.2

  • Enhance keyboard navigation for suggestions dropdown by adding support for PageUp, PageDown, Home, and End keys. This allows users to navigate through suggestions more efficiently without using the mouse. 719827b
  • bugfix: in select-mode, the x (remove tag) button should not be visible if the suggestions&#39; dropdown is visible (open) 1cd4459
  • ran npx update-browserslist-db@latest 0ea0f30
  • fixes #1423 - Dropdowns does not close when interacting with tags of other instances d9d9ece
  • added an FAQ item 0e0ad46
  • this.state.dropdown.suggestions should point to the sorted list and not pre-sorted one 4acd7ae
  • call the custom sortby (if defined) also when there&#39;s no search query 643f79d
  • Fix scroll behavior 7c4ce8f

https://github.com/yairEO/tagify/compare/v4.32.1...v4.32.2

Commits
  • 4b910ff 4.33.1
  • a57b4c0 fixes #1421 - suggestions dropdown overflows outside the right side of the vi...
  • f102c7b fix: remove unreachable return statement in events.js to streamline tag input...
  • 7f9120c fix: improve optional chaining for closest method in isNodeBelongsToThisTagif...
  • 2f936f4 bugfix: when in mix-mode and tyrping a tag, and suggestions show only one ite...
  • 29f0120 #1429 - pasting doesn't work in select mode and does not fire a "paste" event
  • 73df18a fixes #1431 - if multiple instances of (Select) Tagify exists, tabbing is imp...
  • 4c0bd8e fixes #1432 - "Tag element does not exist"
  • 019e382 4.33.0
  • a913ba4 fixed tests path
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@yaireo/tagify&package-manager=npm_and_yarn&previous-version=4.32.1&new-version=4.33.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index d67f3a837714e..fceeed21cf0f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2960,9 +2960,9 @@ } }, "node_modules/@yaireo/tagify": { - "version": "4.32.1", - "resolved": "https://registry.npmjs.org/@yaireo/tagify/-/tagify-4.32.1.tgz", - "integrity": "sha512-QlWP+9K9AIFs1RtGLjw1oqBIAhiKMWRH5s+vxXk4gdhsc6Ii87jucGXdL9uUJ9Pn33A1Zw41ZfBsguQkN0wEuQ==", + "version": "4.33.1", + "resolved": "https://registry.npmjs.org/@yaireo/tagify/-/tagify-4.33.1.tgz", + "integrity": "sha512-V+jMHsGVCLIn5vgF+UaC413VThsXzwVyMp4TiUyjXzWwXXubmObLJ/LgokN5LXkQJNAzzpHWLILzvoQV7GmNog==", "engines": { "node": ">=16.15.0", "npm": ">=9.0.0"