diff --git a/html/images/misc/additives-efsa-evaluation-overexposure-risk-icon-high.svg b/html/images/misc/additives-efsa-evaluation-overexposure-risk-icon-high.svg new file mode 100644 index 0000000000000..80dacde7d0662 --- /dev/null +++ b/html/images/misc/additives-efsa-evaluation-overexposure-risk-icon-high.svg @@ -0,0 +1,92 @@ + + + + + + + + image/svg+xml + + + + + vegetarianmark.net + + + + + + + + + + + + + + + + + diff --git a/html/images/misc/additives-efsa-evaluation-overexposure-risk-icon-moderate.svg b/html/images/misc/additives-efsa-evaluation-overexposure-risk-icon-moderate.svg new file mode 100644 index 0000000000000..a4fd866216003 --- /dev/null +++ b/html/images/misc/additives-efsa-evaluation-overexposure-risk-icon-moderate.svg @@ -0,0 +1,96 @@ + + + + + + + + + + image/svg+xml + + + + + vegetarianmark.net + + + + + + + + + + + + + + + + + diff --git a/lib/ProductOpener/Config_obf.pm b/lib/ProductOpener/Config_obf.pm index 5497afe831bf5..438a3beaba9b4 100644 --- a/lib/ProductOpener/Config_obf.pm +++ b/lib/ProductOpener/Config_obf.pm @@ -275,16 +275,16 @@ $options{other_servers} = { obf => { name => "Open Beauty Facts", - data_root => "/home/obf", - www_root => "/home/obf/html", + data_root => "/srv/obf", + www_root => "/srv/obf/html", mongodb => "obf", domain => "openbeautyfacts.org", }, off => { name => "Open Food Facts", - data_root => "/home/off", - www_root => "/home/off/html", + data_root => "/srv/off", + www_root => "/srv/off/html", mongodb => "off", domain => "openfoodfacts.org", }, @@ -292,16 +292,16 @@ opff => { prefix => "opff", name => "Open Pet Food Facts", - data_root => "/home/opff", - www_root => "/home/opff/html", + data_root => "/srv/opff", + www_root => "/srv/opff/html", mongodb => "opff", domain => "openpetfoodfacts.org", }, opf => { name => "Open Products Facts", - data_root => "/home/opf", - www_root => "/home/opf/html", + data_root => "/srv/opf", + www_root => "/srv/opf/html", mongodb => "opf", domain => "openproductsfacts.org", }, diff --git a/lib/ProductOpener/Config_off.pm b/lib/ProductOpener/Config_off.pm index ea416123a4d24..8383b77d3964b 100644 --- a/lib/ProductOpener/Config_off.pm +++ b/lib/ProductOpener/Config_off.pm @@ -700,24 +700,24 @@ $options{other_servers} = { obf => { name => "Open Beauty Facts", - data_root => "/home/obf", - www_root => "/home/obf/html", + data_root => "/srv/obf", + www_root => "/srv/obf/html", mongodb => "obf", domain => "openbeautyfacts.org", }, off => { name => "Open Food Facts", - data_root => "/home/off", - www_root => "/home/off/html", + data_root => "/srv/off", + www_root => "/srv/off/html", mongodb => "off", domain => "openfoodfacts.org", }, opf => { name => "Open Products Facts", - data_root => "/home/opf", - www_root => "/home/opf/html", + data_root => "/srv/opf", + www_root => "/srv/opf/html", mongodb => "opf", domain => "openproductsfacts.org", }, @@ -725,11 +725,27 @@ opff => { prefix => "opff", name => "Open Pet Food Facts", - data_root => "/home/opff", - www_root => "/home/opff/html", + data_root => "/srv/opff", + www_root => "/srv/opff/html", mongodb => "opff", domain => "openpetfoodfacts.org", } }; + +$options{display_tag_additives} = [ + + '@additives_classes', + 'wikipedia', + 'title:efsa_evaluation_overexposure_risk_title', + 'efsa_evaluation', + 'efsa_evaluation_overexposure_risk', + 'efsa_evaluation_exposure_table', +# '@efsa_evaluation_exposure_mean_greater_than_noael', +# '@efsa_evaluation_exposure_95th_greater_than_noael', +# '@efsa_evaluation_exposure_mean_greater_than_adi', +# '@efsa_evaluation_exposure_95th_greater_than_adi', + +]; + 1; diff --git a/lib/ProductOpener/Config_opf.pm b/lib/ProductOpener/Config_opf.pm new file mode 100644 index 0000000000000..3ecb85a945b3f --- /dev/null +++ b/lib/ProductOpener/Config_opf.pm @@ -0,0 +1,291 @@ +# This file is part of Product Opener. +# +# Product Opener +# Copyright (C) 2011-2018 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 . + +package ProductOpener::Config; + +use utf8; +use Modern::Perl '2012'; +use Exporter qw< import >; + +BEGIN +{ + use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); + @EXPORT = qw(); + @EXPORT_OK = qw( + %admins + + $server_domain + @ssl_subdomains + $data_root + $www_root + $reference_timezone + $contact_email + $admin_email + + $facebook_app_id + $facebook_app_secret + + $csrf_secret + + $google_cloud_vision_api_key + + $crowdin_project_identifier + $crowdin_project_key + + $mongodb + $mongodb_host + + $google_analytics + + $thumb_size + $crop_size + $small_size + $display_size + $zoom_size + + $page_size + + %options + + %wiki_texts + + @taxonomy_fields + @product_image_fields + @product_fields + @display_fields + @drilldown_fields + + %tesseract_ocr_available_languages + + %weblink_templates + + @edit_rules + + ); + %EXPORT_TAGS = (all => [@EXPORT_OK]); +} +use vars @EXPORT_OK ; # no 'my' keyword for these + +use ProductOpener::Config2; + +%admins = map { $_ => 1 } qw( +agamitsudo +bcatelin +beniben +hangy +javichu +kyzh +scanparty-franprix-05-2016 +sebleouf +segundo +stephane +tacinte +tacite +teolemon +twoflower +scanparty-franprix-05-2016 +); + +@edit_rules = (); + + +# server constants +$server_domain = $ProductOpener::Config2::server_domain; +@ssl_subdomains = @ProductOpener::Config2::ssl_subdomains; +$mongodb = $ProductOpener::Config2::mongodb; +$mongodb_host = $ProductOpener::Config2::mongodb_host; + +# server paths +$www_root = $ProductOpener::Config2::www_root; +$data_root = $ProductOpener::Config2::data_root; + +$facebook_app_id = $ProductOpener::Config2::facebook_app_id; +$facebook_app_secret = $ProductOpener::Config2::facebook_app_secret; + +$csrf_secret = $ProductOpener::Config2::csrf_secret; +$google_cloud_vision_api_key = $ProductOpener::Config2::google_cloud_vision_api_key; + +$crowdin_project_identifier = $ProductOpener::Config2::crowdin_project_identifier; +$crowdin_project_key = $ProductOpener::Config2::crowdin_project_key; + +$reference_timezone = 'Europe/Paris'; + +$contact_email = 'contact@openproductsfacts.org'; +$admin_email = 'biz@joueb.com'; + + +$thumb_size = 100; +$crop_size = 400; +$small_size = 200; +$display_size = 400; +$zoom_size = 800; + +$page_size = 20; + + +$google_analytics = < + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + + ga('create', 'UA-31851927-5', 'auto'); + ga('send', 'pageview'); + + +HTML +; + + + +%wiki_texts = ( + +"en/whatsinmyshampoo" => "http://en.wiki.openproductsfacts.org/Translations/whatsinmyshampoo.com/English?action=raw", + +"en/index.foundation" => "http://en.wiki.openproductsfacts.org/Translations/Index_page/English?action=raw", +"fr/index.foundation" => "http://en.wiki.openproductsfacts.org/Translations/Index_page/French?action=raw", + +"en/contribute.foundation" => "http://en.wiki.openproductsfacts.org/Translations/Contribute_page/English?action=raw", +"fr/contribute.foundation" => "http://en.wiki.openproductsfacts.org/Translations/Contribute_page/French?action=raw", + +"en/discover.foundation" => "http://en.wiki.openproductsfacts.org/Translations/Discover_page/English?action=raw", +"fr/discover.foundation" => "http://en.wiki.openproductsfacts.org/Translations/Discover_page/French?action=raw", + +"en/press" => "http://en.wiki.openproductsfacts.org/Translations_-_Press_-_English?action=raw", +"fr/presse" => "http://en.wiki.openproductsfacts.org/Translations_-_Press_-_French?action=raw", + +"en/code-of-conduct" => "http://en.wiki.openproductsfacts.org/Translations_-_Code_of_conduct_-_English?action=raw", +"fr/code-de-conduite" => "http://en.wiki.openproductsfacts.org/Translations_-_Code_of_conduct_-_French?action=raw", + +"en/data" => "http://en.wiki.openproductsfacts.org/Translations/Data/English?action=raw", +"fr/data" => "http://en.wiki.openproductsfacts.org/Translations/Data/French?action=raw", + +); + +@product_image_fields = qw(front ingredients); + +#fields that have a taxonomy + +@taxonomy_fields = qw(states countries languages labels categories additives allergens traces nutrient_levels ingredients periods_after_opening); + +# fields in product edit form + +#@product_fields = qw(product_name generic_name quantity packaging brands categories labels origins manufacturing_places emb_codes link periods_after_opening expiration_date purchase_places stores countries ); +@product_fields = qw(quantity packaging brands categories labels origins manufacturing_places emb_codes link periods_after_opening expiration_date purchase_places stores countries ); + +# fields shown on product page +# do not show purchase_places + +@display_fields = qw(generic_name quantity packaging brands categories labels origins manufacturing_places emb_codes link periods_after_opening stores countries); + + +# fields for drilldown facet navigation + +@drilldown_fields = qw( +brands +categories +labels +packaging +periods_after_opening +origins +manufacturing_places +emb_codes +ingredients +ingredients_n +additives +allergens +traces +nutrition_grades +languages +users +states +entry_dates +last_edit_dates +); + + +# for ingredients OCR, we use tesseract-ocr +# on debian, dictionaries are in /usr/share/tesseract-ocr/tessdata +# %tesseract_ocr_available_languages provides mapping between OFF 2 letter language codes +# and the available tesseract dictionaries +# Tesseract uses 3-character ISO 639-2 language codes +# all dictionaries: apt-get install tesseract-ocr-all + +%tesseract_ocr_available_languages = ( + en => "eng", + de => "deu", + es => "spa", + fr => "fra", + it => "ita", +# ja => "jpn", # not available with tesseract 2 + nl => "nld", +); + +# weblink definitions for known tags, ie. wikidata:en:Q123 => https://www.wikidata.org/wiki/Q123 + +%weblink_templates = ( + + 'wikidata:en' => { href => 'https://www.wikidata.org/wiki/%s', text => 'Wikidata', parse => sub + { + my ($url) = @_; + if ($url =~ /^https?:\/\/www.wikidata.org\/wiki\/(Q\d+)$/) { + return $1 + } + + return; + } }, + +); + +# allow moving products to other instances of Product Opener on the same server +# e.g. OFF -> OBF +$options{other_servers} = { +opf => +{ + name => "Open Products Facts", + data_root => "/srv/opf", + www_root => "/srv/opf/html", + mongodb => "opf", + domain => "openproductsfacts.org", +}, +off => +{ + name => "Open Food Facts", + data_root => "/srv/off", + www_root => "/srv/off/html", + mongodb => "off", + domain => "openfoodfacts.org", +}, +opff => +{ + prefix => "opff", + name => "Open Pet Food Facts", + data_root => "/srv/opff", + www_root => "/srv/opff/html", + mongodb => "opff", + domain => "openpetfoodfacts.org", +} +}; + + +$options{no_nutrition_table} = 1; + +1; diff --git a/lib/ProductOpener/Config_opff.pm b/lib/ProductOpener/Config_opff.pm index d8f01305c1329..b79953e76c304 100644 --- a/lib/ProductOpener/Config_opff.pm +++ b/lib/ProductOpener/Config_opff.pm @@ -290,16 +290,16 @@ $options{other_servers} = { obf => { name => "Open Beauty Facts", - data_root => "/home/obf", - www_root => "/home/obf/html", + data_root => "/srv/obf", + www_root => "/srv/obf/html", mongodb => "obf", domain => "openbeautyfacts.org", }, off => { name => "Open Food Facts", - data_root => "/home/off", - www_root => "/home/off/html", + data_root => "/srv/off", + www_root => "/srv/off/html", mongodb => "off", domain => "openfoodfacts.org", }, @@ -307,8 +307,8 @@ opff => { prefix => "opff", name => "Open Pet Food Facts", - data_root => "/home/opff", - www_root => "/home/opff/html", + data_root => "/srv/opff", + www_root => "/srv/opff/html", mongodb => "opff", domain => "openpetfoodfacts.org", } diff --git a/lib/ProductOpener/Display.pm b/lib/ProductOpener/Display.pm index 6ef75c47b855d..a3ff38eaea505 100644 --- a/lib/ProductOpener/Display.pm +++ b/lib/ProductOpener/Display.pm @@ -2068,7 +2068,8 @@ sub display_tag($) { my $weblinks_html = ''; my @map_layers = (); - if (not defined $request_ref->{groupby_tagtype}) { + if ( ($tagtype ne 'additives') + and (not defined $request_ref->{groupby_tagtype})) { my @weblinks = (); if ((defined $properties{$tagtype}) and (defined $properties{$tagtype}{$canon_tagid})) { foreach my $key (keys %weblink_templates) { @@ -2118,6 +2119,8 @@ sub display_tag($) { foreach my $field_orig (@{$options{"display_tag_" . $tagtype}}) { my $field = $field_orig; + + $log->debug("display_tag - field", { field => $field }) if $log->is_debug(); my $array = 0; if ($field =~ /^\@/) { @@ -2125,105 +2128,400 @@ sub display_tag($) { $array = 1; } - my $fieldid = get_fileid($field); + # Section title? + + if ($field =~ /^title:/) { + $field = $'; + my $title = lang($tagtype . "_" . $field); + ($title eq "") and $title = lang($field); + $description .= "

" . $title . "

\n"; + $log->debug("display_tag - section title", { field => $field }) if $log->is_debug(); + next; + } + + + # Special processing + if ($field eq 'efsa_evaluation_exposure_table') { - my $propertyid = $fieldid; + $log->debug("display_tag - efsa_evaluation_exposure_table", { efsa_evaluation_overexposure_risk => $properties{$tagtype}{$canon_tagid}{"efsa_evaluation_overexposure_risk:en:"} }) if $log->is_debug(); - if ((defined $properties{$tagtype}) and (defined $properties{$tagtype}{$canon_tagid}) - and (defined $properties{$tagtype}{$canon_tagid}{$fieldid. ":" . $lc}) ) { - $propertyid = $fieldid. ":" . $lc; + if ((defined $properties{$tagtype}) and (defined $properties{$tagtype}{$canon_tagid}) + and (defined $properties{$tagtype}{$canon_tagid}{"efsa_evaluation_overexposure_risk:en"}) + and ($properties{$tagtype}{$canon_tagid}{"efsa_evaluation_overexposure_risk:en"} ne 'en:no')) { + + $log->debug("display_tag - efsa_evaluation_exposure_table - yes", { }) if $log->is_debug(); + + my @groups = qw(infants toddlers children adolescents adults elderly); + my @percentiles = qw(mean 95th); + my @doses = qw(noael adi); + my %doses = (); + + my %exposure = (mean => {}, '95th' => {}); + + # in taxonomy: + # efsa_evaluation_exposure_95th_greater_than_adi:en: en:adults, en:elderly, en:adolescents, en:children, en:toddlers, en:infants + + foreach my $dose (@doses) { + foreach my $percentile (@percentiles) { + my $exposure_property = "efsa_evaluation_exposure_" . $percentile . "_greater_than_" . $dose . ":en"; + if (defined $properties{$tagtype}{$canon_tagid}{$exposure_property}) { + foreach my $groupid (split(/,/, $properties{$tagtype}{$canon_tagid}{$exposure_property})) { + my $group = $groupid; + $group =~ s/^\s*en://; + $group =~ s/\s+$//; + + # NOAEL has priority over ADI + if (not exists $exposure{$percentile}{$group}) { + $exposure{$percentile}{$group} = $dose; + $doses{$dose} = 1; # to display legend for the dose + $log->debug("display_tag - exposure_table ", { group => $group, percentile => $percentile, dose => $dose }) if $log->is_debug(); + } + } + } + } + } + + $styles .= < + + + + +HTML +; + + foreach my $group (@groups) { + + $table .= ""; + } + + $table .= "\n\n\n\n\n"; + + foreach my $group (@groups) { + + $table .= '"; + } + + $table .= "\n"; + + my %icons = ( + adi => 'moderate', + noael => 'high', + ); + + foreach my $percentile (@percentiles) { + + $table .= ""; + + foreach my $group (@groups) { + + $table .= ""; + } + + $table .= "\n"; + } + + $table .= "\n
 " . lang($group) . "
 ' . lang($group . "_age") . "
" . lang("exposure_title_" . $percentile) . "
(" + . lang("exposure_description_" . $percentile) . ")
"; + + my $dose = $exposure{$percentile}{$group}; + + if (not defined $dose ) { + $table .= " "; + } + else { + $table .= ''
+									. lang('; + } + + $table .= "
\n"; + + $description .= $table; + + foreach my $dose (@doses) { + if (exists $doses{$dose}) { + $description .= "

" . ''
+									. lang( : ' + . lang("additives_efsa_evaluation_exposure_greater_than_" . $dose) . "

\n"; + } + } + } + next; } - elsif ((defined $properties{$tagtype}) and (defined $properties{$tagtype}{$canon_tagid}) - and (defined $properties{$tagtype}{$canon_tagid}{$fieldid. ":" . "en"}) ) { - $propertyid = $fieldid. ":" . "en"; - } - print STDERR "option display_tag_$tagtype - field_orig: $field_orig - field: $field - fieldid: $fieldid propertyid: - $propertyid - array: $array\n"; + my $fieldid = get_fileid($field); + $fieldid =~ s/-/_/g; + + my %propertyid = (); + + + # Check if we have properties in the interface language, otherwise use English + + + if ((defined $properties{$tagtype}) and (defined $properties{$tagtype}{$canon_tagid}) ) { + + $log->debug("display_tag - checking properties", { tagtype => $tagtype, canon_tagid => $canon_tagid, field => $field}) if $log->is_debug(); + + + foreach my $key ('property', 'description', 'abstract', 'url', 'date') { + + my $suffix = "_" . $key; + if ($key eq 'property') { + $suffix = ''; + } + + if (defined $properties{$tagtype}{$canon_tagid}{$fieldid . $suffix . ":" . $lc}) { + $propertyid{$key} = $fieldid . $suffix . ":" . $lc; + $log->debug("display_tag - property key is defined for lc $lc", { tagtype => $tagtype, canon_tagid => $canon_tagid, field => $field, key => $key, propertyid => $propertyid{$key} }) if $log->is_debug(); + } + elsif (defined $properties{$tagtype}{$canon_tagid}{$fieldid . $suffix . ":" . "en"}) { + $propertyid{$key} = $fieldid . $suffix .":" . "en"; + $log->debug("display_tag - property key is defined for en", { tagtype => $tagtype, canon_tagid => $canon_tagid, field => $field, key => $key, propertyid => $propertyid{$key} }) if $log->is_debug(); + } + else { + $log->debug("display_tag - property key is not defined", { tagtype => $tagtype, canon_tagid => $canon_tagid, field => $field, key => $key, propertyid => $propertyid{$key} }) if $log->is_debug(); + } + } + } + + $log->debug("display_tag", { tagtype => $tagtype, canon_tagid => $canon_tagid, field_orig => $field_orig, field => $field, propertyid => $propertyid{property}, array => $array }) if $log->is_debug(); - if ((defined $properties{$tagtype}) and (defined $properties{$tagtype}{$canon_tagid}) - and (defined $properties{$tagtype}{$canon_tagid}{$propertyid}) ) { + if ((defined $propertyid{property}) or (defined $propertyid{abstract})) { - my $title = $field; + # abstract? + + if (defined $propertyid{abstract}) { + + my $site = $fieldid; + + $log->debug("display_tag - showing abstract", { site => $site }) if $log->is_debug(); + + $description .= "

" . $properties{$tagtype}{$canon_tagid}{$propertyid{abstract}} ; + + if (defined $propertyid{url}) { + + my $lang_site = lang($site); + if ((defined $lang_site) and ($lang_site ne "")) { + $site = $lang_site; + } + $description .= ' - ' . $site . ''; + } + + $description .= "

"; + + next; + } + + + my $title; my $tagtype_field = $tagtype . '_' . $fieldid; - $tagtype_field =~ s/_/-/g; + # $tagtype_field =~ s/_/-/g; if (exists $Lang{$tagtype_field}{$lc}) { $title = $Lang{$tagtype_field}{$lc}; } + elsif (exists $Lang{$fieldid}{$lc}) { + $title = $Lang{$fieldid}{$lc}; + } - $description .= "

" . $title . "" . separator_before_colon($lc) . ": "; + $log->debug("display_tag - title", { tagtype => $tagtype, title => $title }) if $log->is_debug(); + + $description .= "

"; + + if (defined $title) { + $description .= "" . $title . "" . separator_before_colon($lc) . ": "; + } + + my @values = ( $properties{$tagtype}{$canon_tagid}{$propertyid{property}} ); if ($array) { - foreach my $value (split(/,/, $properties{$tagtype}{$canon_tagid}{$propertyid})) { + @values = split(/,/, $properties{$tagtype}{$canon_tagid}{$propertyid{property}}); + } + + my $values_display = ""; + + foreach my $value_orig (@values) { + + my $value = $value_orig; # make a copy so that we can modify it inside the foreach loop + + next if $value =~ /^\s*$/; + + $value =~ s/^\s+//; + $value =~ s/\s+$//; + + my $property_tagtype = $fieldid; - next if $value =~ /^\s*$/; + $property_tagtype =~ s/-/_/g; + + if (not exists $taxonomy_fields{$property_tagtype}) { + # try with an additional s + $property_tagtype .= "s"; + } + + $log->debug("display_tag", { property_tagtype => $property_tagtype, lc => $lc, value => $value }) if $log->is_debug(); + + my $display = $value; + + if (exists $taxonomy_fields{$property_tagtype}) { + + $display = display_taxonomy_tag($lc, $property_tagtype, $value); - $value =~ s/^\s+//; - $value =~ s/\s+$//; + $log->debug("display_tag - $property_tagtype is a taxonomy", { display => $display }) if $log->is_debug(); - my $property_tagtype = $fieldid; + if ((defined $properties{$property_tagtype}) and (defined $properties{$property_tagtype}{$value}) ) { - $property_tagtype =~ s/-/_/g; + # tooltip - if (not exists $taxonomy_fields{$property_tagtype}) { - # try with an additional s - $property_tagtype .= "s"; + my $tooltip; + + if (defined $properties{$property_tagtype}{$value}{"description:$lc"}) { + $tooltip = $properties{$property_tagtype}{$value}{"description:$lc"}; + } + elsif (defined $properties{$property_tagtype}{$value}{"description:en"}) { + $tooltip = $properties{$property_tagtype}{$value}{"description:en"} + } + + if (defined $tooltip) { + $display = '' . $display . ''; + } + else { + $log->debug("display_tag - no tooltip", { property_tagtype => $property_tagtype, value => $value }) if $log->is_debug(); + } + + } + else { + $log->debug("display_tag - no property found", { property_tagtype => $property_tagtype, value => $value }) if $log->is_debug(); } + } + else { + $log->debug("display_tag - not a taxonomy", { property_tagtype => $property_tagtype, value => $value }) if $log->is_debug(); - print STDERR "OBF - lc: $lc - property_tagtype: $property_tagtype - value: $value\n"; + # Do we have a translation for the field? - my $display = $value; + my $valueid = $value; + $valueid =~ s/^en://; - if (exists $taxonomy_fields{$property_tagtype}) { + # check if the value translate to a field specific value - $display = display_taxonomy_tag($lc, $property_tagtype, $value); - - print STDERR "OBF - property_tagtype: $property_tagtype - exists - value: $value - display: $display \n"; + if (exists $Lang{$tagtype_field . "_" . $valueid}{$lc}) { + $display = $Lang{$tagtype_field . "_" . $valueid }{$lc}; + } + + # check if we have an icon + if (exists $Lang{$tagtype_field . "_icon_alt_" . $valueid}{$lc}) { + my $alt = $Lang{$tagtype_field . "_icon_alt_" . $valueid }{$lc}; + my $iconid = $tagtype_field . "_icon_" . $valueid; + $iconid =~ s/_/-/g; + $display = < +

+$alt +
+
+$display +
+ +HTML +; + } + + + # otherwise check if we have a general value - if ((defined $properties{$property_tagtype}) and (defined $properties{$property_tagtype}{$value}) ) { + elsif (exists $Lang{$valueid}{$lc}) { + $display = $Lang{$valueid}{$lc}; + } + + $log->debug("display_tag - display value", { display => $display }) if $log->is_debug(); + + # tooltip + + if (exists $Lang{$valueid . "_description"}{$lc}) { + + my $tooltip = $Lang{$valueid . "_description"}{$lc}; - my $tooltip; - - if (defined $properties{$property_tagtype}{$value}{"description:$lc"}) { - $tooltip = $properties{$property_tagtype}{$value}{"description:$lc"}; - } - elsif (defined $properties{$property_tagtype}{$value}{"description:en"}) { - $tooltip = $properties{$property_tagtype}{$value}{"description:en"} - } - - if (defined $tooltip) { - $display = '' . $display . ''; - } - else { - print STDERR "OBF - no description for $value\n"; - } - } - else { - print STDERR "OBF - no properties for $value\n"; - } + $display = '' . $display . ''; + + } + else { + $log->debug("display_tag - no description", { valueid => $valueid }) if $log->is_debug(); + } + + # link + + if (exists $propertyid{url}) { + $display = '' + . $display . ""; + } + if (exists $Lang{$valueid . "_url"}{$lc}) { + $display = '' + . $display . ""; } else { - print STDERR "OBF - property_tagtype: $property_tagtype is not a loaded taxonomy\n"; + $log->debug("display_tag - no url", { valueid => $valueid }) if $log->is_debug(); } - - $description .= $display . ", "; + + # date + + if (exists $propertyid{date}) { + $display .= " (" . $properties{$tagtype}{$canon_tagid}{$propertyid{date}} . ")"; + } + if (exists $Lang{$valueid . "_date"}{$lc}) { + $display .= " (" . $Lang{$valueid . "_date"}{$lc} . ")"; + } + else { + $log->debug("display_tag - no date", { valueid => $valueid }) if $log->is_debug(); + } + } - $description =~ s/, $//; - } - else { - $description .= $properties{$tagtype}{$canon_tagid}{$propertyid}; + + $values_display .= $display . ", "; } + $values_display =~ s/, $//; - $description .= "

\n"; + $description .= $values_display . "

\n"; + # Display an optional description of the property + + if (exists $Lang{$tagtype_field . "_description"}{$lc}) { + $description .= "

" . $Lang{$tagtype_field . "_description"}{$lc} . "

"; + } + + } + else { + $log->debug("display_tag - property not defined", { tagtype => $tagtype, property_id => $propertyid{property}, canon_tagid => $canon_tagid }) if $log->is_debug(); } } + + # Remove titles without content + + $description =~ s/

([^<]+)<\/h3>\s*(

)/

/isg; + $description =~ s/

([^<]+)<\/h3>\s*$//isg; + } + $description =~ s//$title/g; + if (defined $ingredients_classes{$tagtype}) { my $class = $tagtype; @@ -2809,6 +3107,10 @@ sub search_and_display_products($$$$$) { $count = $request_ref->{structured_response}{count}; + if (defined $request_ref->{description}) { + $request_ref->{description} =~ s//$count/g; + } + my $html = ''; my $html_pages = ''; my $html_count = ''; @@ -6493,6 +6795,16 @@ HTML ; } + if ($tagtype eq 'additives') { + + $styles .= <"; foreach my $tagid (@{$product_ref->{$tagtype_field . '_tags'}}) { @@ -6510,13 +6822,42 @@ HTML } my $info = ''; + my $more_info = ''; if ($class eq 'additives') { + + my $canon_tagid = $tagid; $tagid =~ s/.*://; # levels are defined only in old French list if ($ingredients_classes{$class}{$tagid}{level} > 0) { $info = ' class="additives_' . $ingredients_classes{$class}{$tagid}{level} . '" title="' . $ingredients_classes{$class}{$tagid}{warning} . '" '; } + + if ((defined $properties{$tagtype}) and (defined $properties{$tagtype}{$canon_tagid}) + and (defined $properties{$tagtype}{$canon_tagid}{"efsa_evaluation_overexposure_risk:en"}) + and ($properties{$tagtype}{$canon_tagid}{"efsa_evaluation_overexposure_risk:en"} ne 'en:no')) { + + my $tagtype_field = "additives_efsa_evaluation_overexposure_risk"; + my $valueid = $properties{$tagtype}{$canon_tagid}{"efsa_evaluation_overexposure_risk:en"}; + $valueid =~ s/^en://; + + # check if we have an icon + if (exists $Lang{$tagtype_field . "_icon_alt_" . $valueid}{$lc}) { + my $alt = $Lang{$tagtype_field . "_icon_alt_" . $valueid }{$lc}; + my $iconid = $tagtype_field . "_icon_" . $valueid; + $iconid =~ s/_/-/g; + $more_info = < +$alt + + +$alt + +HTML +; + } + + } } if ((defined $tags_levels{$lc}{$tagtype}) and (defined $tags_levels{$lc}{$tagtype}{$tagid})) { @@ -6524,7 +6865,7 @@ HTML } - $html_ingredients_classes .= "
  • " . $tag . "
  • \n"; + $html_ingredients_classes .= "
  • " . $tag . "$more_info
  • \n"; } $html_ingredients_classes .= ""; } diff --git a/po/common/common.pot b/po/common/common.pot index 3377fc2980405..c51400d27e1b5 100644 --- a/po/common/common.pot +++ b/po/common/common.pot @@ -3000,3 +3000,161 @@ msgctxt "footer_partners_link" msgid "/partners" msgstr "" + +msgctxt "adults" +msgid "Adults" +msgstr "" + +msgctxt "adults_age" +msgid "18 to 64" +msgstr "" + +msgctxt "adults_description" +msgid "From 18 years up to and including 64 years of age" +msgstr "" + +msgctxt "elderly" +msgid "Elderly" +msgstr "" + +msgctxt "elderly_age" +msgid "65+" +msgstr "" + + +msgctxt "elderly_description" +msgid "From 65 years of age and older" +msgstr "" + +msgctxt "adolescents" +msgid "Adolescents" +msgstr "" + +msgctxt "adolescents_age" +msgid "11 to 17" +msgstr "" + +msgctxt "adolescents_description" +msgid "From 10 years up to and including 17 years of age" +msgstr "" + +msgctxt "children" +msgid "Children" +msgstr "" + +msgctxt "children_age" +msgid "3 to 9" +msgstr "" + +msgctxt "children_description" +msgid "From 36 months up to and including 9 years of age" +msgstr "" + +msgctxt "toddlers" +msgid "Toddlers" +msgstr "" + +msgctxt "toddlers_age" +msgid "1 to 2" +msgstr "" + +msgctxt "toddlers_description" +msgid "From 12 months up to and including 35 months of age" +msgstr "" + +msgctxt "infants" +msgid "Infants" +msgstr "" + +msgctxt "infants_age" +msgid "< 1" +msgstr "" + +msgctxt "infants_description" +msgid "From more than 12 weeks up to and including 11 months of age" +msgstr "" + +msgctxt "additives_efsa_evaluation" +msgid "EFSA evaluation" +msgstr "" + +msgctxt "additives_efsa_evaluation_overexposure_risk_title" +msgid "Risk of overexposure" +msgstr "" + +msgctxt "additives_efsa_evaluation_overexposure_risk_high" +msgid "The European Food Safety Authority (EFSA) has determined that some population groups have a high risk of consuming too much ." +msgstr "" + +msgctxt "additives_efsa_evaluation_overexposure_risk_moderate" +msgid "The European Food Safety Authority (EFSA) has determined that some population groups have a moderate risk of consuming too much ." +msgstr "" + +msgctxt "additives_efsa_evaluation_overexposure_risk_description" +msgid "To evaluate your exposure to the food additive, you can browse our list of products that contain it. See the list of products with below." +msgstr "" + +msgctxt "additives_efsa_evaluation_overexposure_risk_products_link" +msgid "%d products with %s" +msgstr "" + +msgctxt "additives_efsa_evaluation_overexposure_risk_no" +msgid "The European Food Safety Authority (EFSA) has determined that no population groups has more than 5% of members at risk of consuming more than the acceptable daily intake of ." +msgstr "" + +msgctxt "additives_efsa_evaluation_overexposure_risk_icon_alt_high" +msgid "High risk of over exposure" +msgstr "" + +msgctxt "additives_efsa_evaluation_overexposure_risk_icon_alt_moderate" +msgid "Moderate risk of over exposure" +msgstr "" + +msgctxt "additives_efsa_evaluation_exposure_greater_than_adi" +msgid "Risk of exceeding the acceptable daily intake (ADI)" +msgstr "" + +msgctxt "additives_efsa_evaluation_exposure_greater_than_noael" +msgid "Risk of exceeding the maximum dose without adverse effect (No observed adverse effect level - NOAEL)" +msgstr "" + +msgctxt "additives_efsa_evaluation_exposure_mean_greater_than_adi" +msgid "Groups with more than 50% of members exceeding the acceptable daily intake (ADI)" +msgstr "" + +msgctxt "additives_efsa_evaluation_exposure_95th_greater_than_adi" +msgid "Groups with more than 5% of members exceeding the acceptable daily intake (ADI)" +msgstr "" + +msgctxt "additives_efsa_evaluation_exposure_mean_greater_than_noael" +msgid "Groups with more than 50% of members exceeding the maximum dose without adverse effect (No observed adverse effect level - NOAEL)" +msgstr "" + +msgctxt "additives_efsa_evaluation_exposure_95th_greater_than_noael" +msgid "Groups with more than 5% of members exceeding the maximum dose without adverse effect (No observed adverse effect level - NOAEL)" +msgstr "" + +msgctxt "exposure_title_95th" +msgid "Some people" +msgstr "" + +msgctxt "exposure_description_95th" +msgid "over 5%" +msgstr "" + +msgctxt "exposure_title_mean" +msgid "Most people" +msgstr "" + +msgctxt "exposure_description_mean" +msgid "over 50%" +msgstr "" + +msgctxt "wikipedia" +msgid "Wikipedia" +msgstr "" + +msgctxt "additives_classes" +msgid "Functions" +msgstr "" + diff --git a/po/common/en.po b/po/common/en.po index 0c6f630795a00..833129ee72ab7 100644 --- a/po/common/en.po +++ b/po/common/en.po @@ -2815,6 +2815,160 @@ msgctxt "nutrition_data_prepared_exists" msgid "Nutrition facts are specified for the prepared product." msgstr "Nutrition facts are specified for the prepared product." +msgctxt "adults" +msgid "Adults" +msgstr "Adults" +msgctxt "adults_age" +msgid "18 to 64" +msgstr "18 to 64" +msgctxt "adults_description" +msgid "From 18 years up to and including 64 years of age" +msgstr "From 18 years up to and including 64 years of age" + +msgctxt "elderly" +msgid "Elderly" +msgstr "Elderly" + +msgctxt "elderly_age" +msgid "65+" +msgstr "65+" + + +msgctxt "elderly_description" +msgid "From 65 years of age and older" +msgstr "From 65 years of age and older" + +msgctxt "adolescents" +msgid "Adolescents" +msgstr "Adolescents" + +msgctxt "adolescents_age" +msgid "11 to 17" +msgstr "11 to 17" + +msgctxt "adolescents_description" +msgid "From 10 years up to and including 17 years of age" +msgstr "From 10 years up to and including 17 years of age" + +msgctxt "children" +msgid "Children" +msgstr "Children" + +msgctxt "children_age" +msgid "3 to 9" +msgstr "3 to 9" + +msgctxt "children_description" +msgid "From 36 months up to and including 9 years of age" +msgstr "From 36 months up to and including 9 years of age" + +msgctxt "toddlers" +msgid "Toddlers" +msgstr "Toddlers" + +msgctxt "toddlers_age" +msgid "1 to 2" +msgstr "1 to 2" + +msgctxt "toddlers_description" +msgid "From 12 months up to and including 35 months of age" +msgstr "From 12 months up to and including 35 months of age" + +msgctxt "infants" +msgid "Infants" +msgstr "Infants" + +msgctxt "infants_age" +msgid "< 1" +msgstr "< 1" + +msgctxt "infants_description" +msgid "From more than 12 weeks up to and including 11 months of age" +msgstr "From more than 12 weeks up to and including 11 months of age" + +msgctxt "additives_efsa_evaluation" +msgid "EFSA evaluation" +msgstr "EFSA evaluation" + +msgctxt "additives_efsa_evaluation_overexposure_risk_title" +msgid "Risk of overexposure" +msgstr "Risk of overexposure" + +msgctxt "additives_efsa_evaluation_overexposure_risk_high" +msgid "The European Food Safety Authority (EFSA) has determined that some population groups have a high risk of consuming too much ." +msgstr "The European Food Safety Authority (EFSA) has determined that some population groups have a high risk of consuming too much ." + +msgctxt "additives_efsa_evaluation_overexposure_risk_moderate" +msgid "The European Food Safety Authority (EFSA) has determined that some population groups have a moderate risk of consuming too much ." +msgstr "The European Food Safety Authority (EFSA) has determined that some population groups have a moderate risk of consuming too much ." + +msgctxt "additives_efsa_evaluation_overexposure_risk_description" +msgid "To evaluate your exposure to the food additive, you can browse our list of products that contain it. See the list of products with below." +msgstr "To evaluate your exposure to the food additive, you can browse our list of products that contain it. See the list of products with below." + +msgctxt "additives_efsa_evaluation_overexposure_risk_products_link" +msgid "%d products with %s" +msgstr "%d products with %s" + +msgctxt "additives_efsa_evaluation_overexposure_risk_no" +msgid "The European Food Safety Authority (EFSA) has determined that no population groups has more than 5% of members at risk of consuming more than the acceptable daily intake of ." +msgstr "The European Food Safety Authority (EFSA) has determined that no population groups has more than 5% of members at risk of consuming more than the acceptable daily intake of ." + +msgctxt "additives_efsa_evaluation_overexposure_risk_icon_alt_high" +msgid "High risk of over exposure" +msgstr "High risk of over exposure" + +msgctxt "additives_efsa_evaluation_overexposure_risk_icon_alt_moderate" +msgid "Moderate risk of over exposure" +msgstr "Moderate risk of over exposure" + +msgctxt "additives_efsa_evaluation_exposure_greater_than_adi" +msgid "Risk of exceeding the acceptable daily intake (ADI)" +msgstr "Risk of exceeding the acceptable daily intake (ADI)" + +msgctxt "additives_efsa_evaluation_exposure_greater_than_noael" +msgid "Risk of exceeding the maximum dose without adverse effect (No observed adverse effect level - NOAEL)" +msgstr "Risk of exceeding the maximum dose without adverse effect (No observed adverse effect level - NOAEL)" + +msgctxt "additives_efsa_evaluation_exposure_mean_greater_than_adi" +msgid "Groups with more than 50% of members exceeding the acceptable daily intake (ADI)" +msgstr "Groups with more than 50% of members exceeding the acceptable daily intake (ADI)" + +msgctxt "additives_efsa_evaluation_exposure_95th_greater_than_adi" +msgid "Groups with more than 5% of members exceeding the acceptable daily intake (ADI)" +msgstr "Groups with more than 5% of members exceeding the acceptable daily intake (ADI)" + +msgctxt "additives_efsa_evaluation_exposure_mean_greater_than_noael" +msgid "Groups with more than 50% of members exceeding the maximum dose without adverse effect (No observed adverse effect level - NOAEL)" +msgstr "Groups with more than 50% of members exceeding the maximum dose without adverse effect (No observed adverse effect level - NOAEL)" + +msgctxt "additives_efsa_evaluation_exposure_95th_greater_than_noael" +msgid "Groups with more than 5% of members exceeding the maximum dose without adverse effect (No observed adverse effect level - NOAEL)" +msgstr "Groups with more than 5% of members exceeding the maximum dose without adverse effect (No observed adverse effect level - NOAEL)" + +msgctxt "exposure_title_95th" +msgid "Some people" +msgstr "Some people" + +msgctxt "exposure_description_95th" +msgid "over 5%" +msgstr "over 5%" + +msgctxt "exposure_title_mean" +msgid "Most people" +msgstr "Most people" + +msgctxt "exposure_description_mean" +msgid "over 50%" +msgstr "over 50%" + +msgctxt "wikipedia" +msgid "Wikipedia" +msgstr "Wikipedia" + +msgctxt "additives_classes" +msgid "Functions" +msgstr "Functions" diff --git a/po/common/fr.po b/po/common/fr.po index 6862113166e4c..3b9ae9ee8e82e 100644 --- a/po/common/fr.po +++ b/po/common/fr.po @@ -2799,3 +2799,161 @@ msgctxt "nutrition_data_prepared_exists" msgid "Nutrition facts are specified for the prepared product." msgstr "Les informations nutritionnelles sont mentionnées pour le produit préparé." +msgctxt "adults" +msgid "Adults" +msgstr "Adultes" + +msgctxt "adults_age" +msgid "18 to 64" +msgstr "18 à 64" + +msgctxt "adults_description" +msgid "From 18 years up to and including 64 years of age" +msgstr "De 18 ans jusqu'à 64 ans" + +msgctxt "elderly" +msgid "Elderly" +msgstr "Personnes âgées" + +msgctxt "elderly_age" +msgid "65+" +msgstr "" + + +msgctxt "elderly_description" +msgid "From 65 years of age and older" +msgstr "A partir de 65 ans" + +msgctxt "adolescents" +msgid "Adolescents" +msgstr "Adolescents" + +msgctxt "adolescents_age" +msgid "11 to 17" +msgstr "11 à 17" + +msgctxt "adolescents_description" +msgid "From 10 years up to and including 17 years of age" +msgstr "De 10 ans jusqu'à 17 ans" + +msgctxt "children" +msgid "Children" +msgstr "Enfants" + +msgctxt "children_age" +msgid "3 to 9" +msgstr "3 à 9" + +msgctxt "children_description" +msgid "From 36 months up to and including 9 years of age" +msgstr "De 36 mois jusqu'à 9 ans" + +msgctxt "toddlers" +msgid "Toddlers" +msgstr "Jeunes enfants" + +msgctxt "toddlers_age" +msgid "1 to 2" +msgstr "1 à 2" + +msgctxt "toddlers_description" +msgid "From 12 months up to and including 35 months of age" +msgstr "De 12 mois jusqu'à 35 mois" + +msgctxt "infants" +msgid "Infants" +msgstr "Nourrissons" + +msgctxt "infants_age" +msgid "< 1" +msgstr "" + +msgctxt "infants_description" +msgid "From more than 12 weeks up to and including 11 months of age" +msgstr "De plus de 12 semaines jusqu'à 11 mois" + +msgctxt "additives_efsa_evaluation" +msgid "EFSA evaluation" +msgstr "Evaluation de l'EFSA" + +msgctxt "additives_efsa_evaluation_overexposure_risk_title" +msgid "Risk of overexposure" +msgstr "Risque de sur-exposition" + +msgctxt "additives_efsa_evaluation_overexposure_risk_high" +msgid "The European Food Safety Authority (EFSA) has determined that some population groups have a high risk of consuming too much ." +msgstr "L'Autorité Européenne de Sécurité des Aliments (AESA/EFSA) a déterminé que certains groupes de population ont un risque élevé de consommer trop de ." + +msgctxt "additives_efsa_evaluation_overexposure_risk_moderate" +msgid "The European Food Safety Authority (EFSA) has determined that some population groups have a moderate risk of consuming too much ." +msgstr "L'Autorité Européenne de Sécurité des Aliments (AESA/EFSA) a déterminé que certains groupes de population ont un risque modéré de consommer trop de ." + +msgctxt "additives_efsa_evaluation_overexposure_risk_description" +msgid "To evaluate your exposure to the food additive, you can browse our list of products that contain it. See the list of products with below." +msgstr "Pour évaluer votre exposition à l'additif alimentaire , vous pouvez parcourir la liste des produits qui en contiennent. Voir la liste des produits avec l'additif ci-dessous." + +msgctxt "additives_efsa_evaluation_overexposure_risk_products_link" +msgid "%d products with %s" +msgstr "%d produits avec %s" + +msgctxt "additives_efsa_evaluation_overexposure_risk_no" +msgid "The European Food Safety Authority (EFSA) has determined that no population groups has more than 5% of members at risk of consuming more than the acceptable daily intake of ." +msgstr "L'Autorité Européenne de Sécurité des Aliments (AESA/EFSA) a déterminé qu'aucun groupe de population a plus de 5% de membres à risque de consommer plus que la dose journalière admissible de ." + + +msgctxt "additives_efsa_evaluation_overexposure_risk_icon_alt_high" +msgid "High risk of over exposure" +msgstr "Risque élevé de sur-exposition" + +msgctxt "additives_efsa_evaluation_overexposure_risk_icon_alt_moderate" +msgid "Moderate risk of over exposure" +msgstr "Risque modéré de sur-exposition" + +msgctxt "additives_efsa_evaluation_exposure_greater_than_adi" +msgid "Risk of exceeding the acceptable daily intake (ADI)" +msgstr "Risque de dépasser la dose journalière admissible (DJA)" + +msgctxt "additives_efsa_evaluation_exposure_greater_than_noael" +msgid "Risk of exceeding the maximum dose without adverse effect (No observed adverse effect level - NOAEL)" +msgstr "Risque de dépasser la dose maximale sans effet nocif observable (DSENO)" + +msgctxt "additives_efsa_evaluation_exposure_mean_greater_than_adi" +msgid "Groups with more than 50% of members exceeding the acceptable daily intake (ADI)" +msgstr "Groupes avec plus de 50% de membres qui dépassent la dose journalière admissible (DJA)" + +msgctxt "additives_efsa_evaluation_exposure_95th_greater_than_adi" +msgid "Groups with more than 5% of members exceeding the acceptable daily intake (ADI)" +msgstr "Groupes avec plus de 5% de membres qui dépassent la dose journalière admissible (DJA)" + +msgctxt "additives_efsa_evaluation_exposure_mean_greater_than_noael" +msgid "Groups with more than 50% of members exceeding the maximum dose without adverse effect (No observed adverse effect level - NOAEL)" +msgstr "Groupes avec plus de 50% de membres qui dépassent la dose maximale sans effet nocif observable (DSENO)" + +msgctxt "additives_efsa_evaluation_exposure_95th_greater_than_noael" +msgid "Groups with more than 5% of members exceeding the maximum dose without adverse effect (No observed adverse effect level - NOAEL)" +msgstr "Groupes avec plus de 5% de membres qui dépassent la dose maximale sans effet nocif observable (DSENO)" + +msgctxt "exposure_title_95th" +msgid "Some people" +msgstr "Certaines personnes" + +msgctxt "exposure_description_95th" +msgid "over 5%" +msgstr "plus de 5%" + +msgctxt "exposure_title_mean" +msgid "Most people" +msgstr "La plupart des gens" + +msgctxt "exposure_description_mean" +msgid "over 50%" +msgstr "plus de 50%" + +msgctxt "wikipedia" +msgid "Wikipedia" +msgstr "Wikipédia" + +msgctxt "additives_classes" +msgid "Functions" +msgstr "Fonctions" + diff --git a/taxonomies/additives.result.sto b/taxonomies/additives.result.sto index b04a3ca9d9997..055187f772aa1 100644 Binary files a/taxonomies/additives.result.sto and b/taxonomies/additives.result.sto differ diff --git a/taxonomies/additives.txt b/taxonomies/additives.txt index 22a1040fa1025..f831f0c28d761 100644 --- a/taxonomies/additives.txt +++ b/taxonomies/additives.txt @@ -12,9 +12,6 @@ # Codex Alimentarius: # http://www.fao.org/gsfaonline/additives/details.html?id=322 -stopwords:fr:aux,au,de,le,du,la,a,et,avec -stopwords:en:of,with - synonyms:en:FD&C, FC and C, FDC, FFDCA, FDCA synonyms:en:n°, no, number, nb, # synonyms:en:no1, n1, 1 @@ -328,7 +325,7 @@ e_number:en:107 wikidata:en:Q424528 colour_index:en:CI 18965 -en:E110, Sunset yellow FCF, CI Food Yellow 3, Orange Yellow S, FD&C Yellow 6, FD & C Yellow No.6, FD and C Yellow No. 6, Yellow No.6, Yellow 6, FD and C Yellow 6, C.I. 15985, Sunset Yellow +en:E110, Sunset yellow FCF, CI Food Yellow 3, Orange Yellow S, FD&C Yellow 6, FD & C Yellow No.6, FD and C Yellow No. 6, Yellow No.6, Yellow 6, FD and C Yellow 6, C.I. 15985 bg:E110, Сънсет жълто FCF, CI хранително жълто 3, Yellow 6 cs:E110, Sunset yellow FCF, Yellow 6, Žluť SY, E 110 da:E110, Sunset yellow FCF, Yellow 6 @@ -495,8 +492,11 @@ e_number:en:123 mandatory_additive_class:en: en:colour wikidata:en:Q421074 colour_index:en:CI 16185 -efsa:en:http://www.efsa.europa.eu/fr/efsajournal/doc/1649.pdf efsa:en:http://www.efsa.europa.eu/fr/efsajournal/doc/3442.pdf +efsa_evaluation_url:en:http://www.efsa.europa.eu/fr/efsajournal/doc/1649.pdf +efsa_evaluation_date:en:2010/07/26 +efsa_evaluation:en:Scientific Opinion on the re‐evaluation of Amaranth (E 123) as a food additive +efsa_evaluation_overexposure_risk:en: en:no # adding Ponceau as a synonym, as E124 is the only authorized food additive with the Ponceau name @@ -663,6 +663,11 @@ wikidata:en:Q419895 colour_index:en:CI 16035 efsa:en:http://www.efsa.europa.eu/fr/efsajournal/doc/1327.pdf efsa:en:http://www.efsa.europa.eu/fr/efsajournal/doc/3234.pdf +efsa_evaluation_url:en: https://efsa.onlinelibrary.wiley.com/doi/10.2903/j.efsa.2015.4007 +efsa_evaluation_date:en: 2015/02/13 +efsa_evaluation:en: Refined exposure assessment for Allura Red AC (E 129) +efsa_evaluation_overexposure_risk:en: en:no + en:E130, Indanthrene blue RS, Indanthrone blue, indanthrene bg:E130, E130 food additive @@ -717,6 +722,12 @@ e_number:en:131 wikidata:en:Q420087 colour_index:en:CI 42051 efsa:en:http://www.efsa.europa.eu/fr/efsajournal/doc/2818.pdf +efsa_evaluation_url:en: https://efsa.onlinelibrary.wiley.com/doi/10.2903/j.efsa.2013.2818 +efsa_evaluation_date:en: 2013/03/01 +efsa_evaluation:en: Scientific Opinion on the re‐evaluation of Patent Blue V (E 131) as a food additive +efsa_evaluation_overexposure_risk:en: en:moderate +efsa_evaluation_exposure_mean_greater_than_adi:en: en:no-group +efsa_evaluation_exposure_95th_greater_than_adi:en: en:children, en:toddlers en:E132, Indigotine, indigo carmine, FD&C Blue 2, FD and C Blue 2 bg:E132, Индиготин, индиго кармин @@ -743,6 +754,14 @@ sl:E132, Indigotin, indigo karmin sv:E132, Indigotin, indigokarmin e_number:en:132 wikidata:en:Q410120 +efsa:en:http://www.efsa.europa.eu/fr/efsajournal/doc/2818.pdf +efsa_evaluation_url:en: https://efsa.onlinelibrary.wiley.com/doi/10.2903/j.efsa.2014.3768 +efsa_evaluation_date:en: 2014/07/25 +efsa_evaluation:en: Scientific Opinion on the re‐evaluation of Indigo Carmine (E 132) as a food additive +efsa_evaluation_overexposure_risk:en: en:moderate +efsa_evaluation_exposure_mean_greater_than_adi:en: en:no-group +efsa_evaluation_exposure_95th_greater_than_adi:en: en:children, en:toddlers + en:E133, Brilliant blue FCF, FD&C Blue 1, FD and C Blue 1, Blue 1, fd&c blue no. 1. bg:E133, Брилянтно синьо FCF @@ -1110,7 +1129,7 @@ cs:E150d, Amoniak-sulfitový karamel da:E150d, Ammonieret sulfiteret karamel de:E150d, Ammoniumsulfit-zuckerkulör el:E150d, Εναμμωνιο θειωδες καραμελοχρωμα -es:E150d, Caramelo de sulfito amónico, Caramelo sulfito de amoníaco +es:E150d, Caramelo de sulfito amónico, Caramelo sulfito de amoníaco, caramelo clase iv et:E150d, Ammooniumsulfitkaramell fi:E150d, Ammoniumsulfiittimenetelmän sokerikulööri fr:E150d, Caramel au sulfite d'ammonium, Caramel E150d, E150d (caramel), E150d caramel, Caramel IV - procédé au sulfite ammoniacal, Caramel IV, C.I. Natural Brown 10, FEMA no. 2235, Caramel Colour Ammonium Sulphite Process, Colour Sulphite Ammonia Caramel, Sulfite ammonia caramel, Colour E150d, Food Colour 150d, CAS 8028-89-5, acid-proof caramel, soft-drink caramel, Caramelo sulfito de amoníaco, caramelo a prueba de ácidos, caramelo, de bebidas gaseosas @@ -1267,6 +1286,12 @@ e_number:en:155 wikidata:en:Q424541 colour_index:en:CI 20285 efsa:en:http://www.efsa.europa.eu/fr/efsajournal/doc/1536.pdf +efsa_evaluation_url:en: https://efsa.onlinelibrary.wiley.com/doi/epdf/10.2903/j.efsa.2014.3719 +efsa_evaluation_date:en: 2014/05/28 +efsa_evaluation:en: Refined exposure assessment of Brown HT (E 155) +efsa_evaluation_overexposure_risk:en: en:high +efsa_evaluation_exposure_mean_greater_than_adi:en: en:children, en:toddlers +efsa_evaluation_exposure_95th_greater_than_adi:en: en:adults, en:adolescents, en:children, en:toddlers en:E15x, E15x food additive bg:E15x, E15x food additive @@ -2154,7 +2179,10 @@ sv:E170, Kalciumkarbonat, CI Pigment White 18 e_number:en:170 mandatory_additive_class:en: en:acidity-regulator, en:anti-caking-agent, en:stabiliser, en:firming-agent, en:flour-treatment-agent, en:glazing-agent, en:colour wikidata:en:Q23767 -efsa:en:http://www.efsa.europa.eu/fr/efsajournal/doc/2318.pdf +efsa_evaluation_url:en:http://www.efsa.europa.eu/fr/efsajournal/doc/2318.pdf +efsa_evaluation_date:en:2011/07/26 +efsa_evaluation:en:Scientific Opinion on re‐evaluation of calcium carbonate (E 170) as a food additive +efsa_evaluation_overexposure_risk:en: en:no en:E171, Titanium dioxide bg:E171, Титанов диоксид, Титанов двуокис, Титаниев двуокис, Титаниев диоксид @@ -3442,6 +3470,16 @@ sl:E250, Natrijev nitrit sv:E250, Natriumnitrit e_number:en:250 wikidata:en:Q339975 +# Mean>ADI adults 95th>ADI adults Mean>ADI elderly 95th>ADI elderly Mean>ADI adolescent 95>ADI adolescent Mean>ADI children 95th>ADI children Mean>ADI toddlers 95th>ADI toddlers Mean>ADI infants 95th>ADI infants +# 0 1 0 1 1 1 1 1 1 1 +efsa_evaluation_url:en: https://zenodo.org/record/1252752/files/EFSAOutputs_KJ_2018.xlsx +efsa_evaluation_date:en: 2017/06/15 +efsa_evaluation:en: Re-evaluation of potassium nitrite (E 249) and sodium nitrite (E 250) as food additives +efsa_evaluation_overexposure_risk:en: en:high +efsa_evaluation_exposure_mean_greater_than_adi:en: en:children, en:toddlers, en:infants +efsa_evaluation_exposure_95th_greater_than_adi:en: en:adults, en:elderly, en:adolescents, en:children, en:toddlers, en:infants + + en:E251, Sodium nitrate bg:E251, Натриев нитрат i. @@ -4446,13 +4484,13 @@ sv:E312, Dodecylgallat e_number:en:312 wikidata:en:Q418209 -en:E313, E313 food additive +en:E313, Ethyl gallate bg:E313, E313 food additive cs:E313, E313 food additive da:E313, E313 food additive de:E313, E313 food additive el:E313, E313 food additive -es:E313, E313 food additive +es:E313, Galato de etilo et:E313, E313 food additive fi:E313, E313 food additive fr:E313, Gallate d'éthyle @@ -4470,7 +4508,7 @@ sl:E313, E313 food additive sv:E313, E313 food additive e_number:en:313 -en:E314, E314 food additive +en:E314, Guaiacum bg:E314, E314 food additive cs:E314, E314 food additive da:E314, E314 food additive @@ -12194,7 +12232,23 @@ sk:E621, Glutaman sodný, Glutaman sodný, E 621 sl:E621, Mononatrijev glutamat, natrijev glutamat, mononatrijevgluamat sv:E621, Mononatriumglutamat, Natriumglutamat, Monosodiumglutamat, E 621, Smaksalt, Weijing e_number:en:621 +additives_classes:en: en:flavour-enhancer wikidata:en:Q179678 +wikipedia_url:en: https://en.wikipedia.org/wiki/Monosodium_glutamate +wikipedia_url:fr: https://fr.wikipedia.org/wiki/Glutamate_monosodique +wikipedia_title:en: Monosodium glutamate +wikipedia_title:fr: Glutamate monosodique +wikipedia_abstract:en: Monosodium glutamate (MSG, also known as sodium glutamate) is the sodium salt of glutamic acid, one of the most abundant naturally occurring non-essential amino acids. Glutamic acid is found naturally in tomatoes, grapes, cheese, mushrooms and other foods.MSG is used in the food industry as a flavor enhancer with an umami taste that intensifies the meaty, savory flavor of food, as naturally occurring glutamate does in foods such as stews and meat soups. It was first prepared in 1908 by Japanese biochemist Kikunae Ikeda, who was trying to isolate and duplicate the savory taste of kombu, an edible seaweed used as a base for many Japanese soups. MSG as a flavor enhancer balances, blends, and rounds the perception of other tastes.The U.S. Food and Drug Administration has given MSG its generally recognized as safe (GRAS) designation. A popular belief is that large doses of MSG can cause headaches and other feelings of discomfort, known as "Chinese restaurant syndrome," but double-blind tests fail to find evidence of such a reaction. The European Union classifies it as a food additive permitted in certain foods and subject to quantitative limits. MSG has the HS code 29224220 and the E number E621. +wikipedia_abstract:fr: Le glutamate monosodique, également connu sous le nom de glutamate de sodium, monosodium glutamate, GMS ou MSG, est le sel sodique de l'acide glutamique, l’un des acides aminés non essentiels les plus abondants dans la nature. La FDA (organisme américain de surveillance des aliments et des médicaments) a classé le GMS comme « GRAS », généralement reconnu inoffensif, et l'Union européenne l'a classé comme additif alimentaire mais l'ajout de glutamates n'y est pas autorisé dans le lait, les huiles et les émulsions de graisse, les pâtes, le cacao et les produits chocolatés, les jus de fruits. Le GMS possède le numéro E621. Le glutamate du GMS confère le même goût umami que le glutamate issu d'autres aliments. Les fabricants de produits alimentaires commercialisent et utilisent le GMS comme exhausteur de goût car il équilibre, mélange et arrondit la perception globale des autres goûts,. Les dénominations commerciales du glutamate monosodique comprennent AJI-NO-MOTO®, Vetsin et Ac'cent. +efsa_evaluation_url:en: https://efsa.onlinelibrary.wiley.com/doi/10.2903/j.efsa.2017.4910 +efsa_evaluation_date:en: 2017/07/12 +efsa_evaluation:en: Re‐evaluation of glutamic acid (E 620), sodium glutamate (E 621), potassium glutamate (E 622), calcium glutamate (E 623), ammonium glutamate (E 624) and magnesium glutamate (E 625) as food additives +efsa_evaluation_overexposure_risk:en: en:high +efsa_evaluation_exposure_mean_greater_than_adi:en: en:adults, en:adolescents, en:children, en:toddlers, en:infants +efsa_evaluation_exposure_95th_greater_than_adi:en: en:adults, en:elderly, en:adolescents, en:children, en:toddlers, en:infants +efsa_evaluation_exposure_mean_greater_than_noael:en: en:children, en:toddlers +efsa_evaluation_exposure_95th_greater_than_noael:en: en:adolescents, en:children, en:toddlers, en:infants + en:E622, Monopotassium glutamate, Potassium glutamate bg:E622, Монокалиев глутамат, Калиев глутамат