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 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/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/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/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..d6d1b0a0d5008 100644 --- a/conf/nginx/sites-available/off +++ b/conf/nginx/sites-available/off @@ -25,7 +25,9 @@ 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; + # 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 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" } ] } 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/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/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 => [ 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/package-lock.json b/package-lock.json index 4698be8e94342..fceeed21cf0f6 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", @@ -60,11 +60,11 @@ "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", - "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" }, @@ -2970,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" @@ -9687,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", @@ -10464,15 +10453,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 +10500,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..e3684d68fee44 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", @@ -83,11 +83,11 @@ "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", - "stylelint-scss": "^6.10.0", + "stylelint-scss": "^6.10.1", "ts-node": "^10.9.2", "typescript": "^5.5.4" }, 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"; 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 diff --git a/taxonomies/food/categories.txt b/taxonomies/food/categories.txt index 073488fabda37..7bab0845d350e 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 @@ -34269,7 +34302,7 @@ wikidata:en: Q2936384 < en:Dry biscuits en: Cantucci, cantuccini xx: Cantucci -bg: Кантучи +bg: Кантучи, кантучини fr: Cantucci, cantuccini it: Cantucci, cantuccini nl: Cantucci @@ -41499,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 @@ -44571,6 +44605,7 @@ wikidata:en: Q3088299 < en:Cow cheeses en: Provolone xx: Provolone +bg: Проволоне de: Provolone es: Provolone fi: Provolone @@ -64342,6 +64377,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 @@ -81814,6 +81853,7 @@ ciqual_food_name:fr: Petit salé ou saucisse aux lentilles < en:Meals en: Focaccia +bg: Фокача fr: Focaccia hr: Focaccia ja: フォカッチャ @@ -93575,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 @@ -93586,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 @@ -94033,6 +94075,7 @@ nl: Tortellini met kip < en:Stuffed Pastas en: Tortelloni xx: Tortelloni +bg: Тортелони wikidata:en: Q20061 < en:Pastas @@ -94770,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 @@ -95425,6 +95469,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 +100535,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 @@ -112017,6 +112070,7 @@ ciqual_food_name:fr: Câpres, au vinaigre < en:Condiments en: Capers +bg: Каперси de: Kapernbeeren hr: Kapari ja: ケッパー @@ -118464,3 +118518,4 @@ fr: Spirales de blé dur complet en: Semi whole durum wheat spirals fr: Spirales de blé dur semi-complet + diff --git a/taxonomies/food/ingredients.txt b/taxonomies/food/ingredients.txt index 792a30f92f1b9..d7e2a070c124f 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 @@ -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 @@ -11148,7 +11149,7 @@ be: тэфтэлі bg: кюфте, кюфтета ca: mandonguilla cs: masové koule -de: fleischklößchen +de: fleischklößchen, Frikadelle el: κεφτές eo: viandobulo es: albóndiga @@ -11238,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 @@ -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 @@ -12498,7 +12500,7 @@ pl: dziczyzna en: deer bg: елен da: hjort -de: Hirsch +de: Hirsch, Reh fi: hirvieläin fr: biche hr: jelen @@ -12590,6 +12592,7 @@ sv: renbog < en:game animal en: wild boar, boar +de: Wildschwein fr: sanglier hr: divlji vepar pl: dzik, dzika @@ -13426,6 +13429,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 @@ -14541,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 @@ -23427,6 +23435,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 @@ -24623,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 @@ -25465,7 +25477,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 +25492,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 +25508,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 +25545,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 @@ -27307,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 @@ -28562,6 +28575,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 @@ -31116,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 @@ -31301,6 +31318,7 @@ ja: メープルシュガー en: sugarcane, sugar cane bg: захарна тръстика +de: Zuckerrohr fr: canne à sucre, cannes à sucre hr: šećerne repice vegan:en: yes @@ -33549,6 +33567,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 +33591,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 +33602,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 +33622,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 +33634,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: изолированный белок сои @@ -34218,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 @@ -38265,6 +38290,7 @@ de: Trauben < en:fruit en: berries, berry da: Bær +de: Beere es: bayas fi: marja, marjat, marjoja fr: baies, baie @@ -38289,6 +38315,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 @@ -38642,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 @@ -41997,10 +42024,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 @@ -42709,7 +42747,7 @@ cs: pomeranč cv: Апельсин cy: Oren da: appelsin, appelsiner -de: Orange, Orangen +de: Orange, Orangen, Apfelsine dv: ނާރިނގު el: πορτοκάλι eo: oranĝo @@ -43739,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 @@ -47010,6 +47048,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 @@ -50021,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 @@ -50128,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 @@ -51380,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 @@ -51509,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 @@ -53211,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 @@ -57027,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 @@ -57878,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 @@ -59882,7 +59922,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 @@ -60276,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 @@ -61437,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 @@ -61957,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 @@ -68803,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 @@ -68945,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 @@ -70837,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 @@ -73837,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 @@ -75992,6 +76033,7 @@ ciqual_food_name:fr: Capelan, cru < en:fish en: carp +de: Karpfen fr: carpe hr: šaran nl: karper @@ -76025,7 +76067,7 @@ ar: قد ca: bacallà cs: Treska da: Torsk -de: Kabeljau +de: Kabeljau, Dorsch el: Μπακαλιάρος es: bacalao fa: کاد @@ -79347,7 +79389,7 @@ ca: truita cs: pstruh cv: Ăркай cy: brithyll -de: Forellen +de: Forellen, Forelle eo: Truto es: Trucha, trucha de cria et: Forell @@ -81401,7 +81443,7 @@ ca: Crustaci, crustacis cs: korýši cy: Cramennog da: krebsdyr -de: Krebstiere +de: Krebstiere, Krustentier el: καρκινοειδή eo: krustacoj es: crustáceos @@ -82046,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 @@ -85190,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 @@ -88045,6 +88088,7 @@ nl: inactief deeg < en:pasta en: macaroni +de: Makkaroni hr: makaroni nb: makaroni nn: makaroni @@ -89181,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 @@ -89214,6 +89258,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 +89533,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 +89558,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 +89567,9 @@ pl: wafel, wafli < en:wafer de: Backoblate, Backoblaten +< en:wafer +en: starch wafer +it: ostia d'amido fr: biscuit d'enrobage @@ -89529,6 +89577,7 @@ fr: biscuit d'enrobage bg: Гризини de: Grissini fr: gressins +it: grissini nl: Broodstengels pt: gressinos sv: Grissini @@ -89630,7 +89679,7 @@ br: Gwispid ca: Galetes, galeta cy: Bisged da: kiks -de: Kekse, Biskuit +de: Kekse, Biskuit, Keks el: Μπισκότο eo: biskvito es: galleta @@ -89825,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 @@ -89977,7 +90026,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 @@ -90994,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 @@ -91581,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 @@ -91606,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 @@ -91757,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: بستنی وانیلی @@ -91981,7 +92030,7 @@ ca: salsa cs: omáčka cy: Saws da: sovs -de: Sauce +de: Sauce, Soße el: σάλτσα eo: saŭco es: salsa 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 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 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') %]

` }, }, 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" : [] } 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