diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..b2834dc --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,38 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + +jobs: + backend: + runs-on: ubuntu-latest + defaults: + run: + working-directory: backend + steps: + - uses: actions/checkout@v7 + - uses: actions/setup-python@v7 + with: + python-version: "3.12" + cache: pip + cache-dependency-path: backend/requirements*.txt + - run: pip install -r requirements-dev.txt + - run: pytest + + frontend: + runs-on: ubuntu-latest + defaults: + run: + working-directory: frontend + steps: + - uses: actions/checkout@v7 + - uses: actions/setup-node@v7 + with: + node-version: 22 + cache: npm + cache-dependency-path: frontend/package-lock.json + - run: npm ci + - run: npm test + - run: npx tsc --noEmit diff --git a/.gitignore b/.gitignore index d49c024..b277542 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,7 @@ instance/ # Node (in case any exist at root level) node_modules/ +frontend/.test-dist/ npm-debug.log* yarn-debug.log* yarn-error.log* diff --git a/README.md b/README.md index d62135e..15212c5 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,108 @@ # AddiGuard -AddiGuard is a project designed to...maby later when tne project is finished +Point your phone at an ingredients label and AddiGuard tells you which food additives it found and how risky they are. -## Project Structure +The Expo app crops a photo to the on-screen ingredients frame and posts it to a Flask API. The API runs OCR on the image (EasyOCR), matches E-numbers, names and aliases against a database of additives, and returns a Red / Yellow / Green rating for curated additives or Unrated when risk information is missing, plus an overall rating for the label. -- **backend/**: Python Flask application -- **frontend/**: React Native (Expo) application +## Project structure -## Getting Started +- **backend/** – Flask API (`POST /api/scan`), SQLite via Flask-SQLAlchemy, EasyOCR + thefuzz for matching. +- **frontend/** – Expo (React Native) app with a camera screen and a results screen. -(Instructions to be added) +## Backend + +Requires Python 3.12. + +```bash +cd backend +python -m venv .venv && source .venv/bin/activate +pip install -r requirements.txt # CPU-only torch; ~1 GB +python seed.py # (re)creates the SQLite DB with sample additives +python import_additives.py # upserts the bundled Open Food Facts taxonomy, offline +FLASK_DEBUG=1 python run.py # serves on http://0.0.0.0:5000 +``` + +The OCR models (~100 MB) are downloaded on the first `/api/scan` request, so expect that call to be slow once. + +The additive schema includes a unique, nullable `e_number` (for example `E250`, `E150a` or `E101(i)`) and a JSON list of lowercase aliases. `seed.py` destructively rebuilds the database, so run it to adopt the new schema on an existing development database; there is no migration system yet. Back up any data you need first. The importer can then be run repeatedly without duplicating additives. It preserves the five seeded additives' existing factors and does not assign risk factors to newly imported entries. The bundled snapshot imports 643 concrete E-number entries, of which 638 are Unrated after seeding. Generic taxonomy categories and wildcard codes are excluded. + +The unmodified Open Food Facts snapshot and its source, checksum and licensing information are in `backend/data/`; importing and testing do not require network access. To use an updated raw taxonomy, run `python import_additives.py /path/to/additives.txt`. The importer invalidates the current process's alias index; restart other running API processes after import, particularly when updating existing aliases without adding rows. + +Configuration is via environment variables: + +| Variable | Default | Purpose | +| -------------- | ------------------------ | ---------------------------------------- | +| `DATABASE_URL` | `sqlite:///addiguard.db` | SQLAlchemy connection string | +| `FLASK_DEBUG` | unset | Set to `1` for the debugger and reloader | +| `PORT` | `5000` | Port for `python run.py` | + +Uploads are capped at 10 MB and must decode as an image. + +### Tests + +```bash +pip install -r requirements-dev.txt +pytest +``` + +## Frontend + +```bash +cd frontend +npm ci +npm test # pure crop geometry tests, no device required +npx tsc --noEmit +npx expo start +``` + +The app needs to reach the backend. By default it targets port 5000 on the machine that serves the Expo dev bundle, which works for a physical device on the same Wi‑Fi and for emulators. To point it elsewhere, create `frontend/.env`: + +``` +EXPO_PUBLIC_API_URL=http://192.168.1.20:5000/api +``` + +In development builds a **Mock Mode** switch on the camera screen returns canned results so the UI can be exercised without a backend. + +The camera measures the preview and scan frame, maps the frame through the preview's centered aspect-ratio fill to captured photo pixels, and crops before upload. The cropped image is downscaled to at most 1600 pixels on its long side and encoded as JPEG at quality 0.8. Only the framed region is sent to OCR. Mock Mode bypasses image processing. Scan results live in a React context rather than URL parameters; opening the results route without an in-memory scan redirects to the camera. + +## API + +`POST /api/scan` with a `multipart/form-data` body containing an `image` file. + +```json +{ + "status": "success", + "additives_found": 1, + "overall_risk_score": 0.83, + "overall_traffic_light": "Red", + "results": [ + { + "name": "Sodium Nitrite", + "matched_text": "e250", + "risk_score": 0.83, + "traffic_light": "Red", + "details": { "id": 1, "name": "Sodium Nitrite", "e_number": "E250", "aliases": ["sodium nitrite"], "toxicity_level": 9, "...": "..." } + } + ] +} +``` + +Errors return `{ "error": "..." }` with a 4xx/5xx status. + +Each result includes `matched_text`, the normalized OCR phrase or code that triggered detection. Names and aliases match on phrase boundaries, with conservative fuzzy matching for longer aliases to tolerate OCR mistakes; short aliases such as `MSG` only match exactly. Explicit E-number variants such as `E 250` and `E-250` are recognized, while bare numbers require an additive-class context such as `preservative (250)` or `flavour enhancer (621)`. Multiple hits for the same additive produce one result. + +### Risk score + +Each additive has four 1–10 factors. The score is a weighted sum normalised to 0–1: + +``` +risk = toxicity·0.4 + exposure·0.3 + sensitivity·0.2 + cumulative·0.1 +``` + +`> 0.7` is Red, `0.4–0.7` is Yellow, `< 0.4` is Green. The overall label rating is the highest-scoring additive found. The backend is the only place these thresholds live; the app just renders the `traffic_light` values it receives. + +If any risk factor is null, that additive has `risk_score: null` and `traffic_light: "Unrated"`. Unrated detections are shown with a grey information badge and excluded from the overall score; they are not a claim of safety. If every detection is Unrated, the overall score is null and the overall traffic light is Unrated. An empty result retains `overall_risk_score: 0` and `overall_traffic_light: "Green"` for compatibility; no detection is not proof of a safe label. + +## Status + +Early MVP. The seed data has five additives with placeholder risk factors and health notes; none of it is medical advice. Open Food Facts expands detection coverage, not the curated risk database. OCR and approximate matching can still miss ingredients or return false positives, and the preview-to-photo mapping still needs validation on physical iOS and Android devices. diff --git a/backend/app.py b/backend/app.py deleted file mode 100644 index e14c4c5..0000000 --- a/backend/app.py +++ /dev/null @@ -1,10 +0,0 @@ -from flask import Flask - -app = Flask(__name__) - -@app.route('/') -def hello(): - return "AddiGuard Backend is running!" - -if __name__ == '__main__': - app.run(debug=True, host='0.0.0.0', port=5000) diff --git a/backend/app/__init__.py b/backend/app/__init__.py index 7a50119..7fce085 100644 --- a/backend/app/__init__.py +++ b/backend/app/__init__.py @@ -1,21 +1,31 @@ -from flask import Flask +import os + +from flask import Flask, jsonify +from flask_cors import CORS +from werkzeug.exceptions import HTTPException + from app.models import db from app.routes import scan_bp -def create_app(): + +def create_app(test_config=None): app = Flask(__name__) - - # Configuration - app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///addiguard.db' - app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False + app.config.from_mapping( + SQLALCHEMY_DATABASE_URI=os.environ.get("DATABASE_URL", "sqlite:///addiguard.db"), + SQLALCHEMY_TRACK_MODIFICATIONS=False, + MAX_CONTENT_LENGTH=10 * 1024 * 1024, + ) + if test_config: + app.config.update(test_config) - # Initialize extensions db.init_app(app) - - # Register Blueprints - app.register_blueprint(scan_bp, url_prefix='/api') + CORS(app, resources={r"/api/*": {"origins": "*"}}) + app.register_blueprint(scan_bp, url_prefix="/api") + + @app.errorhandler(HTTPException) + def handle_http_error(error): + return jsonify({"error": error.description}), error.code - # Create tables with app.app_context(): db.create_all() diff --git a/backend/app/models.py b/backend/app/models.py index 5617848..b924b8f 100644 --- a/backend/app/models.py +++ b/backend/app/models.py @@ -11,13 +11,15 @@ class Additive(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(255), unique=True, nullable=False) + e_number = db.Column(db.String(16), unique=True, nullable=True) + aliases = db.Column(db.JSON, nullable=False, default=list) description = db.Column(db.Text, nullable=True) # Risk factors (1-10 scale) - toxicity_level = db.Column(db.Integer, default=1) # toxicity_score - exposure_level = db.Column(db.Integer, default=1) # exposure_risk - sensitivity_level = db.Column(db.Integer, default=1) # sensitivity - cumulative_level = db.Column(db.Integer, default=1) # cumulative_effect + toxicity_level = db.Column(db.Integer, nullable=True, default=None) # toxicity_score + exposure_level = db.Column(db.Integer, nullable=True, default=None) # exposure_risk + sensitivity_level = db.Column(db.Integer, nullable=True, default=None) # sensitivity + cumulative_level = db.Column(db.Integer, nullable=True, default=None) # cumulative_effect health_risk = db.Column(db.String(255), nullable=True) # Text description usage_limit = db.Column(db.String(255), nullable=True) @@ -26,6 +28,8 @@ def to_dict(self): return { 'id': self.id, 'name': self.name, + 'e_number': self.e_number, + 'aliases': self.aliases or [], 'description': self.description, 'toxicity_level': self.toxicity_level, 'exposure_level': self.exposure_level, diff --git a/backend/app/routes.py b/backend/app/routes.py index 84c522f..ce275ee 100644 --- a/backend/app/routes.py +++ b/backend/app/routes.py @@ -1,30 +1,38 @@ -from flask import Blueprint, request, jsonify +from io import BytesIO + +from flask import Blueprint, current_app, jsonify, request +from PIL import Image + from app.services.scan_service import ScanService scan_bp = Blueprint('scan', __name__) scan_service = ScanService() + @scan_bp.route('/scan', methods=['POST']) def scan_image(): - if 'image' not in request.files: + file = request.files.get('image') + if file is None or file.filename == '': return jsonify({"error": "No image provided"}), 400 - - file = request.files['image'] - if file.filename == '': - return jsonify({"error": "No selected file"}), 400 + + image_bytes = file.read() + try: + Image.open(BytesIO(image_bytes)).verify() + except Exception: + return jsonify({"error": "Uploaded file is not a valid image"}), 400 try: - # Read image bytes directly - image_bytes = file.read() - - # Analyze results = scan_service.analyze_image(image_bytes) - - return jsonify({ - "status": "success", - "additives_found": len(results), - "results": results - }) - - except Exception as e: - return jsonify({"error": str(e)}), 500 + except Exception: + current_app.logger.exception("Image analysis failed") + return jsonify({"error": "Image analysis failed"}), 500 + + rated_scores = [r["risk_score"] for r in results if r["risk_score"] is not None] + overall_risk_score = max(rated_scores) if rated_scores else (None if results else 0) + return jsonify({ + "status": "success", + "additives_found": len(results), + "overall_risk_score": overall_risk_score, + "overall_traffic_light": scan_service.determine_traffic_light(overall_risk_score), + "results": results + }) diff --git a/backend/app/services/scan_service.py b/backend/app/services/scan_service.py index 84ca3ef..1474f82 100644 --- a/backend/app/services/scan_service.py +++ b/backend/app/services/scan_service.py @@ -1,100 +1,180 @@ -import easyocr -import numpy as np -from thefuzz import process -from app.models import Additive +import re +import threading +from collections import defaultdict + +from flask import current_app +from sqlalchemy import func, select +from thefuzz import fuzz + +from app.models import Additive, db + + +_CODE_BODY = r"\d{3,4}[a-z]?(?:\s*\(\s*[ivx]+\s*\))?" +_E_NUMBER = re.compile(rf"\be\s*[-–—]?\s*({_CODE_BODY})(?!\w)", re.IGNORECASE) +_CLASS_CODES = re.compile( + r"\b(?:preservatives?|flavou?r enhancers?|colou?rs?|emulsifiers?|antioxidants?|" + r"sweeteners?|stabili[sz]ers?|thickeners?|acidity regulators?|raising agents?)" + rf"\s*[:(\[]?\s*({_CODE_BODY}(?:\s*[,;/]\s*{_CODE_BODY})*)(?!\w)", + re.IGNORECASE, +) + + +def normalize_e_number(value): + if not value: + return None + match = _E_NUMBER.fullmatch(str(value).strip()) + return "E" + re.sub(r"\s+", "", match.group(1)).lower() if match else None + + +def normalize_phrase(value): + text = str(value).lower() + text = re.sub(r"\b[a-z0]+\b", lambda m: m[0].replace("0", "o") if re.search(r"[a-z]", m[0]) else m[0], text) + return " ".join(re.findall(r"[^\W_]+", text)) + + +def match_additives(extracted_text, index): + raw = " ".join(extracted_text) + aliases, codes, fuzzy, widths = index + found = {} + for match in _E_NUMBER.finditer(raw): + key = codes.get(normalize_e_number(match[0])) + if key is not None: + found.setdefault(key, normalize_phrase(match[0])) + for match in _CLASS_CODES.finditer(raw): + for code in re.findall(_CODE_BODY, match[1], re.IGNORECASE): + key = codes.get(normalize_e_number(f"E{code}")) + if key is not None: + found.setdefault(key, code.lower()) + + tokens = normalize_phrase(_E_NUMBER.sub(" ", raw)).split() + occupied = set() + for width in widths: + for start in range(len(tokens) - width + 1): + span = set(range(start, start + width)) + if occupied & span: + continue + phrase = " ".join(tokens[start:start + width]) + if phrase in aliases: + for key in aliases[phrase]: + found.setdefault(key, phrase) + occupied.update(span) + + for width in widths: + for start in range(len(tokens) - width + 1): + span = set(range(start, start + width)) + if occupied & span: + continue + phrase = " ".join(tokens[start:start + width]) + # A lone word gets a stricter bar: one substitution in a word under twelve letters + # scores at most 90, which is exactly where everyday label words collide with + # additive names ("carbonated" vs "carbonates"). Multi-word phrases carry enough + # context to keep the looser threshold for OCR slips. + threshold = 91 if width == 1 else 88 + best_score, best_keys = threshold - 1, set() + for alias in fuzzy.get((width, phrase[0]), []): + if abs(len(alias) - len(phrase)) > max(1, len(alias) // 8): + continue + score = fuzz.ratio(alias, phrase) + if score > best_score: + best_score, best_keys = score, set(aliases[alias]) + elif score == best_score: + best_keys.update(aliases[alias]) + if best_score >= threshold and len(best_keys) == 1: + found.setdefault(next(iter(best_keys)), phrase) + occupied.update(span) + + return found + class ScanService: def __init__(self): - # Initialize EasyOCR reader (load once) - # For production, consider moving this to app startup or lazy loading - self.reader = easyocr.Reader(['en'], gpu=False) + self._reader = None + self._reader_lock = threading.Lock() + + @property + def reader(self): + # EasyOCR pulls in torch and downloads its models on first construction, + # so defer it until the first scan instead of paying for it on import. + # The lock keeps concurrent first requests from building two readers. + if self._reader is None: + with self._reader_lock: + if self._reader is None: + import easyocr + self._reader = easyocr.Reader(['en'], gpu=False) + return self._reader def extract_text(self, image_bytes): - """ - Extract text from image bytes using EasyOCR. - """ - try: - result = self.reader.readtext(image_bytes, detail=0) - return result - except Exception as e: - print(f"OCR Error: {e}") - return [] + return self.reader.readtext(image_bytes, detail=0) def calculate_risk_score(self, additive): - """ - Risk Formula: - total_risk = (toxicity_score * 0.4) + (exposure_risk * 0.3) + (sensitivity * 0.2) + (cumulative_effect * 0.1) - - Input levels are 1-10. We normalize to 0.1-1.0 for the formula if needed, - OR we calculate on 1-10 scale and divide by 10 to get 0-1 range. - - Let's calculate on 1-10 scale first. - """ - # Normalize 1-10 to 0.1-1.0 - t = additive.toxicity_level / 10.0 - e = additive.exposure_level / 10.0 - s = additive.sensitivity_level / 10.0 - c = additive.cumulative_level / 10.0 - - total_risk = (t * 0.4) + (e * 0.3) + (s * 0.2) + (c * 0.1) - return round(total_risk, 2) + factors = (additive.toxicity_level, additive.exposure_level, + additive.sensitivity_level, additive.cumulative_level) + if any(value is None for value in factors): + return None + return round(sum(value * weight / 10 for value, weight in zip(factors, (0.4, 0.3, 0.2, 0.1))), 2) def determine_traffic_light(self, risk_score): - """ - If > 0.7 -> High Risk (Red) - 0.4-0.7 -> Medium (Yellow) - < 0.4 -> Low (Green) - """ + if risk_score is None: + return "Unrated" if risk_score > 0.7: return "Red" - elif risk_score >= 0.4: + if risk_score >= 0.4: return "Yellow" - else: - return "Green" + return "Green" + + @classmethod + def refresh_alias_index(cls): + current_app.extensions.pop("additive_alias_index", None) + + @staticmethod + def _build_index(additives): + aliases = defaultdict(set) + codes = {} + for key, additive in additives.items(): + if additive.e_number: + codes[normalize_e_number(additive.e_number)] = key + for value in [additive.name, *(additive.aliases or [])]: + phrase = normalize_phrase(value) + if not phrase or not re.search(r"[^\W\d_]", phrase) or normalize_e_number(value): + continue + aliases[phrase].add(key) + fuzzy = defaultdict(list) + widths = set() + for phrase in aliases: + width = len(phrase.split()) + widths.add(width) + if len(phrase.replace(" ", "")) >= 6: + fuzzy[(width, phrase[0])].append(phrase) + return aliases, codes, fuzzy, sorted(widths, reverse=True) def analyze_image(self, image_bytes, additives_cache=None): - """ - 1. Extract text - 2. Match against DB - 3. Calculate Risk - """ extracted_text = self.extract_text(image_bytes) - - # Get all additives from DB (optimize by caching or specific query later) - # For MVP, fetching all names is fine if list is small. - if additives_cache is None: - all_additives = Additive.query.all() + if additives_cache is not None: + additives = dict(enumerate(additives_cache)) + index = self._build_index(additives) else: - all_additives = additives_cache - - additive_names = [a.name for a in all_additives] - - found_additives = [] - - # Simple text matching (can be improved) - # We iterate over extracted words and try to find fuzzy match in DB - # Alternatively, iterate over DB additives and check if they exist in text - - # Strategy: Iterate through DB names and check if they appear in the extracted text (fuzzy) - # Combine extracted text into one string for easier searching? - # Or match line by line. - - full_text = " ".join(extracted_text).lower() - - for additive in all_additives: - # Fuzzy match score - # partial_ratio matches substring - match_score = process.extractOne(additive.name.lower(), [full_text], scorer=process.fuzz.partial_ratio) - - if match_score and match_score[1] > 85: # Threshold for match - risk_score = self.calculate_risk_score(additive) - traffic_light = self.determine_traffic_light(risk_score) - - found_additives.append({ - "name": additive.name, - "risk_score": risk_score, - "traffic_light": traffic_light, - "details": additive.to_dict() - }) - - return found_additives + key = tuple(db.session.execute(select(func.count(Additive.id), func.max(Additive.id))).one()) + cached = current_app.extensions.get("additive_alias_index") + if cached is None or cached[0] != key: + additives = {a.id: a for a in Additive.query.all()} + index = self._build_index(additives) + current_app.extensions["additive_alias_index"] = (key, index) + else: + index = cached[1] + + found = match_additives(extracted_text, index) + + if additives_cache is None: + additives = {a.id: a for a in Additive.query.filter(Additive.id.in_(found)).all()} if found else {} + results = [] + for key in sorted(found): + additive = additives[key] + risk_score = self.calculate_risk_score(additive) + results.append({ + "name": additive.name, + "matched_text": found[key], + "risk_score": risk_score, + "traffic_light": self.determine_traffic_light(risk_score), + "details": additive.to_dict(), + }) + return results diff --git a/backend/data/PROVENANCE.md b/backend/data/PROVENANCE.md new file mode 100644 index 0000000..ee66488 --- /dev/null +++ b/backend/data/PROVENANCE.md @@ -0,0 +1,34 @@ +# Open Food Facts additive taxonomy snapshot + +`additives.txt` is an unmodified raw taxonomy from Open Food Facts and its +contributors, downloaded successfully on 2026-09-09 from: + +https://raw.githubusercontent.com/openfoodfacts/openfoodfacts-server/main/taxonomies/additives.txt + +Size: 1,114,164 bytes. + +SHA-256: `e30d5ad1316f8ecdaa3710e7b1632437c206843d0f9ff28b2068cd2dfe5445a5` + +Source project: https://openfoodfacts.org and +https://github.com/openfoodfacts/openfoodfacts-server. + +Open Food Facts publishes its database under the Open Database License (ODbL) +1.0 and individual database contents under the Database Contents License: +https://world.openfoodfacts.org/data and +https://world.openfoodfacts.org/terms-of-use. +Attribution and applicable share-alike obligations must be retained on reuse. + +The importer reads English entries with concrete E-numbers, including letter +and Roman-numeral subtypes. It skips wildcard codes and generic taxonomy +categories without an E-number. Escaped commas in synonyms are preserved. +Entries without an English descriptive name use their E-number as the name. +Names shared by distinct E-numbers are disambiguated with the code in the +database, while the original name remains an alias. + +The snapshot supplies detection vocabulary only. It does not supply AddiGuard +risk factors; the five placeholder ratings remain solely in `seed.py`. +All newly imported additives have null risk factors. + +To refresh, download the raw URL to `additives.txt`, update this provenance and +checksum, run importer and label tests, then restart the running API after +importing so that other processes discard their cached alias indexes. diff --git a/backend/data/additives.txt b/backend/data/additives.txt new file mode 100644 index 0000000..dc7b731 --- /dev/null +++ b/backend/data/additives.txt @@ -0,0 +1,26297 @@ +# For reference: +# +# EU list of additives: +# +# https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A02008R1333-20230720 +# Annex 2 REGULATION (EC) No 1333/2008 OF THE EUROPEAN PARLIAMENT AND OF THE +# COUNCIL +# of 16 December 2008 +# on food additives +# (Text with EEA relevance) +#3 +# Codex Alimentarius: +# http://www.fao.org/gsfaonline/additives/details.html?id=322 +# +# The ANSES (French Agency for Food, Environmental and Occupational Health & Safety) has listed 140 "additives of interest" in 2019 +# https://www.anses.fr/fr/content/rapport-oqali-bilan-et-%C3%A9volution-de-lutilisation-des-additifs-dans-les-produits-transform%C3%A9s +# those additives are tagged here after as follows: +# anses_additives_of_interest:en:yes +# with "en:yes" being the only possible value + +# stopwords for matching more additives +stopwords:en: of, for, added +stopwords:fr: de, d, des, du, l, le, la, les, a, au, aux, pour + +# synonyms need to be separated with an empty line +synonyms:en: FD&C, FD and C, FDC, FFDCA, FDCA + +synonyms:en: n°, no, number, nb + +synonyms:en: no1, n1, 1 + +synonyms:en: no2, n2, 2 + +synonyms:en: no3, n3, 3 + +synonyms:en: no4, n4, 4 + +synonyms:en: no5, n5, 5 + +synonyms:en: no6, n6, 6 + +synonyms:en: no7, n7, 7 + +synonyms:en: no8, n8, 8 + +synonyms:en: no9, n9, 9 + +synonyms:en: no10, n10, 10 + +synonyms:en: no11, n11, 11 + +synonyms:en: no12, n12, 12 + +synonyms:en: colour, color, colouring, coloring + +en: E100, Curcumin, Turmeric extract, curcuma extract, turmeric color +xx: E100 +ar: E100, كركومين +bg: E100, куркумин +bs: E100, kurkumin +ca: E100, curcumina +cs: E100, kurkumin +da: E100, curcumin, gurkemejeekstrakt +de: E100, Kurkumin, Kurkumaextrakt +el: E100, κουρκουμινη +es: E100, curcumina, extracto de cúrcuma +et: E100, kurkumiin +fa: E100, کورکومین +fi: E100, kurkumiini, kurkumiinia, kurkumiiniuutetta +fr: E100, curcumine, extrait de curcuma +ga: E100, curcumina +he: E100, כורכומין +hr: E100, kurkumin, ekstrakt kurkume, curcumin +hu: E100, kurkumin +id: E100, kurkumin +it: E100, curcumina, estratto di curcuma +ja: E100, クルクミン +kn: E100, ಕರ್ಕ್ಯುಮಿನ್ +ko: E100, 커큐민 +lt: E100, kurkuminas +lv: E100, kurkumīns, kurkuma ekstrakts +mt: E100, kurkumina +nb: E100, kurkumin +nl: E100, curcumine, kurkuma extract, kurkuma-extract +nl_be: E100, curcumine +pl: E100, kurkumina, ekstrakt z kurkumy, ekstrakt kurkumy, barwiący wyciąg z kurkumy, wyciąg z kurkumy +pt: E100, curcumina +ro: E100, curcumină +ru: E100, куркумины +sk: E100, kurkumín +sl: E100, kurkumin +sv: E100, kurkumin, gurkmejaextrakt +ta: E100, குர்க்குமின் +th: E100, เคอร์คูมิน +tr: E100, kurkumin +uk: E100, куркумін +vi: E100, curcumin +zh: E100, 姜黄素 +additives_classes:en: en:colour +anses_additives_of_interest:en: yes +# fr:curcumin 80 products in 2 languages @2018-10-11 +e_number:en: 100 +efsa_evaluation:en: Scientific Opinion on the re-evaluation of curcumin (E 100) as a food additive +efsa_evaluation_date:en: 2010-09-06 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2010.1679 +vegan:en: yes +vegetarian:en: yes +# azb:E100, کورکومین +# en-ca:E100, curcumin +# en-gb:E100, curcumin +# sr-ec:E100, куркумин +# sr-el:E100, kurkumin +# yue:E100, 薑黃素 +# zh-cn:E100, 姜黄素 +# zh-hans:E100, 姜黄素 +# zh-hant:E100, 薑黃素 +# zh-hk:E100, 薑黃素 +# zh-mo:E100, 薑黃素 +# zh-sg:E100, 姜黄素 +# zh-my:E100, 姜黄素 +# zh-tw:E100, 薑黃素 +wikidata:en: Q312266 +wikipedia:en: https://en.wikipedia.org/wiki/Curcumin + +# WARNING:e106 is the same as e101a, moved synonyms to E101a + +en: E106, flavin mononucleotide +xx: E106 +bg: E106, флавин мононуклеотид +cs: E106, flavinmononukleotid +da: E106, flavinmononukleotid +de: E106, Flavinmononukleotid +el: E106, φλαβίνη μονονουκλεοτίδιο +es: E106, flavín mononucleótido +et: E106, flavinmononukleotiid +fi: E106, flavinmononukleotidi +fr: E106, flavine mononucléotide +hu: E106, flavin-mononukleotid +it: E106, flavina mononucleotide +lt: E106, flavinmononukleotidas +lv: E106, flavīnmononukleotīds +mt: E106, flavin mononukleotid +nl: E106, flavinmononucleotide +pl: E106, Mononukleotyd flawinowy, flawinomononukleotyd +pt: E106, Mononucleótido de flavina +ro: E106, flavin mononucleotid +sk: E106, flavínmononukleotid +sl: E106, flavinmononukleotid +sv: E106, FMN +e_number:en: 106 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q376061 +# comment:en:used to be extracted from milk, but not anymore. + +en: E101, Riboflavin, Vitamin B2, Flavaxin, Vitamin B 2, Vitamin G, Riboflavine, Lactoflavine, Lactoflavin +xx: E101 +bg: E101, Рибофлавин +ca: E101, Riboflavina +cs: E101, Riboflavin, Ovoflavin, Vitamin B 2, Vitamin B2, Laktoflavin, Vitamín G, Lactoflavin +da: E101, Riboflavin, Vitamin B2, Vitamin B 2, Vitamin G, Lactoflavin +de: E101, Riboflavin, Vitamin B2, Vitamin G, Lactoflavin, Laktoflavin +el: E101, ριβοφλαβίνη, βιταμίνη Β2 +es: E101, Riboflavina, Vitamina B2, Lactoflavina +et: E101, Vitamiin B2, B2-vitamiin, Laktoflaviin, Riboflaviin +fi: E101, Riboflaviini, B2-vitamiini, Laktoflaviini, Riboflaviinia, B2-vitamiinia, Laktoflaviinia +fr: E101, Riboflavine, vitamine B2, Bacillus subtilis +hr: E101, riboflavini, riboflavin +hu: E101, Riboflavin, Laktoflavin, B2-vitamin +it: E101, Riboflavina, Vitamina G, Vitamina B2, C17H20N4O6 +lt: E101, Riboflavinas, Vitaminas G +lv: E101, B2 vitamīns, Riboflavīns +mt: E101, Riboflavina, Vitamina B2 +nl: E101, Riboflavine, Vitamine B2, Lactoflavine +nl_be: E101, Riboflavine, Vitamine B2, Lactoflavine +pl: E101, Witamina B2, Witamina G, Ryboflawina, Laktoflawina, Ryboflawiny +pt: E101, Riboflavina, Vitamina b2, Vitamina G +ro: E101, Riboflavină, Vitamina B2 +sk: E101, Riboflavín, Vitamín G, Ovoflavín, Vitamín B2, Laktoflavín +sl: E101, Riboflavin, Vitamin B2 +sv: E101, Riboflavin, Vitamin B2, B2-vitamin +tr: E101, Riboflavin, B2 Vitamini, B2 Vitamin, Vitamin B2, Laktoflavin +additives_classes:en: en:colour +e_number:en: 101 +efsa_evaluation:en: Scientific Opinion on the re-evaluation of riboflavin (E 101(i)) and riboflavin-5'-phosphate sodium (E 101(ii)) as food additives. +efsa_evaluation_date:en: 2013-10-22 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2013.3357 +vegan:en: maybe +vegetarian:en: yes +wikidata:en: Q130365 + +< en: E101 +en: E101(i), Riboflavin, Vitamin B2 +xx: E101(i) +bg: E101(i), Рибофлавин +ca: E101(i), Riboflavina +cs: E101(i), Riboflavin +da: E101(i), Riboflavin +de: E101(i), Riboflavin +el: E101(i), Ριβοφλαβινη +es: E101(i), Riboflavina, Vitamina B2 +et: E101(i), Riboflaviin +fi: E101(i), Riboflaviini, B2-vitamiini, Riboflaviinia, B2-vitamiinia +fr: E101(i), Riboflavine +hu: E101(i), Riboflavin +it: E101(i), Riboflavina +lt: E101(i), Riboflavinas +lv: E101(i), Riboflavīns +mt: E101(i), Riboflavina +nl: E101(i), Riboflavine +nl_be: E101(i), Riboflavine +pl: E101(i), Ryboflawina +pt: E101(i), Riboflavina +ro: E101(i), Riboflavină +sk: E101(i), Riboflavín +sl: E101(i), Riboflavin +sv: E101(i), Riboflavin +additives_classes:en: en:colour +e_number:en: 101 +efsa_evaluation:en: Scientific Opinion on the re-evaluation of riboflavin (E 101(i)) and riboflavin-5'-phosphate sodium (E 101(ii)) as food additives. +efsa_evaluation_adi_established:en: en:no +efsa_evaluation_date:en: 2013-10-22 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2013.3357 +wikidata:en: Q130365 + +< en: E101 +en: E101(ii), Riboflavin-5′-phosphate, phosphate lactoflavina +xx: E101(ii) +bg: E101(ii), Рибофлавин-5′-фосфат +ca: E101(ii), Riboflavina-5′-fosfat +cs: E101(ii), Riboflavin-5′-fosfát, Riboflavin-5′-fosforečnan +da: E101(ii), Riboflavin-5′-phosphat +de: E101(ii), Riboflavin-5′-phosphat +el: E101(ii), 5′-φωσφορικη ριβοφλαβινη +es: E101(ii), Riboflavina-5′-fosfato +et: E101(ii), Riboflaviin-5′-fosfaat +fi: E101(ii), Riboflaviini-5′-fosfaatti, Riboflaviini-5′-fosfaattia +fr: E101(ii), Riboflavine-5′-phosphate, Riboflavine-5-Sodium Phosphate, 5′-phosphate de riboflavine +hu: E101(ii), Riboflavin-5'-foszfát +it: E101(ii), Riboflavina-5′-fosfato +lt: E101(ii), Riboflavin-5′-fosfatas +lv: E101(ii), Riboflavīn-5′-fosfāts +mt: E101(ii), Riboflavina-5'-fosfat +nl: E101(ii), Riboflavine-5'-fosfaat +nl_be: E101(ii), Riboflavine-5'-fosfaat +pl: E101(ii), Ryboflawiny-5′-fosforan +pt: E101(ii), Riboflavina-5′-fosfato +ro: E101(ii), Riboflavină-5′-fosfat, Riboflavin-5-sodiu fosfat +sk: E101(ii), Riboflavín–5′–fosfát +sl: E101(ii), Riboflavin-5'-fosfat +sv: E101(ii), Riboflavin-5′-fosfat +additives_classes:en: en:colour +e_number:en: 101 +efsa_evaluation:en: Scientific Opinion on the re-evaluation of riboflavin (E 101(i)) and riboflavin-5'-phosphate sodium (E 101(ii)) as food additives. +efsa_evaluation_adi_established:en: en:no +efsa_evaluation_date:en: 2013-10-22 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2013.3357 +wikidata:en: Q130365 + +en: E101a, E101a food additive +xx: E101a +bg: E101a, E101a food additive +cs: E101a, E101a food additive +da: E101a, E101a food additive +de: E101a, 5'-Phosphat Natriumsalz der Riboflavin, Riboflavin-5'-phosphat-Natriumsalz +el: E101a, E101a food additive +es: E101a, 5'-fosfato de riboflavina sódica, riboflavina-5'-fosfato sódico +et: E101a, E101a food additive +fi: E101a, Flaviinimononukleotidi, Flaviinimononukleotidia, FMN +fr: E101a, 5'-phosphate sodique de riboflavine, phosphate-5' de riboflavine de sodium, sel monosodique de l'ester du phosphate-5' de riboflavine, sel monosodique de l'ester de phosphate de la vitamine B2, sel de l'ester monosodique de la riboflavine 5-monophosphatée +hr: E101a, natrijev riboflavin 5-fosfat +hu: E101a, E101a food additive +it: E101a, E101a food additive +lt: E101a, E101a food additive +lv: E101a, E101a food additive +mt: E101a, E101a food additive +nl: E101a, E101a food additive +pl: E101a, E101a food additive +pt: E101a, E101a food additive +ro: E101a, 5'-fosfat de riboflavină sodică, riboflavină-5'-fosfat sodic +sk: E101a, E101a food additive +sl: E101a, E101a food additive +sv: E101a, E101a food additive +additives_classes:en: en:colour +comment:en: E101a is the same as E101(ii). All synonyms are under E101(ii). Needs more cleanup +e_number:en: 101a +efsa_evaluation:en: Scientific Opinion on the re-evaluation of riboflavin (E 101(i)) and riboflavin-5'-phosphate sodium (E 101(ii)) as food additives. +efsa_evaluation_date:en: 2013-10-22 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2013.3357 +wikidata:en: Q376061 + +en: E102, Tartrazine, Yellow 5, Yellow number 5, Yellow no 5, Yellow no5, FD&C Yellow 5, FD&C Yellow no 5, FD&C Yellow no5, FD and C Yellow no. 5, FD and C Yellow 5, Yellow 5 lake +xx: E102 +bg: E102, Тартразин +ca: E102, Tartrazina +cs: E102, Tartrazin, FD&C žluť 5, E 102, Tartazin +da: E102, Tartrazin, E-102 +de: E102, Tartrazin, Yellow 5, E 102 +el: E102, Ταρτραζινη +es: E102, Tartrazina, Tartracina, Yellow 5, Amarillo 5, E-102, amarillo ocaso FCF, amarillo FD&C 5 +et: E102, Tartrasiin, E 102 +fa: E102, تارترازین +fi: E102, Tartratsiini, Tartratsiinia, CI 19140, E 102 +fr: E102, Tartrazine, FD&C Yellow 5, FD&C Jaune 5, Yellow 5, FD&C Yellow #5, C.I. Food Yellow 4, C.I. Acid Yellow 23, Acid Yellow 23, C.I. 19140, Yellow number 5, E-102, 1934-21-0 +ga: E102, Tartraiséin +gl: E102, Tartrazina +he: E102, טרטרזין +hr: E102, Tartrazin +hu: E102, Tartrazin +id: E102, Tartrazina +it: E102, Tartrazina +ja: E102, タートラジン +ko: E102, 타트라진 +lt: E102, Tartrazinas +lv: E102, Tartrazīns +mt: E102, Tartrażina +nb: E102, Tartrazin +nl: E102, Tartrazine +nl_be: E102, Tartrazine +pl: E102, Tartrazyna +pt: E102, Tartarazina, Tartrazina, Corante amarelo tartrazina, Amarelo tartrazina +ro: E102, Tartrazină +ru: E102, Тартразин, Е102, Tartrazine +sh: E102, Tartrazin +si: E102, ටාට්‍රසින් +sk: E102, Tartrazín +sl: E102, Tartrazin +sr: Tartrazin +sv: E102, Tartrazin, E 102, Tartrasin +tr: E102, Tartrazin +uk: E102, Тартразин +zh: E102, :柠檬黄 +additives_classes:en: en:colour +colour_index:en: CI 19140 +description:en: TARTRAZINE is a synthetic lemon yellow azo dye primarily used as a food coloring. +e_number:en: 102 +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/1331.pdf +efsa_evaluation:en: Scientific Opinion on the re-evaluation Tartrazine (E 102) +efsa_evaluation_date:en: 2009-11-12 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2009.1331 +vegan:en: yes +vegetarian:en: yes +# azb:E102, تارترازین +# zh-cn:E102, 柠檬黄 +# zh-hans:E102, 柠檬黄 +# zh-hant:E102, 檸檬黃 +# zh-hk:E102, 檸檬黃 +# zh-sg:E102, 柠檬黄 +# zh-tw:E102, 檸檬黃 +wikidata:en: Q407158 +wikipedia:en: https://en.wikipedia.org/wiki/Tartrazine + +en: E103, Alkannin +xx: E103 +bg: E103, E103 food additive +ca: E103, Crisoína, crisoina +cs: E103, E103 food additive +da: E103, Alkannin +de: E103, Alkannin, Krisoïn +el: E103, E103 food additive +es: E103, Crisoína, Alcanina, Amarillo de alcanina, Amarillo de alcannina +et: E103, E103 food additive +fi: E103, Krysoiini S, resorsiininkeltainen, tropaeoliini +fr: E103, Jaune chrysoïne, Alkannine, jaune chrysoïne S, Chrysoïne S, Orcanette, Orcanete, CI rouge naturel 20, extrait d'Alkannet, crisoine, Alkannin, CI Natural Red 20, Alkanet extract, Chrysoineresorcinol, jaune de résorcinol, jaune d'or, T jaune, orange acide 6, résorcinol de Chrysoine +hu: E103, Alkannin, Krizoin +it: E103, Alcannina +lt: E103, E103 food additive +lv: E103, E103 food additive +mt: E103, E103 food additive +nl: E103, Alkannin +nl_be: E103, Alkannin +pl: E103, Alkanina +pt: E103, amarelo de alcanaína +ro: E103, Alcanet, Alkanet +sk: E103, E103 food additive +sl: E103, E103 food additive +sv: E103, Alkannin +colour_index:en: CI 14270 +e_number:en: 103 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q418237 + +en: E104, Quinoline yellow, Quinoline Yellow WS, C.I. 47005, Food Yellow 13 +xx: E104 +bg: E104, Хинолин жълто +ca: E104, Groc de Quinoleína, groc de quinoleina +cs: E104, Chinolinová žluť, Potravinářská žluť 13, E 104, Chinolinová žluť WS, Cl 47005 +da: E104, Quinolingult +de: E104, Chinolingelb, E 104 +el: E104, Κιτρινο κινολινης +es: E104, Amarillo de quinoleína, E 104, Amarillo de quinolina +et: E104, Kinoliinkollane +fi: E104, Kinoliinikeltainen, Kinoliinikeltainen WS, CI 47005 +fr: E104, Jaune de quinoléine, colorant alimentaire jaune CI n°13, CI 47005 +hu: E104, Kinolinsárga +it: E104, Giallo chinolina +lt: E104, Chinolino geltonasis +lv: E104, Hinolīna dzeltenais +mt: E104, Isfar tal-kinolin +nl: E104, Chinolinegeel, Chinoline Geel +nl_be: E104, Chinolinegeel, Chinoline Geel +pl: E104, Żółcień chinolinowa +pt: E104, Amarelo de quinoleína +ro: E104, Galben de chinolină +sk: E104, Chinolínová žltá +sl: E104, Kinolinsko rumeno +sv: E104, Kinolingult, E 104 +additives_classes:en: en:colour +anses_additives_of_interest:en: yes +colour_index:en: CI 47005 +e_number:en: 104 +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/1329.pdf +efsa_evaluation:en: Scientific Opinion on the re-evaluation of Quinoline Yellow (E 104) as a food additive +efsa_evaluation_date:en: 2009-11-12 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2009.1329 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q420123 +# comment:en:E104 can be consumed by all religious groups, vegans and vegetarians + +en: E105, Fast Yellow AB +xx: E105 +bg: E105, E105 food additive +ca: E105, Groc sòlid, groc solid +cs: E105, E105 food additive +da: E105, E105 food additive +de: E105, Festgelb AB +el: E105, E105 food additive +es: E105, Amarillo sólido, Amarillo sólido AB +et: E105, E105 food additive +fi: E105, Nopea keltainen AB +fr: E105, Jaune solide +hu: E105, Fast Yellow AB +it: E105, E105 food additive +lt: E105, E105 food additive +lv: E105, E105 food additive +mt: E105, E105 food additive +nl: E105, Resorcinolgeel (verboden) +nl_be: E105, E105 food additive +pl: E105, Żółcień trwała AB +pt: E105, E105 food additive +ro: E105, Galben puternic AB, Rapid galben AB +sk: E105, E105 food additive +sl: E105, E105 food additive +sv: E105, E105 food additive +e_number:en: 105 +vegan:en: yes +vegetarian:en: yes + +en: E107, Yellow 2G +xx: E107 +bg: E107, Жълто 2G +cs: E107, Žlutý 2G +da: E107, Gul 2G +de: E107, Gelb 2G +el: E107, Κίτρινο 2G +es: E107, Amarillo 2G, Amarillo alimentario 5 +et: E107, Kollane 2G +fi: E107, Keltainen 2G, CI 18965 +fr: E107, Jaune 2G +hu: E107, Sárga 2G, Yellow 2G +it: E107, Giallo 2G +lt: E107, Geltonasis 2G +lv: E107, Dzeltenais 2G +mt: E107, Isfar 2G +nl: E107, Geel 2G, CI 18965 +nl_be: E107, Geel 2G, CI 18965 +pl: E107, Żółcień 2G, Żółty 2G +pt: E107, Amarelo 2G +ro: E107, Galben 2G +sk: E107, Žltý 2G +sl: E107, Rumeno 2G +sv: E107, Gul 2G +colour_index:en: CI 18965 +e_number:en: 107 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q424528 + +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, Yellow 6 lake, Sunset Yellow +xx: E110 +bg: E110, Сънсет жълто FCF, CI хранително жълто 3, Yellow 6 +ca: E110, Groc ataronjat S +cs: E110, Sunset yellow FCF, Yellow 6, Žluť SY, E 110 +da: E110, Sunset yellow FCF, Yellow 6 +de: E110, Gelborange S, Food Yellow 3, Gelborange-S, Sunsetgelb FCF, Yellow 6, Gelborange +el: E110, Κιτρινο sunset FCF, Κίτρινο CI food 3, Yellow 6 +es: E110, Amarillo anaranjado s, CI food yellow 3, Yellow 6, Amarillo crepúsculo, C.I. 15985, Amarillo ocaso, E 110, amarillo FD&C 6, amarillo 6 +et: E110, Päikeseloojangukollane FCF, CI kollane toiduvärv 3, Yellow 6 +fi: E110, Paraoranssi, Oranssi S, Sunset yellow FCF, Yellow 6, E 110, CI 15985 +fr: E110, Jaune orangé S, Jaune soleil FCF, Sunset yellow FCF, C16H10N2Na2O7S2, C16H10N2Ca2O7S2, C16H10N2K2O7S2, CI 15985, C.I. 15985, 6-hydroxy-5-[(4-sulfonatophényl)azo]naphtalène-2-sulfonate de disodium, C.I. Food Yellow 3, CAS 2783-94-0, SEL DISODIQUE DE L'ACIDE HYDROXY-6 ((SULFOPHENYL-4)AZO)-5 NAPHTALENE SULFONIQUE-2, Gelborange S, 2-Hydroxy-1-(4-Sulfonato-Phenylazo)-6-Naphthalin-Sulfonat, Sunset Yellow, Sunset Yellow FCF, FD & C Yellow No.6, FD and C Yellow No. 6, 6-hydroxy-5-((p-sulfophenyl)azo)-2-naphthalenesulfonic acid disodium salt, 6-Hydroxy-5-(4-sulfophenylazo)-2-naphthalenesulfonic acid trisodium salt, Gelborange-S, Sunsetgelb FCF, 6-Hydroxy-5-(4-sulfophenylazo)-naphthalin- 2-sulfonsäure-Dinatriumsalz, Amarillo crepúsculo, Amarillo ocaso, Amarillo n° 6, Zonnegeel FCF, Oranjegeel S, Crelborange S, Colorant alimentaire jaune CI n°3, Yellow No.6, Yellow 6, 2783-94-0, Jaune orangé, Jaune orange +hr: E110 +hu: E110, Sunset yellow FCF, sunset yellow, Narancssárga FCF, CI Food Yellow 3, Yellow 6 +it: E110, Giallo tramonto FCF, CI giallo per alimenti 3, Yellow 6, Giallo arancio S +lt: E110, Saulėlydžio geltonasis FCF, Maistinis geltonasis CI Nr. 3, Yellow 6 +lv: E110, Saulrieta dzeltenais FCF, CI Pārtikas dzeltenais 3, Yellow 6 +mt: E110, Sunset yellow FCF, Yellow 6 +nl: E110, Zonnegeel FCF, CI Food Yellow 3, Yellow 6, Geeloranje S +nl_be: E110, Zonnegeel FCF, CI Food Yellow 3, Yellow 6, Geeloranje S +pl: E110, Żółcień pomarańczowa FCF, CI żółcień spożywcza 3, Yellow 6, Żółcień pomarańczowa S +pt: E110, Amarelo-sol FCF, Amarelo alimentar CI 3, Yellow 6, Amarelo crepúsculo +ro: E110, Apus galben FCF, Colorant alimentar galben CI 3, Yellow 6, Portocaliu galben S +ru: E110, Желтый солнечный закат +sk: E110, Žltá FCF, CI potravinárska žltá 3, Yellow 6, Žltá SY, Oranžová žltá, Žlť SY, Žltooranžová S, Žlť-oranž S, Žlť SY FCF, C.I. 15985, Žlť FCF, Oranžová žlť, Žltá SY FCF, Pomarančovožltá S +sl: E110, Sončno rumeno FCF, CI Food Yellow 3, Yellow 6 +sv: E110, Para-orange, CI Food Yellow 3, Yellow 6, E 110 +additives_classes:en: en:colour +anses_additives_of_interest:en: yes +colour_index:en: CI 15985 +e_number:en: 110 +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/3765.pdf +efsa_evaluation:en: Reconsideration of the temporary ADI and refined exposure assessment for Sunset Yellow FCF (E110) +efsa_evaluation_date:en: 2014-07-15 +# efsa:en:http://www.efsa.europa.eu/fr/efsajournal/doc/2349.pdf +# efsa:en:http://www.efsa.europa.eu/fr/efsajournal/doc/1330.pdf +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2014.3765 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q410095 + +en: E111, Orange GGN, Alpha-naphthol, Alpha-naphtol, alpha-naphthol orange +xx: E111 +bg: E111, Оранжев GGN, Алфа-нафтол, Алфа-наптол, оранжев нафтол +ca: E111, Taronja GGN, Alfa-naftol, Alpha-naphtol, taronja naftol +cs: E111, Oranžový GGN, Alfa-naftol, Alpha-naphtol, oranžový naftol +da: E111, Orange GGN, Alpha-naphthol, Alpha-naphtol, orange naftol +de: E111, Orange GGN, Alpha-Naphthol, Alpha-Naphtol, orange Naphthol +el: E111, Πορτοκαλί GGN, Άλφα-ναφθόλη, Άλφα-ναφτόλη, πορτοκαλί ναφθόλη +es: E111, Naranja GGN, Alfa-naftol, Alpha-naphtol, naranja naftol +et: E111, Oranž GGN, Alfa-naftool, Alpha-naphtol, oranž naftool +fi: E111, Oranssi GGN, Alfa-naftoli, Alpha-naphtol, oranssi naftoli +fr: E111, Orange GGN, Alpha-naphtol, Alpha-naphtol, orange naphtol +hu: E111, Orange GGN, Alpha-naftol, Alpha-naphtol, narancssárga naftol +it: E111, Arancione GGN, Alfa-naftolo, Alpha-naphtol, arancione naftolo +lt: E111, Oranžinė GGN, Alfa-naftolis, Alpha-naphtol, oranžinė naftolis +lv: E111, Oranžs GGN, Alfa-naftols, Alpha-naphtol, oranžs naftols +mt: E111, Oranġjo GGN, Alfa-naptol, Alpha-naphtol, oranġjo naptol +nl: E111, Oranje GGN, Alfa-naftol, Alpha-naphtol, oranje naftol +nl_be: E111, Oranje GGN, Alfa-naftol, Alpha-naphtol, oranje naftol +pl: E111, Oranż GGN, Pomarańczowy GGN, Alfa-naftol, Alpha-naphtol, pomarańczowy naftol +pt: E111, Laranja GGN, Alfa-naftol, Alpha-naphtol, laranja naftol +ro: E111, Portocaliu alfa-naftol, Portocaliu GGN, Alfa-naftol, Alpha-naphtol, portocaliu naftol +sk: E111, Oranžový GGN, Alfa-naftol, Alpha-naphtol, oranžový naftol +sl: E111, Oranžna GGN, Alfa-naftol, Alpha-naphtol, oranžna naftol +sv: E111, Orange GGN, Alpha-naphthol, Alpha-naphtol, orange naftol +e_number:en: 111 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q929052 + +en: E120, Cochineal, carminic acid, carmines, Natural Red 4, Cochineal Red +xx: E120 +be: E120, Кармін +bg: E120, Кохинил, карминова киселина, кармини, кармин +bs: E120, Karmin +ca: E120, Carmí, Cotxinilla, àcid carmí, àcid carmínic, carmi, acid carmi +cs: E120, Košenila, kyselina karmínová, karmíny +da: E120, karminer, Carminer, carminsyre, cochenille +de: E120, echtes Karmin, Karminsäure, Carminsäure +el: E120, Κοχενιλη, καρμινικο οξυ, καρμινες +eo: E120, karmino +es: E120, Cochinilla, ácido carmínico, carmines, carmín cochinilla, carmín +et: E120, Košenill, karmiinhape, karmiinid, karmiinhape +eu: E120, Gorrimin +fi: E120, Karmiinit, Kokkiniili, karmiinihappo, Karmiini, Karmiinia, Karmiineja, Kokkiniiliä, karmiinihappoa, CI 75470 +fr: E120, Acide carminique, carmin, carmins, Rouge cochenille, cochenille, Carmine, Crimson Lake, Cochineal, Natural Red 4, C.I. 75470, Rouge naturel CI n°4, 1260-17-9, carmin de cochenille +he: E120, קרמין +hr: E120, karmin +hu: E120, Kosnil, kárminsav, kárminok, Kárminvörös +hy: E120, Կարմին +ia: E120, carmin +io: E120, Karmino +it: E120, Cocciniglia, acido carminico, vari tipi di carminio, C22H20O13 +ja: E120, コチニール色素, コチニール, カルミン酸色素 +ky: E120, Кармин +lt: E120, Košenilis, karmino rūgštis, karminai +lv: E120, Košenils, karmīnskābe, karmīni +mk: E120, кармин +mt: E120, Kuċċinilja, aċidu karminiku, karminji +nb: E120, karmin +nl: E120, Cochenille, karmijnzuur, karmijn +nl_be: E120, Cochenille, karmijnzuur, karmijn +oc: E120, Carmin +pl: E120, Koszenila, kwas karminowy, karminy, Koszelina, Karmina, karmin +pt: E120, Cochonilha, ácido carmínico, carminas +ro: E120, Coșenilă, acid carminic, carmine, Acidului carminic, carmin +ru: E120, Кошениль, карминовая кислота, кармин, кармины +sh: E120, Carmine +sk: E120, Košenila, kyselina karmínová, karmíny +sl: E120, Košenilja, karminska kislina, karmini, karmin +sv: E120, Karmin, karminsyra, E 120 +th: E120, ชาดลิ้นจี่ +tr: E120, Karmin +uk: E120, Кармін +vi: E120, Đỏ yên chi +zh: E120, 胭脂红 +additives_classes:en: en:colour +colour_index:en: CI 75470 +description:en: CARMINE, also called cochineal, cochineal extract, crimson lake or carmine lake, natural red 4, C.I. 75470, or E120, is a pigment of a bright-red color obtained from the aluminium salt of carminic acid +e_number:en: 120 +efsa_evaluation:en: Scientific Opinion on the re-evaluation of cochineal, carminic acid, carmines (E 120) as a food additive +efsa_evaluation_date:en: 2015-11-18 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2015.4288 +mandatory_additive_class:en: en:colour +vegan:en: no +vegetarian:en: no +wikidata:en: Q416860 +# de-ch:E120, Karmin +# en-ca:E120, Carmine +# en-gb:E120, Carmine +# pt-br:E120, Carmim +# scn:E120, carminiu +# wikidata:en:Q320617 +wikipedia:en: https://en.wikipedia.org/wiki/Carmine + +en: E121, Citrus Red 2 +xx: E121 +bg: E121, Цитрусово червено 2 +ca: E121, Vermell cítric 2 +cs: E121, Citrusová červená 2 +da: E121, Citrus Rød 2 +de: E121, Zitrusrot 2 +el: E121, Κίτρινο κόκκινο 2 +es: E121, Rojo cítrico 2, Rojo cítrico 2 +et: E121, Tsitruseline punane 2 +fi: E121, Sitruspunainen 2, Sitruspunainen 2 +fr: E121, Rouge citrus no.2, Rouge citrus n°2, Rouge citrique n°2, Rouge citrique n°2, Rouge citrique n°2 +hu: E121, Citromvörös 2 +it: E121, Rosso agrumi 2 +lt: E121, Citrinų raudonas 2 +lv: E121, Citrusa sarkans 2 +mt: E121, Ħamra ċitri 2 +nl: E121, Citrusrood 2 +nl_be: E121, Citrusrood 2 +pl: E121, Lakmus, Czerwień cytrusowa 2 +pt: E121, Vermelho cítrico 2 +ro: E121, Colorant citric roşu, Roșu citric 2 +sk: E121, Citrusová červená 2 +sl: E121, Citrusno rdeče 2 +sv: E121, Citrusröd 2 +e_number:en: 121 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q2653981 + +en: E122, Azorubine, carmoisine, Food Red 3, Brillantcarmoisin O, Acid Red 14, Azorubin S, C.I. 14720 +xx: E122 +bg: E122, Азорубин, кармоизин +ca: E122, Azorrubina +cs: E122, Azorubín, carmoisin, Karmoisin, E 122 +da: E122, Azorubin (carmoisin), Azorubin, Carmoisin, E-122 +de: E122, Azorubin (carmoisin), Azorubin, Carmoisin, E 122 +el: E122, Αζωρουμπινη, καρμοϊσινη, Αζορουμπίνη, Kαρμοϊζίνη +es: E122, Azorrubina, carmoisina, Acid Red 14, C.I. 14720, E 122, Food Red 3, Azorubina S, Brillantcarmoisin O, Carmisina +et: E122, Asorubiin, karmoisiin +fi: E122, Atsorubiini, Karmosiini, Atsorubiinia, Karmosiinia, Azorubine, carmoisine, CI 14720, E 122 +fr: E122, Azorubine carmoisine, Azorubine, CI 14720, E-122, Carmoisine, 3567-69-9 +hr: E122 +hu: E122, Azorubin, karmazsin +it: E122, Azorubina, carmoisina, C20H12N2Na2O7S2 +lt: E122, Azorubinas, karmuazinas, Karmoizinas +lv: E122, Azorubīns, karmoizīns +mt: E122, Ażorubina, karmoisina +nl: E122, Azorubine, karmozijn, CI 14720 +nl_be: E122, Azorubine, karmozijn, CI 14720 +pl: E122, Azorubina, karmoizyna +pt: E122, Azorubina, carmosina, Azorrubina +ro: E122, Azorubină, Carmoizină +sk: E122, Azorubín, karmoizín +sl: E122, Azorubin, karmoizin +sv: E122, Azorubin, karmosin, E 122 +additives_classes:en: en:colour +colour_index:en: CI 14720 +e_number:en: 122 +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/1332.pdf +efsa_evaluation:en: Scientific Opinion on the re-evaluationof Azorubine/Carmoisine (E 122) as a food additive +efsa_evaluation_date:en: 2009-11-12 +efsa_evaluation_overexposure_risk:en: en:no +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2009.1332 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q409676 + +# amaranth is common as an ingredient in cereals +# -> require mandatory color: amaranth +en: E123, Amaranth, FD&C Red 2 +xx: E123 +bg: E123, Амарант +ca: E123, Amarant +cs: E123, Amarant +da: E123, Amaranth +de: E123, Amaranth +el: E123, Αμαρανθη +es: E123, Amaranto +et: E123, Amarant +fi: E123, Amarantti, Amaranttia +fr: E123, Amarante +hu: E123, Amarant, Amaranth +it: E123, Amaranto +lt: E123, Amarantas +lv: E123, Amarants +mt: E123, Amarant +nl: E123, Amarant +pl: E123, Amarant +pt: E123, vermelho amaranto, Amarante, Amaranto +ro: E123, Amarant +sk: E123, Amarant +sl: E123, Amarant +sv: E123, Amarant +additives_classes:en: en:colour +colour_index:en: CI 16185 +e_number:en: 123 +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/3442.pdf +efsa_evaluation:en: Scientific Opinion on the re‐evaluation of Amaranth (E 123) as a food additive +efsa_evaluation_date:en: 2010/07/26 +efsa_evaluation_overexposure_risk:en: en:no +efsa_evaluation_url:en: http://www.efsa.europa.eu/fr/efsajournal/doc/1649.pdf +mandatory_additive_class:en: en:colour +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q421074 + +# adding Ponceau as a synonym, as E124 is the only authorized food additive with the Ponceau name + +en: E124, Ponceau 4r, cochineal red a, CI Food Red 7, Brilliant Scarlet 4R, Ponceau +xx: E124 +bg: E124, Понсо 4r, кохинил червено а, CI хранително червено 7 +ca: E124, Vermell cotxinilla A, Vermell Ponceau 4R +cs: E124, Ponceau 4r, košenilová červeň a, CI potravinářská červeň 7 +da: E124, Ponceau 4r (cochenillerød a), CI Food Red 7, Ponceau 4R +de: E124, Cochenillerot a (ponceau 4r), Food Red 7, Cochenillerot A +el: E124, Πονσω 4r, ερυθρο της κοχενιλης α, Κόκκινο CI food 7 +es: E124, Ponceau 4r, rojo cochinilla a +et: E124, Erkpunane 4r, košenillpunane a, CI punane toiduvärv 7, erkpunane +fi: E124, Uuskokkiini, Uuskokkiinia, kokkeniilipunainen a, Ponceau 4r, CI Food Red 7 +fr: E124, Ponceau 4R, Rouge cochenille A, cochenille nouvelle, CI No. 16255, CI Food Red 7, CAS 2611-28-7, rouge ponceau +hu: E124, Ponceau 4R, Kosnilvörös A, CI Food Red 7, Neukokcin +it: E124, Ponceau 4r, rosso cocciniglia a, CI rosso per alimenti 7 +lt: E124, Ponso 4r, košenilis raudonasis a, Maistinis raudonasis CI Nr. 7, Raudonasis ponso +lv: E124, Kumačs 4r, košinela sarkanais a, CI Pārtikas sarkanais 7 +mt: E124, Ponceau 4r, aħmar tal-kuċċinilja a +nl: E124, Ponceau 4r, cochenillerood a, CI Food Red 7 +nl_be: E124, Ponceau 4r, cochenillerood a, CI Food Red 7 +pl: E124, Pąs 4r, czerwień koszenilowa a, CI czerwień spożywcza 7 +pt: E124, Ponceau 4r, vermelho de cochonilha a, Vermelho alimentar CI 7 +ro: E124, Ponceau 4r, Coșenilă roșie a, Colorant alimentar roșu CI 7, Roșu ponceau +sk: E124, Ponceau 4r, košenilová červeň a, CI potravinárska červená 7 +sl: E124, Rdeče 4r, košenil rdeče a +sv: E124, Nykockin, CI Food Red 7, ponceau 4R +additives_classes:en: en:colour +anses_additives_of_interest:en: yes +colour_index:en: CI 16255 +e_number:en: 124 +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/1328.pdf +efsa_evaluation:en: Scientific Opinion on the re-evaluation of Ponceau 4R (E 124) as a food additive +efsa_evaluation_date:en: 2009-11-12 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2009.1328 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q384709 + +en: E125, Scarlet GN, C.I. Food Red 1, Ponceau SX, FD&C Red No. 4, C.I. 14700 +xx: E125, Scarlet GN, C.I. Food Red 1, Ponceau SX, FD&C Red No. 4, C.I. 14700 +es: E125, Ponceau SX, E 125 +fi: E125, Skarletti GN, CI 14700 +fr: E125, Ponceau SX, Écarlate GN, C18H14N2Na2O7S2, Scarlet GN +pl: E125, Szkarłat GN +ro: E125, Ponceau SX +e_number:en: 125 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q934310 + +xx: E126, Ponceau 6R +en: E126, Ponceau 6R +fr: E126, Ponceau GR, Ponceau 6R +hu: E126, Ponszó 6R +pl: E126, Pąs 6R +e_number:en: 126 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q596946 + +en: E127, Erythrosine, FD&C Red 3, FD & C Red No.3, Red No. 3, FD&C Red no3, FD and C Red 3, Red 3, Red 3 lake +xx: E127 +bg: E127, Еритрозин +ca: E127, Eritrosina +cs: E127, Erythrosin, Erytrosin, E 127 +da: E127, Erythrosin +de: E127, Erythrosin, E 127 +el: E127, Ερυθροσινη +es: E127, Eritrosina, Iodoeosina +et: E127, Erütrosiin +fa: E127, اریتروسین +fi: E127, Erytrosiini, Erytrosiinia +fr: E127, Érythrosine, erythrosine, C.I. 45430, C.I. Acid Red 51, Acid Red 51, C.I. Food Red 14, CAS 568-63-8, FD & C Red No.3, Red No. 3, FD&C No.3 rouge, nourriture No.3 rouge, Erythrosine, Erythrosine B, Erythrosin B, C.I. 45430, Tetraiodofluorescein Sodium Salt, Calcoid Erythrosine N, C.I. Food Red 14, Aizen Erythrosine, Indian Standards No. 1697, Acid Red 51, Pyrosin B, Tetraiodofluorescein, Eosin J, Iodoeosin, 568-63-8, C20H6I4Na2O5 +hu: E127, Eritrozin +it: E127, Eritrosina, C20H6I4Na2O5 +ja: E127, エリスロシン +lt: E127, Eritrozinas +lv: E127, Eritrozīns +mk: E127, Еритрозин +mt: E127, Eritrosina +nl: E127, Erytrosine, Erythrosine +pl: E127, Erytrozyna +pt: E127, Eritrosina +ro: E127, Eritrozină +ru: E127, эритрозин +sh: E127, Eritrozin +sk: E127, Erytrozín +sl: E127, Eritrozin +sr: E127, Eritrozin +sv: E127, Erytrosin, E 127 +uk: E127, Еритрозин +zh: E127, 赤藓红 +additives_classes:en: en:colour +description:en: ERYTHROSINE, is an organoiodine compound, specifically a derivative of fluorone. It is cherry or melon-pink synthetic, primarily used for food coloring. +e_number:en: 127 +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/1854.pdf +efsa_evaluation:en: Scientific Opinion on the re-evaluation of Erythrosine (E 127) as a food additive +efsa_evaluation_date:en: 2011-01-27 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2011.1854 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q420101 +# nl_be:E127, Erytrosine, Erythrosine +# azb:E127, اریتروسین +# zh-cn:E127, 赤藓红 +# zh-hans:E127, 赤藓红 +# zh-hant:E127, 赤蘚紅 +# zh-hk:E127, 赤蘚紅 +# zh-sg:E127, 赤藓红 +# zh-tw:E127, 赤蘚紅 +wikipedia:en: https://en.wikipedia.org/wiki/Erythrosine + +en: E128, Red 2G +xx: E128 +bg: E128, E128 food additive +ca: E128, Vermell 2G +cs: E128, E128 food additive +da: E128, Rød 2G +de: E128, Rot 2G, E 128, Red 2G, Roth 2G +el: E128, E128 food additive +es: E128, Rojo 2G +et: E128, E128 food additive +fi: E128, Punainen 2G, Atsogeraniini, E 128, Dinatrium 5-asetamido-4-okso-3-(fenyylihydratsinyylideeni)naftaleeni-2\,7-disulfonaatti, CI 18050 +fr: E128, Rouge 2G, CI Food Red 10, Azogéranine, CI No. 18050, CAS 3734-67-6, Red 2G, C.I. 18050, Azophloxine, Azofloxin, Amidonaphthol red G, Acid Red 1, CI Acid Red 1, D&C Red 11, Azo Geranine 2G +hu: E128, Vörös 2G, Red 2G +it: E128, Rosso 2G +lt: E128, E128 food additive +lv: E128, E128 food additive +mt: E128, E128 food additive +nl: E128, Rood 2G, CI 18050 +nl_be: E128, Rood 2G, CI 18050 +pl: E128, Czerwień 2G +pt: E128, Vermelho 2G, E128 Vermelho 2G +ro: E128, Roșu 2G +sk: E128, E128 food additive +sl: E128, E128 food additive +sv: E128, Röd 2G, E 128 +additives_classes:en: en:colour +colour_index:en: CI 18050 +e_number:en: 128 +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/515.pdf +efsa_evaluation:en: Opinion of the Scientific Panel on Food Additives, Flavourings, Processing Aids and Materials in Contact with Food on the food colour Red 2G (E128) based on a request from the Commission related to the re-evaluation of all permitted food additives +efsa_evaluation_date:en: 2007-07-16 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2007.515 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q417819 + +en: E129, Allura red, Allura red ac, Allura Red AC, FD&C Red 40, FD and C Red 40, Red 40, Red no40, Red no. 40, FD and C Red no. 40, Food Red 17, C.I. 16035, Red 40 lake +xx: E129 +bg: E129, Алура червено ac +ca: E129, Vermell Allure 2C, Vermell allura AC +cs: E129, Allura red ac, červeň ac, Červeň Allura AC +da: E129, Allura red ac +de: E129, Allurarot ac, Allurarot, E 129 +el: E129, Ερυθρο allura ac +es: E129, Rojo allura ac, E 129, Rojo Allura 2C, rojo FD&C 40, rojo 40, rojo allura +et: E129, Võlupunane ac +fi: E129, Alluranpunainen ac, Alluranpunainen, E 129, CI 16035 +fr: E129, Rouge allura AC, Rouge Allura, Rouge alimentaire 17, FD&C Rouge 40, Allura Red, Food Red 17, C.I. 16035, FD&C Red 40, Red 40 lake, Red 40, 2-naphthalenesulfonic acid disodium salt, Allura Red AC, C18H14N2Na2O8S2 +hr: E129 +hu: E129, Alluravörös AC, Allura Red AC +it: E129, Rosso allura ac +lt: E129, Alura raudonasis ac +lv: E129, Alūra sarkanais ac +mt: E129, Aħmar allura ac +nl: E129, Allurarood ac, Allura rood AC, Allura Rood, CI 16035 +nl_be: E129, Allurarood ac, Allura rood AC, Allura Rood, CI 16035 +pl: E129, Czerwień allura ac, Czerwień FD&C, Czerwień Allura +pt: E129, Vermelho allura ac +ro: E129, Roșu allura ac +sk: E129, Červená allura ac +sl: E129, Alura rdeče ac +sv: E129, Allurarött ac, E 129 +additives_classes:en: en:colour +anses_additives_of_interest:en: yes +colour_index:en: CI 16035 +e_number:en: 129 +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/1327.pdf +efsa_evaluation:en: Refined exposure assessment for Allura Red AC (E 129) +efsa_evaluation_date:en: 2015/02/13 +efsa_evaluation_overexposure_risk:en: en:no +# 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 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q419895 + +en: E130, Indanthrene blue RS, Indanthrone blue, indanthrene +xx: E130 +bg: E130, Индантрен син RS, Индантрон син, индантрен +ca: E130, Blau d'antraquinona, Blau d'indantrena, indantrena +cs: E130, Indantronová modř RS, Indantronová modř, indantron +da: E130, Indanthrenblå RS, Indanthronblå, indanthren +de: E130, Indanthron, Indanthrenblau RS, Indanthronblau, indanthren +el: E130, Ινδανθρένιο μπλε RS, Ινδανθρένιο μπλε, ινδανθρένιο +es: E130, Azul indantreno RS, Azul indantreno, indantreno +et: E130, Indantreen sinine RS, Indantreen sinine, indantreen +fi: E130, Indantreenisininen RS, Indantreenisininen, indantreen +fr: E130, Manascorubine, Bleu d'indanthrène, Bleu indanthrène RS, Bleu indanthrone, indanthrène +hu: E130, Indantrénkék RS, Indantrénkék, indantrén +it: E130, Blu indantrene RS, Blu indantrene, indantrene +lt: E130, Indantreno mėlyna RS, Indantreno mėlyna, indantreno +lv: E130, Indantrena zila RS, Indantrena zila, indantrena +mt: E130, Blu indantren RS, Blu indantren, indantren +nl: E130, Indantronblauw RS, Indantronblauw, indantron +pl: E130, Błękit indantrenowy RS, Niebieski indantren RS, Niebieski indantren, indantren +pt: E130, Azul indantreno RS, Azul indantreno, indantreno +ro: E130, Albastru indantren RS, Albastru indantren, indantren +sk: E130, Indantronová modrá RS, Indantronová modrá, indantron +sl: E130, Indantrensko modro RS, Indantrensko modro, indantren +sv: E130, Indantrenblå RS, Indantrenblå, indantren +# nl_be:E130, Indantreen +e_number:en: 130 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q185929 + +en: E131, Patent blue v, Food Blue 5, Sulphan Blue, Acid Blue 3, L-Blau 3, C-Blau 20, Patentblau V, Sky Blue, C.I. 42051 +xx: E131 +bg: E131, Патент синьо v +ca: E131, Blau patentat V +cs: E131, Patentní modř v +da: E131, Patent blue v +de: E131, Patentblau V, Patentblau, patentblau E 131 +el: E131, Πατεντ μπλε v +es: E131, Azul patentado V, Azul patente v, Azul sulfán +et: E131, Patentsinine v +fi: E131, Patenttisininen v, Patenttisininen, CI 42051 +fr: E131, Bleu patenté V, bleu CI n°5, bleu patenté E 131 +ga: E131, gorm paitinne V +he: E131, פטנט כחול V +hu: E131, Patentkék V +it: E131, Blu patentato v, blu patentato, blu patentato E 131 +lt: E131, Mėlynasis patentuotas v +lv: E131, Patentzilais v +mt: E131, Patent blue v +nl: E131, Patentblauw v, Patentblauw +pl: E131, Błękit patentowy v +pt: E131, Azul patenteado v +ro: E131, Albastru patent v +ru: E131, синий патентованный V +sk: E131, Patentná modrá v +sl: E131, Patentno modro v +sv: E131, Patentblått v, E 131 +uk: E131, Синій патентований V +zh: E131, 專利藍V +colour_index:en: CI 42051 +description:en: PATENT BLUE V is a dark bluish synthetic triphenylmethane dye used as a food coloring. It is not widely used, but in Europe it can be found in Scotch eggs, certain jelly sweets, blue Curaçao, certain jello varieties (though not in actual Jell-O brand products), among others. +e_number:en: 131 +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/2818.pdf +efsa_evaluation:en: Scientific Opinion on the re‐evaluation of Patent Blue V (E 131) as a food additive +efsa_evaluation_adi:en: 5 +efsa_evaluation_date:en: 2013/03/01 +efsa_evaluation_exposure_95th_greater_than_adi:en: en:children, en:toddlers +efsa_evaluation_exposure_mean_greater_than_adi:en: en:no-group +efsa_evaluation_overexposure_risk:en: en:moderate +efsa_evaluation_url:en: https://efsa.onlinelibrary.wiley.com/doi/10.2903/j.efsa.2013.2818 +vegan:en: yes +vegetarian:en: yes +# nl_be:E131, Patentblauw v, Patentblauw +wikidata:en: Q420087 +wikipedia:en: https://en.wikipedia.org/wiki/Patent_Blue_V + +en: E132, Indigotine, indigo carmine, FD&C Blue 2, FD and C Blue 2, C.I. Food Blue 2, Blue 2 lake, Blue 2 +xx: E132 +bg: E132, Индиготин, индиго кармин +ca: E132, Indigotina, carmí indi, carmi indi +cs: E132, Indigotin, indigocarmine, Indigo karmín +da: E132, Indigotin (indigocarmin) +de: E132, Indigotin (Indigokarmin), Indigokarmin, Indigotin, E 132, Indigocarmin, Indigotin I +el: E132, Ινδικοτινη, ινδικοκαρμινη +es: E132, Indigotina, carmín de índigo, E 132, azul FD&C 2 +et: E132, Indigotiin, indigokarmiin +fi: E132, Indigotiini, indigokarmiini, indigootti +fr: E132, Indigotine carmin d'indigo, carmin d'indigo, C16H8N2Na2O8S2, Acide indigodisulfonique, Acide indigosulfonique, 860-22-0 +hu: E132, Indigotin, indigókármin +it: E132, Indigotina, carminio d'indaco +lt: E132, Indigotinas, indigokarminas +lv: E132, Indigotīns, indigokarmīns +mt: E132, Indigotina, karminju indigo +nl: E132, Indigotine, indigokarmijn +pl: E132, Indygotyna, indygokarmin +pt: E132, Indigotina, carmim de indigo, Índigo-carmim +ro: E132, Indigotină, carmin indigo +sk: E132, Indigotín, indigokarmín +sl: E132, Indigotin, indigo karmin +sv: E132, Indigotin, indigokarmin +additives_classes:en: en:colour +# nl_be:E132, Indigotine, indigokarmijn +e_number:en: 132 +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/2818.pdf +efsa_evaluation:en: Scientific Opinion on the re‐evaluation of Indigo Carmine (E 132) as a food additive +efsa_evaluation_adi:en: 5 +efsa_evaluation_date:en: 2014/07/25 +efsa_evaluation_overexposure_risk:en: en:no +efsa_evaluation_url:en: https://efsa.onlinelibrary.wiley.com/doi/10.2903/j.efsa.2014.3768 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q410120 +wikipedia:en: https://en.wikipedia.org/wiki/Indigo_carmine + +en: E133, Brilliant blue FCF, FD&C Blue 1, FD and C Blue 1, Blue 1, fd&c blue no. 1, Blue 1 lake +xx: E133 +bg: E133, Брилянтно синьо FCF +ca: E133, Blau brillant FCF +cs: E133, Brilantní modř FCF +da: E133, Brilliant blue FCF, brillant blue +de: E133, Brilliantblau FCF, Brillantblau FCF, E 133, Brillantblau +el: E133, Λαμπρο κυανο FCF +es: E133, Azul brillante FCF, Azul brillante FCP, E 133, Brilliant Blue FCF, azul FD&C 1, azul brillante +et: E133, Briljantsinine FCF +fi: E133, Briljanttisininen FCF +fr: E133, Bleu brillant FCF, C.I. Acid Blue 9, CI 42090, C-Blau 21, Erioglaucin A, Blue 1, Brilliant Blue FCF, bleu brillant, FD&C Blue No.1, FD&C Blue #1, BB FCF, Acid Blue 9, D&C Blue No. 4, Alzen Food Blue No. 1, Atracid Blue FG, Erioglaucine, Eriosky blue, Patent Blue AR, Xylene Blue VSG, CAS 25305-78-6, CAS 2650-18-2, CAS 3844-45-9, CAS 71701-18-3, CAS 15792-67-3, 2650-18-2, 15792-67-3 +ga: E133, gorm lonrach FCF +he: E133, כחול בוהק FCF +hr: E133, briljantna plava +hu: E133, Brilliánskék FCF +id: E133, Brilliant Blue FCF +it: E133, Blu brillante FCF +ja: E133, ブリリアントブルーFCF +lt: E133, Briliantinis mėlinasis FCF, Briliantinis mėlynasis FCF +lv: E133, Briljantzilais FCF +mt: E133, Blu brillanti FCF +nb: E133, briljantblà FCF +nl: E133, Briljantblauw FCF, Briljantblauw +pl: E133, Błękit brylantowy FCF, Błękit brylantowy +pt: E133, Azul brilhante FCF +ro: E133, Albastru briliant FCF +sh: E133, Brilijantno plavo FCF +sk: E133, Brilantná modrá FCF +sl: E133, Briljantno modro FCF +sr: E133, Brilijantno plavo FCF +sv: E133, Briljantblått FCF, Briljantblått +uk: E133, Діамантовий синій +#Toddlers are counted as children in this study +additives_classes:en: en:colour +colour_index:en: CI 42090 +description:en: BRILLIANT BLUE FCF (Blue 1) is an organic compound classified as a blue triarylmethane dye, reflecting its chemical structure. Known under various commercial names, it is a colorant for foods and other substances. +e_number:en: 133 +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/1853.pdf +efsa_evaluation:en: Scientific Opinion on the re‐evaluation of Brilliant Blue FCF (E 133) as a food additive +efsa_evaluation_date:en: 2010/11/22 +efsa_evaluation_exposure_95th_greater_than_adi:en: en:children, en:toddlers +efsa_evaluation_exposure_mean_greater_than_adi:en: en:no-group +efsa_evaluation_overexposure_risk:en: en:moderate +efsa_evaluation_url:en: https://efsa.onlinelibrary.wiley.com/doi/10.2903/j.efsa.2010.1853 +vegan:en: yes +vegetarian:en: yes +# nl_be:E133, Briljantblauw FCF, Briljantblauw +# sr-el:E133, Brilijantno plavo FCF +wikidata:en: Q420093 +wikipedia:en: https://en.wikipedia.org/wiki/Brilliant_Blue_FCF + +# https://www.iacmcolor.org/safety-of-color/natural-colors/chlorophylls-and-chlorophyllins/ +# https://www.iacmcolor.org/safety-of-color/natural-colors/chlorophylls-chlorophyllins-copper-complexes/ +# E140: natural Chlorophylls and Chlorophyllins +# E141: natural Chlorophylls and Chlorophyllins with copper +# green 3: chlorophyls +# green 5: chlorophylins + +en: E140, Chlorophylls and Chlorophyllins +xx: E140 +bg: E140, Хлорофили и Хлорофилини +ca: E140, Clorofil·les i Clorofil·lines +cs: E140, Chlorofyly a Chlorofylliny +da: E140, Chlorophyller og Chlorophylliner +de: E140, Chlorophylle und Chlorophylline +el: E140, Χλωροφύλλες και Χλωροφυλλίνες +es: E140, Clorofilas y Clorofilinas +et: E140, Klorofüllid ja Klorofülliinid +fi: E140, Klorofyllit ja Klorofylliinit, Klorofyllejä ja Klorofylliinejä +fr: E140, Chlorophylles et Chlorophyllines +hr: E140, Klorofili i Klorofilini +hu: E140, Klorofillok és Klorofillinek +it: E140, Clorofille e Clorofilline +lt: E140, Chlorofilai ir Chlorofilinai +lv: E140, Hlorofili un Hlorofilīni +mt: E140, Klorofilli u Klorofillini +nl: E140, Chlorofylen en Chlorofyllinen +pl: E140, Chlorofile i Chlorofiliny +pt: E140, Clorofilas e Clorofilinas +ro: E140, Clorofile și Clorofilini +sk: E140, Chlorofyly a Chlorofyllíny +sl: E140, Klorofili in Klorofilini +sv: E140, Klorofyller och Klorofylliner +additives_classes:en: en:colour +# wikidata:en:Q82182 +colour_index:en: CI 75815 +e_number:en: 140 +efsa_evaluation:en: Scientific Opinion on the re-evaluation of chlorophylls (E 140(i)) as food additives +efsa_evaluation_date:en: 2015-05-07 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2015.4089 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q26806091 + +< en: E140 +en: E140(i), Chlorophylls, CI Natural Green 3, Magnesium Chlorophyll, chlorophyll +xx: E140(i) +ar: E140(i), يخضور +az: E140(i), Xlorofil +ba: E140(i), Хлорофилл +be: E140(i), Хларафіл +bg: E140(i), Хлорофили, CI натурално зелено 3, магнезиев хлорофил +bn: E140(i), ক্লোরোফিল +bs: E140(i), Hlorofil +ca: E140(i), clorofilla +cs: E140(i), Chlorofyly, CI přírodní zeleň 3, chlorofyl hořčíku +cy: E140(i), Cloroffyl +da: E140(i), Chlorophyll, CI Natural Green 3 +de: E140(i), Chlorophylle +el: E140(i), Χλωροφυλλες, Πράσινο CI natural 3, μαγνησιοχλωροφύλλη +eo: E140(i), klorofilo +es: E140(i), Clorofilas, CI Natural Green 3, clorofila magnésica +et: E140(i), Klorofüllid, CI looduslik roheline 3, magneesiumklorofüll +eu: E140(i), Klorofila +fa: E140(i), سبزینه +fi: E140(i), Klorofyllit, Klorofyllejä, CI Natural Green 3, Magnesiumklorofylli, Magnesiumklorofylliä +fr: E140(i), Chlorophylles, Phéophytine au magnésium, Chlorophylle, Chlorophylles magnésium, Vert naturel CI n°3, Vert naturel C. I. no 3, chlorophylle au magnésium +ga: E140(i), Clóraifill +gl: E140(i), Clorofila +gu: E140(i), હરિતદ્રવ્ય +he: E140(i), כלורופיל +hi: E140(i), पर्ण हरिम +hr: E140(i), Klorofil, bojilo klorofili +ht: E140(i), Klowofil +hu: E140(i), Klorofillok, CI Natural Green 3, Magnézium-klorofill +hy: E140(i), Քլորոֆիլ +id: E140(i), Klorofil +io: E140(i), Klorofilo +it: E140(i), Clorofille, CI verde naturale 3, clorofilla magnesiaca +ja: E140(i), クロロフィル +jv: E140(i), Klorofil +ka: E140(i), ქლოროფილი +kk: E140(i), Хлорофилл +kn: E140(i), ಕ್ಲೋರೊಫಿಲ್ +ko: E140(i), 엽록소 +ku: E140(i), Klorofîl +ky: E140(i), Хлорофилл +la: E140(i), Chlorophyllum +lt: E140(i), Chlorofilai, Natūralus žaliasis CI Nr. 3, magnio chlorofilas +lv: E140(i), Hlorofili, CI dabīgais zaļais 3, magnija hlorofils +mk: E140(i), Хлорофил +ml: E140(i), ഹരിതകം +mr: E140(i), हरितद्रव्य +ms: E140(i), Klorofil +mt: E140(i), Klorofilli, CI Natural Green 3, Manjeżju Klorofill +nb: E140(i), Klorofyll +ne: E140(i), हरितकण +nl: E140(i), Chlorofylen, CI Natural Green 3, Magnesiumchlorofyl +oc: E140(i), Clorofilla +pl: E140(i), Chlorofile, CI zieleń naturalna 3, chlorofil magnezowy +pt: E140(i), Clorofilas, Verde natural CI 3, clorofila de magnésio +qu: E140(i), Raphi q'umir +ro: E140(i), Clorofile, Verde natural CI 3, Clorofilă de magneziu +sh: E140(i), Hlorofil +sk: E140(i), Chlorofyly, CI prírodná zelená 3, horečnatý chlorofyl +sl: E140(i), Klorofili, CI Natural Green 3, magnezijev klorofil +sq: E140(i), Klorofili +sr: E140(i), хлорофил +su: E140(i), Kloropil +sv: E140(i), Klorofyller, CI Natural Green 3, magnesiumklorofyll +sw: E140(i), Klorofili +ta: E140(i), பச்சையம் +te: E140(i), పత్రహరితం +th: E140(i), คลอโรฟิลล์ +tr: E140(i), Klorofil +uk: E140(i), Хлорофіл +vi: E140(i), Diệp lục +wa: E140(i), Clorofile +zh: E140(i), 叶绿素 +additives_classes:en: en:colour +colour_index:en: CI 75810 +description:en: CHLOROPHYLL is any of several related green pigments found in cyanobacteria and the chloroplasts of algae and plants. Chefs use chlorophyll to color a variety of foods and beverages green, such as pasta and spirits. +# usage:en:colours (chlorophylls, curcumin) +# usage:fr:de couleurs (chlorophylles, curcumine) +e_number:en: 140 +efsa_evaluation:en: Scientific Opinion on the re-evaluation of chlorophylls (E 140(i)) as food additives +efsa_evaluation_date:en: 2015-05-07 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2015.4089 +wikidata:en: Q82182 +# nl_be:E140(i), Chlorofylen, CI Natural Green 3, Magnesiumchlorofyl +# arz:E140(i), كلوروفيل +# ast:E140(i), Clorofila +# be-tarask:E140(i), Хлярафіл +# ckb:E140(i), کلۆرۆفیل +# frr:E140(i), Chlorophyll +# gsw:E140(i), Chlorophyll +# nan:E140(i), Ia̍p-le̍k-sò͘ +# sco:E140(i), chlorophyll +# sr-ec:E140(i), хлорофил +# sr-el:E140(i), hlorofil +# wuu:E140(i), 叶绿素 +# xmf:E140(i), ქლოროფილი +# yue:E140(i), 葉綠素 +wikipedia:en: https://en.wikipedia.org/wiki/Chlorophyll + +< en: E140 +en: E140(ii), Chlorophyllins, CI Natural Green 5, Sodium Chlorophyllin +xx: E140(ii) +bg: E140(ii), Хлорофилини, CI натурално зелено 5, натриев хлорофилин +cs: E140(ii), Chlorofyliny, CI přírodní zeleň 5, chlorofylin sodíku +da: E140(ii), Chlorophylliner, CI Natural Green 5, natriumchlorophyllin +de: E140(ii), Chlorophylline +el: E140(ii), Χλωροφυλλινες, Πράσινο CI natural 5, χλωροφυλλινικό νάτριο +es: E140(ii), Clorofilinas, CI Natural Green 5, clorofilina sódica +et: E140(ii), Klorofülliinid, CI looduslik roheline 5, naatriumklorofülliin +fi: E140(ii), Klorofylliinit, Klorofylliinejä, CI Natural Green 5, Natriumklorofylliini, Natriumklorofylliiniä +fr: E140(ii), Chlorophyllines, sels basiques des chlorophyllines, Vert naturel CI no5, Vert naturel CI n°5, chlorophylline sodique, chlorophylline potassique, Vert naturel C. I. no 5 +hu: E140(ii), Klorofillinek, CI Natural Green 5, Nátrium-klorofillin +it: E140(ii), Clorofilline, CI verde naturale 5, clorofillina di sodio +lt: E140(ii), Chlorofilinai, Natūralus žaliasis CI Nr. 5, natrio chlorofilinas +lv: E140(ii), Hlorofilīni, CI dabīgais zaļais 5, nātrija hlorofilīns +mt: E140(ii), Klorofillini, CI Natural Green 5, Klorofillin tas-Sodju +nl: E140(ii), Chlorofylinen, CI Natural Green 5, natriumchlorofyline +nl_be: E140(ii), Chlorofylinen, CI Natural Green 5, natriumchlorofyline +pl: E140(ii), Chlorofiliny, CI zieleń naturalna 5, chlorofilina sodowa +pt: E140(ii), Clorofilinas, Verde natural CI 5, clorofilina de sódio +ro: E140(ii), Clorofiline, Verde natural CI 5, Clorofilină sodică +sk: E140(ii), Chlorofylíny, CI prírodná zelená 5, sodný chlorofylín +sl: E140(ii), Klorofilini, CI Natural Green 5, natrijev klorofilin +sv: E140(ii), Klorofylliner, CI Natural Green 5, natriumklorofyllin +additives_classes:en: en:colour +colour_index:en: CI 5 +e_number:en: 140 +efsa_evaluation:en: Scientific Opinion on the re-evaluation of chlorophylls (E 140(i)) as food additives +efsa_evaluation_date:en: 2015-05-07 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2015.4089 +wikidata:en: Q82182 + +en: E141, Copper complexes of chlorophylls and chlorophyllins, Copper complexes of chlorophyll and chlorophyllins +xx: E141 +bg: E141, E141 food additive +ca: E141, Complexos cúprics de clorofil i clorofilines +cs: E141, Mědnaté komplexy chlorofylů a chlorofylinů +da: E141, E141 food additive +de: E141, Kupferhaltigen Komplexe der Chlorophylle und Chlorophylline, Kupferhaltige Komplexe der Chlorophylle und Chlorophylline +el: E141, E141 food additive +es: E141, Complejos cúpricos de clorofilas y clorofilinas +et: E141, E141 food additive +fi: E141, Klorofylliinikuparikompleksit ja Klorofylli-kuparikompleksi, Klorofylli-kuparikompleksia ja Klorofylliinikuparikomplekseja +fr: E141, Complexe cuivrique des chlorophylles et des chlorophyllines +hr: E141 bojilo bakreni kompleksi klorofila i klorofilina, bakreni kompleksi klorofila i klorofilina, klorofili i bakreni kompleksi klorofilina +hu: E141, Klorofillok és klorofillinek rézkomplexei, klorofill-rezkomplexek és klorofillin-rézkomplexek +it: E141, Complessi rameici delle clorofille e delle clorofilline, Complessi rameici della clorofilla e delle clorofilline +lt: E141, E141 food additive +lv: E141, E141 food additive +mt: E141, E141 food additive +nl: E141, Kopercomplexen van chlorophyllen +pl: E141, Kompleksy miedziowe chlorofili i chlorofilin +pt: E141, E141 food additive +ro: E141, Complexe de cupru ale clorofilelor și clorofilinei +rs: E141, bakreni kompleksi klorofila i klorofilina +sk: E141, E141 food additive +sl: E141, E141 food additive, bakrovi kompleksi klorofilov in klorofilinov +sv: E141, E141 food additive +additives_classes:en: en:colour +anses_additives_of_interest:en: yes +e_number:en: 141 +efsa_evaluation:en: Scientific Opinion on re-evaluation of copper complexes of chlorophylls (E 141(i)) and chlorophyllins (E 141(ii)) as food additives +efsa_evaluation_date:en: 2015-06-30 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2015.4151 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q18967203 + +< en: E141 +en: E141(i), Copper complexes of chlorophylls, CI Natural Green 3, Copper Chlorophyll +xx: E141(i) +bg: E141(i), Медни комплекси на хлорофили, CI натурално зелено 3, меден хлорофил +cs: E141(i), Měďnaté komplexy chlorofylů, CI přírodní zeleň 3, chlorofyl mědi +da: E141(i), Chlorophyll-kobber-kompleks, CI Natural Green 3 +de: E141(i), Kupferkomplexe der Chlorophylle +el: E141(i), Συμπλοκα των χλωροφυλλων με χαλκο, Πράσινο CI natural 3, χαλκοχλωροφύλλη +es: E141(i), Complejos cúpricos de clorofilas, CI Natural Green 3, clorofila cúprica +et: E141(i), Klorofüllide vasekompleksid, CI looduslik roheline 3, vaskklorofüll +fi: E141(i), Klorofyllikuparikompleksit, Klorofyllikuparikomplekseja, CI Natural Green 3, Kupariklorofylli, Kupariklorofylliä +fr: E141(i), Complexes cuivriques de chlorophylles, Vert naturel C. I. no 3, chlorophylle cuivrique, complexes cuivre-chlorophylles +hu: E141(i), Klorofillok rézkomplexei, CI Natural Green 3, Réz-klorofill +it: E141(i), Complessi rameici delle clorofille, CI verde naturale 3, clorofilla rameica +lt: E141(i), Chlorofilų vario kompleksiniai junginiai, Natūralus žaliasis CI Nr. 3, vario chlorofilas +lv: E141(i), Hlorofilu vara kompleksi, CI dabīgais zaļais 3, vara hlorofils +mt: E141(i), Kumplessi tar-ram tal-klorofilli, CI Natural Green 3, Klorofill tar-Ram +nl: E141(i), Kopercomplexen van chlorofylen, CI Natural Green 3, koperchlorofyl +pl: E141(i), Kompleksy miedziowe chrolofili, CI zieleń naturalna 3, chlorofil miedziowy +pt: E141(i), Complexos cúpricos de clorofilas, Verde natural CI 3, clorofila cúprica +ro: E141(i), Complexe de cupru ale clorofilelor, Verde natural CI 3, Clorofilă de cupru +sk: E141(i), Meďnaté komplexy chlorofylov, CI prírodná zelená 3, meďnatý chlorofyl +sl: E141(i), Bakrovi kompleksi klorofilov, CI Natural Green 3, bakrov klorofil +sv: E141(i), Kopparkomplex av klorofyller, CI Natural Green 3, kopparklorofyll, Klorofyllkopparkomplex +additives_classes:en: en:colour +anses_additives_of_interest:en: yes +colour_index:en: CI 3 +# nl_be:E141(i), Kopercomplexen van chlorofylen, CI Natural Green 3, koperchlorofyl +e_number:en: 141 +efsa_evaluation:en: Scientific Opinion on re-evaluation of copper complexes of chlorophylls (E 141(i)) and chlorophyllins (E 141(ii)) as food additives +efsa_evaluation_date:en: 2015-06-30 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2015.4151 +wikidata:en: Q18967203 + +< en: E141 +en: E141(ii), Copper complexes of chlorophyllins, Sodium Copper Chlorophyllin, Potassium Copper Chlorophyllin, Copper Chlorophyllin +xx: E141(ii) +bg: E141(ii), Медни комплекси на хлорофилини, Натриев меден хлорофилин, калиев меден хлорофилин +cs: E141(ii), Měďnaté komplexy chlorofylinů +da: E141(ii), Chlorophyllin-kobber-kompleks, Natriumkobberchlorophyllin, kaliumkobberchlorophyllin +de: E141(ii), Kupferkomplexe der Chlorophylline +el: E141(ii), Συμπλοκα των χλωροφυλλινων με χαλκο, Χαλκοχλωροφυλλινικό νάτριο, χαλκοχλωροφυλλινικό κάλιο +es: E141(ii), Complejos cúpricos de clorofilinas, Clorofilina cúprica de sodio, clorofilina cúprica de potasio +et: E141(ii), Klorofülliinide vasekompleksid, Naatriumvaskklorofülliin, kaaliumvaskklorofülliin +fi: E141(ii), Klorofylliinikuparikompleksit, Natriumkupariklorofylliini, Kaliumkupariklorofylliini, Klorofylliinikuparikomplekseja, Natriumkupariklorofylliiniä, Kaliumkupariklorofylliiniä +fr: E141(ii), Sels de sodium et de potassium de complexes cupriques de chlorophyllines, Complexe cuivrique des chlorophyllines avec sels de sodium et de potassium, Cuivre phaeophytin a, Cuivre phaeophytin b, complexes cuivre-chlorophyllines, laque aluminique de chlorophylline, cuivre - chlorophyllines, cuivre-chlorophyllines +hr: E141(ii) +hu: E141(ii), Klorofillinek rézkomplexei, Nátrium-réz-klorofillin, Kálium-réz-klorofillin +it: E141(ii), Complessi rameici delle clorofilline +lt: E141(ii), Chlorofilinų vario kompleksiniai junginiai, Natrio-vario chlorofilinas, kalio-vario chlorofilinas +lv: E141(ii), Hlorofilīnu vara kompleksi, Nātrija vara hlorofilīns, kālija vara hlorofilīns +mt: E141(ii), Kumplessi tar-ram tal-klorofillini +nl: E141(ii), Kopercomplexen van chlorofylinen, Natriumkoperchlorofyline, kaliumkoperchlorofyline +pl: E141(ii), Kompleksy miedziowe chlorofilin +pt: E141(ii), Complexos cúpricos de clorofilinas +ro: E141(ii), Complexe de cupru ale clorofilinelor +sk: E141(ii), Meďnaté komplexy chlorofylínov +sl: E141(ii), Bakrovi kompleksi klorofilinov, natrijev bakrov klorofilin, kalijev bakrov klorofilin +sv: E141(ii), Kopparkomplex av klorofylliner, natriumkopparklorofyllin +additives_classes:en: en:colour +anses_additives_of_interest:en: yes +# nl_be:E141(ii), Kopercomplexen van chlorofylinen, Natriumkoperchlorofyline, kaliumkoperchlorofyline +e_number:en: 141 +efsa_evaluation:en: Scientific Opinion on re-evaluation of copper complexes of chlorophylls (E 141(i)) and chlorophyllins (E 141(ii)) as food additives +efsa_evaluation_date:en: 2015-06-30 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2015.4151 +wikidata:en: Q18967203 +# ingredient/fr:chlorophyllines has 51 products in french @2019-02-03 +# colorants :complexe cuivre - chlorophylline + +en: E142, Green s, CI Food Green 4 +xx: E142 +bg: E142, Зелено s, CI хранително зелено 4 +ca: E142, Verd àcid brillant BS, verd lisamina +cs: E142, Zeleň s, CI potravinářská zeleň 4 +da: E142, Green s, CI Food Green 4 +de: E142, Grün s, Food Green 4, E 142, Brillantsäuregrün BS, Brillantsäuregrün +el: E142, Πρασινο s, Πράσινο CI food 4 +es: E142, Verde s, CI Food Green 4, Green S, Verde ácido brillante BS, Verde lisamina +et: E142, Roheline s, CI roheline toiduvärv 4 +fa: E142, سبز اس +fi: E142, Vihreä s, Briljanttivihreä, CI Food Green 4 +fr: E142, Vert acide brillant BS, Vert lissamine, Vert s +ga: E142, uaine aigéadach lonrach BS +he: E142, ירוק S +hu: E142, Zöld S, CI Food Green 4 +it: E142, Verde s, CI verde per alimenti 4, C27H25N2O7S2Na, Verde Brillante BS +lt: E142, Žaliasis s, Maistinis žaliasis CI Nr. 4, Maisto žaliasis S +lv: E142, Zaļais s, CI Pārtikas zaļais 4 +mt: E142, Aħdar s +nl: E142, Groen s, CI Food Green 4, Briljantzuurgroen BS +pl: E142, Zieleń s, CI zieleń spożywcza 4, Zieleń brylantowa BS +pt: E142, Verde s, Verde alimentar CI 4 +ro: E142, Verde s, Colorant alimentar verde CI 4 +ru: E142, Зелёный S +sh: E142, Zeleno S +sk: E142, Zelená s, CI potravinárska zelená 4 +sl: E142, Zeleno s, CI Food Green 4 +sr: E142, Zeleno S +sv: E142, Grön s, CI Food Green 4, E 142 +uk: E142, Зелений S +colour_index:en: CI 5 +description:en: GREEN S is a green synthetic coal tar triarylmethane dye with the molecular formula C27H25N2O7S2Na. It can be used in mint sauce, desserts, gravy granules, sweets, ice creams, and tinned peas. +# usage:es:espesante (E-142) +e_number:en: 142 +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/1851.pdf +efsa_evaluation:en: Scientific Opinion on the re‐evaluation of Green S (E 142) as a food additive +efsa_evaluation_date:en: 2010/11/22 +efsa_evaluation_exposure_95th_greater_than_adi:en: en:children, en:toddlers +efsa_evaluation_exposure_mean_greater_than_adi:en: en:no-group +efsa_evaluation_overexposure_risk:en: en:moderate +efsa_evaluation_url:en: https://efsa.onlinelibrary.wiley.com/doi/epdf/10.2903/j.efsa.2010.1851 +#Toddlers are counted as children in this study +vegan:en: yes +vegetarian:en: yes +# nl_be:E142, Groen s, CI Food Green 4, Briljantzuurgroen BS +# azb:E142, سبز اس +# sr-el:E142, Zeleno S +wikidata:en: Q420143 +wikipedia:en: https://en.wikipedia.org/wiki/Green_S + +en: E143, Fast Green FCF, Food green 3, C.I. 42053, Solid Green FCF, Green 1724, FD&C Green No. 3, Green 3 +xx: E143 +bg: E143, E143 food additive +cs: E143, E143 food additive +da: E143, E143 food additive +de: E143, Fast Green FCF +el: E143, E143 food additive +es: E143, Verde rápido FCF, E 143 +et: E143, E143 food additive +fi: E143, Nopea Vihreä FCF, Fast Green FCF, CI 42053 +fr: E143, Vert solide FCF, C.I. 42053, Vert 1724 +hu: E143, Fast Green FCF +it: E143, Verde rapido FCF +lt: E143, E143 food additive +lv: E143, E143 food additive +mt: E143, E143 food additive +nl: E143, Fast Green FCF +nl_be: E143, E143 food additive +pl: E143, Zielony trwały FCF +pt: E143, Verde rápido, Verde rápido FCF +ro: E143, Verde solid FCF +sk: E143, E143 food additive +sl: E143, E143 food additive +sv: E143, E143 food additive +additives_classes:en: en:colour +e_number:en: 143 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q898299 + +en: E150, Caramel +xx: E150 +ar: E150, كراميل +be: E150, карамель +bg: E150, Карамел +ca: E150, Caramel +cs: E150, karamel +da: E150, Karamel +de: E150, Karamell, Caramel +el: E150, καραμέλα +eo: E150, karamelo +es: E150, Caramelo, Caramelina +et: E150, Karamell +eu: E150, Karamelu +fa: E150, کارامل +fi: E150, Karamelli +fr: E150, Caramel +ga: E150, Caramal +gl: Caramelo +he: E150, קרמל +hr: E150, karamel, karamela +hu: E150, Karamell +hy: E150, Կարամել +id: E150, Karamel +io: E150, Karamelo +is: E150, Karamella +it: E150, caramello +ja: E150, キャラメル, カラメル +ka: E150, კარამელი +kk: E150, Карамель +kn: E150, ಕ್ಯಾರಮೆಲ್ +ko: E150, 캐러멜 +ky: E150, Карамель +li: E150, Sjloek +lt: E150, Karamelė +lv: E150, karameles +mk: E150, Карамела +ms: E150, Karamel +mt: E150, E150 food additive +nb: E150, karamell +nl: E150, karamel, caramel +nn: E150, Karamell +oc: E150, caramèl +pl: E150, karmel, karmelowy, karmelowe, karmelowa, karmelu +pt: E150, caramelo +ro: E150, Carmel +ru: E150, карамель +sk: E150, Karamel +sl: E150, Karamel +sr: E150, Karamela +sv: E150, E150 food additive +ta: E150, கேரமல் +th: E150, คาราเมล +tl: E150, Karamelo +tr: E150, Karamel +uk: E150, карамель +ur: E150, محروق +uz: E150, Karamel +vi: E150, Nước caramen +zh: E150, 焦糖 +description:en: CARAMEL is a medium to dark-orange confectionery product made by heating a variety of sugars. +# caramel (sucre, eau) +# caramel (sirop de glucose, sucre, eau) +# Colour (Caramel, Phosphoric Acid ) +# too many synonyms for fr, makes taxonomy break +e_number:en: 150 +efsa_evaluation:en: Refined exposure assessment for caramel colours (E 150a, c, d) +efsa_evaluation_date:en: 2012-12-03 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2012.3030 +mandatory_additive_class:en: en:colour +vegan:en: yes +vegetarian:en: yes +# nl_be:E150, karamel +# zh-cn:E150, 焦糖 +# zh-hans:E150, 焦糖 +# zh-hant:E150, 焦糖 +# be-tarask:E150, карамэль +# kk-arab:E150, كارامەل +# kk-cn:كE150, ارامەل +# kk-cyrl:E150, Карамель +# kk-kz:E150, Карамель +# kk-latn:E150, Karamelʹ +# kk-tr:E150, Karamelʹ +# sco:E150, caramel +# yue:E150, 焦糖 +# zh-hk:E150, 焦糖 +# zh-sg:E150, 焦糖 +# zh-tw:E150, 焦糖 +wikidata:en: Q183440 +wikipedia:en: https://en.wikipedia.org/wiki/Caramel + +en: E150a, Plain caramel, caramel color, caramel coloring +xx: E150a +ar: E150a, لون الكراميل +bg: E150a, Обикновен карамел +bs: E150a, Karamel boja +ca: E150a, colorant de caramel +cs: E150a, karamelové barvivo, karamelová barva +da: E150a, Madkulør, Sukkerkulør +de: E150a, Zuckerkulör, Zuckercouleur +el: E150a, Απλο καραμελοχρωμα +es: E150a, color caramelo, colorante «Color Caramelo», caramelo para licores +et: E150a, Tavaline karamell +fi: E150a, Sokerikulööri, Sokerikulööriä +fr: E150a, Caramel E150a, caramel ordinaire, Caramelo simple, caramel colorant +hr: E150a, obični karamel, karamel obični, bojila karamel, 150a, bojilo 150a +hu: E150a, Tömény karamell, karamell színezék +it: E150a, Caramello semplice, colorante caramello +ja: E150a, カラメル色素 +lt: E150a, Paprastoji karamelė +lv: E150a +mt: E150a, Karamella naturali +nb: E150a, Sukkerkulør +nl: E150a, karamelkleurstof +pl: E150a, aromat karmelowy +pt: E150a, Caramelo simples, caramelo e 150 +ro: E150a, Caramel simplu +ru: E150a, карамельный краситель +sk: E150a, Obyčajný karamel +sl: E150a, Navaden karamel +sv: E150a, Sockerkulör +tt: E150a, кәрәмил буягычы +vi: E150a, Màu caramel +zh: E150a, 焦糖色素 +additives_classes:en: en:colour +anses_additives_of_interest:en: yes +# caramel aromatique (sirop de glucose, sucre, eau) +description:en: Caramel color or caramel coloring is a water-soluble food coloring. +e_number:en: 150a +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/2004.pdf +efsa_evaluation:en: Refined exposure assessment for caramel colours (E 150a, c, d) +# 300 is not the ADI of E150a alone but an ADI shared by the four E150(a,b,c,d) +efsa_evaluation_adi:en: 300 +efsa_evaluation_date:en: 2012-12-03 +efsa_evaluation_exposure_95th_greater_than_adi:en: en:no-group +efsa_evaluation_exposure_mean_greater_than_adi:en: en:no-group +# efsa:en:http://www.efsa.europa.eu/fr/efsajournal/doc/3030.pdf +efsa_evaluation_overexposure_risk:en: en:no +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2012.3030 +vegan:en: yes +vegetarian:en: yes +# nl_be:E150a, karamelkleurstof +# en-ca:E150a, Caramel color +# en-gb:E150a, Caramel color +wikidata:en: Q227816 +wikipedia:en: https://en.wikipedia.org/wiki/Caramel_color + +en: E150b, Caustic sulphite caramel, caramel E150b +xx: E150b +bg: E150b, Карамел основен сулфит, Каустично-сулфитен карамел +cs: E150b, Kaustický sulfitový karamel +da: E150b, Kaustisk sulfiteret karamel +de: E150b, Sulfitlaugen-Zuckerkulör, Karamell E150b, Sulfitlaugen-Zuckercouleur +el: E150b, Καυστικο θειωδες καραμελοχρωμα +es: E150b, Caramelo de sulfito cáustico, caramelo cáustico +et: E150b, Leeliseline sulfitkaramell +fi: E150b, Emäksinen sulfiittisokerikulööri, Emäksistä sulfiittisokerikulööriä +fr: E150b, Caramel de sulfite caustique, Caramel au sulfite de soude, Caramel E150b, E150b (caramel), E150b caramel, Caramel II, Caustic sulfite caramel, Caramelo cáustico de sulfito, Caramel au sulfite caustique, Caramel sulfité +hu: E150b, Szulfitos karamell +it: E150b, Caramello solfito-caustico +lt: E150b, Šarminė sulfitinė karamelė +lv: E150b, Sulfīta karamele +mt: E150b, Karamella tas-sulfit kawstiku +nb: E150b, Kaustisk sulfitert sukkerkulør +nl: E150b, Alkali-sulfietkaramel +pl: E150b, Karmel siarczynowy, Karmel kaustyczno-siarczynowy, Karmel zasadowo-siarczynowy, Karmel klasy II +pt: E150b, Caramelo sulfítico cáustico +ro: E150b, Caramel de sulfit caustic +sk: E150b, Kaustický sulfitový karamel +sl: E150b, Alkalni sulfitni karamel +sv: E150b, kaustiksulfitprocessen +additives_classes:en: en:colour +anses_additives_of_interest:en: yes +e_number:en: 150b +# nl_be:E150b, Alkali-sulfietkaramel +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/2004.pdf +efsa_evaluation:en: Scientific opinion on the re-evaluation of caramel colours (E 150 a,b,c,d) as food additives +efsa_evaluation_adi:en: 300 +efsa_evaluation_date:en: 2011-03-08 +efsa_evaluation_overexposure_risk:en: en:no +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2011.2004 +vegan:en: yes +vegetarian:en: yes + +en: E150c, Ammonia caramel, baker's caramel, confectioner's caramel, beer caramel, Caramel Color Ammonia, Ammonia caramel, Caramel Color +xx: E150c +bg: E150c, Амониев карамел +cs: E150c, Amoniakový karamel +da: E150c, Ammonieret karamel +de: E150c, Ammoniak-Zuckerkulör, Ammoniak-Zuckercouleur +el: E150c, Εναμμωνιο καραμελοχρωμα +es: E150c, Caramelo amónico, El caramelo amónico, caramelo de panadería, caramelo de confitería, caramelo de cerveza +et: E150c, Ammooniumkaramell +fi: E150c, Ammoniummenetelmän sokerikulööri, Ammoniummenetelmän sokerikulööriä +fr: E150c, Caramel ammoniacal, Caramel E150c, E150c caramel +hr: E150c, amonijačni karamel +hu: E150c, Ammóniás karamell +it: E150c, Caramello ammoniacale +lt: E150c, Amoniakinė karamelė +lv: E150c, Amonija karamele +mt: E150c, Karamella tal-ammonja +nb: E150c, Ammoniert karamell +nl: E150c, Ammoniakkaramel +pl: E150c, Karmel amoniakalny, Karmel amonowy, Karmel klasy III +pt: E150c, Caramelo de amónia +ro: E150c, Caramel amoniacal +ru: E150c, Сахарный колер III, карамельный колер +sk: E150c, Amoniakový karamel +sl: E150c, Amonijev karamel +sv: E150c, ammoniakprocessen +additives_classes:en: en:colour +anses_additives_of_interest:en: yes +e_number:en: 150c +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/2004.pdf +efsa_evaluation:en: Refined exposure assessment for caramel colours (E 150a, c, d) +efsa_evaluation_adi:en: 100 +efsa_evaluation_date:en: 2012-12-03 +#Toddlers are considered as children in this study +efsa_evaluation_exposure_95th_greater_than_adi:en: en:adults, en:toddlers +efsa_evaluation_exposure_mean_greater_than_adi:en: en:no-group +efsa_evaluation_overexposure_risk:en: en:moderate +# efsa:en:http://www.efsa.europa.eu/fr/efsajournal/doc/3030.pdf +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2012.3030 +vegan:en: yes +vegetarian:en: yes +# nl_be:E150c, Ammoniakkaramel +wikidata:en: Q11735907 + +en: E150d, Sulphite ammonia caramel, Sulfite ammonia caramel, 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 +xx: E150d +bg: E150d, Карамел амониев сулфит +cs: E150d, Amoniak-sulfitový karamel +da: E150d, Ammonieret sulfiteret karamel +de: E150d, Ammonsulfit-Zuckerkulör, Ammoniumsulfit-Zuckerkulör, Zuckerkulör E150d, Ammoniumsulfit-Zuckercouleur +el: E150d, Εναμμωνιο θειωδες καραμελοχρωμα +es: E150d, Caramelo de sulfito amónico, Caramelo sulfito de amoníaco, caramelo clase iv, Caramelo sulfito de amoníaco, caramelo a prueba de ácidos, caramelo de bebidas gaseosas, caramelo e150d +et: E150d, Ammooniumsulfitkaramell +fi: E150d, Ammoniumsulfiittimenetelmän sokerikulööri, 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 +hr: E150d, bojilo sulfitno amonijačni karamel, sulfitno amonijačni karamel, sulfitno-amonijačni karamel E150d +hu: E150d, Szulfitos ammóniás karamell +it: E150d, Caramello solfito-ammoniacale +lt: E150d, Sulfitinė amoniakinė karamelė +lv: E150d, Amonija sulfīta karamele +mt: E150d, Karamella tal-ammonja tas-sulfit +nl: E150d, Sulfiet-ammoniakkaramel +pl: E150d, Karmel amoniakalno-siarczynowy +pt: E150d, Caramelo sulfítico de amónia +ro: E150d, Caramel cu sulfit de amoniu +ru: E150d, карамель сульфата аммиака, сахарный колер IV, краситель сахарный-колер, краситель сахарный колер +sk: E150d, Amoniak-sulfitový karamel +sl: E150d, Amonijev sulfitni karamel +sv: E150d, ammoniaksulfitprocessen, sockerkulör E150d +tr: E150d, Sülfit amonyak karamel +additives_classes:en: en:colour +anses_additives_of_interest:en: yes +e_number:en: 150d +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/2004.pdf +efsa_evaluation:en: Refined exposure assessment for caramel colours (E 150a, c, d) +efsa_evaluation_adi:en: 300 +efsa_evaluation_date:en: 2012-12-03 +efsa_evaluation_exposure_95th_greater_than_adi:en: en:no-group +efsa_evaluation_exposure_mean_greater_than_adi:en: en:no-group +efsa_evaluation_overexposure_risk:en: en:no +# efsa:en:http://www.efsa.europa.eu/fr/efsajournal/doc/3030.pdf +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2012.3030 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q13081740 + +en: E151, Brilliant black bn, black pn, E 151, C.I. 28440, Brilliant Black PN, Food Black 1, Naphthol Black, C.I. Food Brown 1, Brilliant Black A +xx: E151 +bg: E151, Брилянтно черно bn, черно pn +ca: E151, Negre brillant BN +cs: E151, Čerň bn, čerň pn, Brilantní čerň BN +da: E151, Black pn (brilliant black bn) +de: E151, Brillantschwarz BN, Brilliantschwarz bn (schwarz pn), E 151, Brillantschwarz PN, Schwarz PN +el: E151, Λαμπρο μαυρο βν, μαυρο pn +es: E151, Negro brillante bn, negro pn, E 151 +et: E151, Briljantmust bn, must pn +fi: E151, Briljanttimusta bn, musta pn, Briljanttimusta, E 151 +fr: E151, Noir brillant BN, Noir PN, noir n°1, noir numéro 1, noir numéro un, Noir alimentaire 1, Naphtol black, CI 28440, CI Food Black 1, Food Black 1, CI Food Brown 1, Brillant Black BN, Brillant Black, Black PN, Noir brillant, Noir PN, Xylene Black F +hu: E151, Fekete PN, Brilliant Black PN +it: E151, Nero brillante bn, nero pn, C28H17N5Na4O14S4 +lt: E151, Briliantinis juodasis bn, juodasis dažiklis pn, Juodasis PN +lv: E151, Briljanta melnais bn, melnais pn +mt: E151, Iswed brillanti bn, iswed pn +nl: E151, Briljantzwart bn, zwart pn, CI 28440 +nl_be: E151, Briljantzwart bn, zwart pn, CI 28440 +pl: E151, Czerń brylantowa bn, czerń pn, Czerń brylantowa PN, Czerń BN +pt: E151, Negro brilhante bn, negro pn, Negro brilhante +ro: E151, Negru briliant bn, negru pn +sk: E151, Brilantná čierna bn, čierna pn +sl: E151, Briljantno črno bn, črno pn +sv: E151, Briljantsvart bn, svart pn, E 151 +additives_classes:en: en:colour +colour_index:en: CI 28440 +e_number:en: 151 +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/1540.pdf +efsa_evaluation:en: Refined exposure assessment for Brilliant Black BN (E 151) +efsa_evaluation_adi:en: 5 +efsa_evaluation_date:en: 2015-01-09 +efsa_evaluation_overexposure_risk:en: en:no +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2015.3960 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q420079 + +en: E152, Black 7984, Food Black 2, carbon black +xx: E152 +bg: E152, E152 food additive +cs: E152, E152 food additive +da: E152, Carbon black +de: E152, Kienruß +el: E152, E152 food additive +es: E152, negro de carbón, carbono negro, carbón negro +et: E152, Tahm +fi: E152, Musta 7984 +fr: E152, Noir de carbone, Hydrocarbure, Noir 7984, Black 7984, Food Black 2, C.I. 27755 +hu: E152, Fekete 7984, carbon black, szénfekete +it: E152, nero di carbone +lt: E152, E152 food additive +lv: E152, E152 food additive +mt: E152, E152 food additive +nl: E152, carbon black +pl: E152, Czerń 7984 +pt: E152, E152 food additive +ro: E152, Cărbune negru +sk: E152, E152 food additive +sl: E152, E152 food additive +sv: E152, Kimrök +colour_index:en: CI 27755 +# nl_be:E152, carbon black +e_number:en: 152 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q764245 + +en: E153, Vegetable carbon +xx: E153 +bg: E153, Растителен въглен +ca: E153, Carbó vegetal, carbo vegetal +cs: E153, Rostlinná uhlíková čerň +da: E153, Vegetabilsk kul +de: E153, Pflanzenkohle +el: E153, Φυτικος ανθρακας +es: E153, Carbón vegetal +et: E153, Taimne süsi +fi: E153, Kasviperäinen lääkehiili, lääkehiili, kasvihiili, Kasviperäistä lääkehiiltä, lääkehiiltä, kasvihiiltä +fr: E153, Charbon végétal médicinal, charbon végétal, noir végétal, vegetable carbon, charbon de bois, Charbon de bois +hr: E153 +hu: E153, Növényi szén, Carbo medicinalis vegetabilis +it: E153, Carbone vegetale +lt: E153, Augalinės anglys +lv: E153, Augogle +mt: E153, Karbonju tal-ħxejjex +nb: E153, Biokull +nl: E153, Plantaardige koolstof +pl: E153, Węgiel roślinny +pt: E153, Carvão vegetal +ro: E153, Carbon vegetal +ru: E153, уголь растительный +sk: E153, Rastlinné uhlie +sl: E153, Rastlinsko oglje +sv: E153, Vegetabiliskt kol +# nl_be:E153, Plantaardige koolstof +e_number:en: 153 +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/2592.pdf +efsa_evaluation:en: Scientific Opinion on the re-evaluation of vegetable carbon (E 153) as a food additive +efsa_evaluation_date:en: 2012-04-27 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2012.2592 +organic_eu:en: authorized +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q59557415 +# comment:en:E153 can be consumed by all religious groups, vegans and vegetarians. + +en: E154, Brown FK, Kipper Brown +xx: E154 +bg: E154, Кафяво FK +ca: E154, Marró FK, marro FK +cs: E154, Hněď FK +da: E154, Brun FK +de: E154, Braun FK +el: E154, Καστανό FK +es: E154, Marrón FK +et: E154, Pruun FK +fi: E154, Ruskea FK +fr: E154, Brun FK +hu: E154, Barna FK +it: E154, Marrone FK +lt: E154, Rudasis FK +lv: E154, Brūns FK +mt: E154, Marron FK +nl: E154, Bruin FK +nl_be: E154, Bruin FK +pl: E154, Brąz FK +pt: E154, Castanho FK +ro: E154, Brun FK +sk: E154, Hnede FK +sl: E154, Rjava FK +sv: E154, Brun FK +e_number:en: 154 +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/1535.pdf +efsa_evaluation:en: Scientific Opinion on the re-evaluationof Brown FK (E 154) as a food additive +efsa_evaluation_date:en: 2010-04-21 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2010.1535 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q425437 + +en: E155, Brown ht, Chocolate brown HT +xx: E155 +bg: E155, Кафяво ht +ca: E155, Marró HT, marro HT +cs: E155, Hněď ht +da: E155, Brown ht +de: E155, Braun ht, E 155 +el: E155, Καστανο ht, Καστανό CI food 3 +es: E155, Marrón ht, E 155, Pardo HT, Marrón chocolate HT +et: E155, Pruun ht +fi: E155, Ruskea ht, E 155, CI 20285 +fr: E155, Brun chocolat HT, Brun ht +hu: E155, Barna HT, Csokoládébarna HT +it: E155, Bruno ht, Marrone HT, C27H18N4Na2O9S2 +lt: E155, Rudasis ht, Maisto rudasis 3, Šokolado rudasis HT +lv: E155, Brūnais ht +mt: E155, Kannella ht +nl: E155, Bruin ht +nl_be: E155, Bruin ht +pl: E155, Brąz ht +pt: E155, Castanho ht +ro: E155, Brun ht +sk: E155, Hnedá ht +sl: E155, Rjavo ht +sv: E155, Brun ht, E 155 +additives_classes:en: en:colour +colour_index:en: CI 20285 +e_number:en: 155 +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/1536.pdf +efsa_evaluation:en: Refined exposure assessment of Brown HT (E 155) +efsa_evaluation_date:en: 2014/05/28 +efsa_evaluation_exposure_95th_greater_than_adi:en: en:adults, en:adolescents, en:children, en:toddlers +efsa_evaluation_exposure_mean_greater_than_adi:en: en:children, en:toddlers +efsa_evaluation_overexposure_risk:en: en:high +efsa_evaluation_url:en: https://efsa.onlinelibrary.wiley.com/doi/epdf/10.2903/j.efsa.2014.3719 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q424541 + +en: E15x, E15x food additive +xx: E15x +bg: E15x, E15x food additive +cs: E15x, E15x food additive +da: E15x, E15x food additive +de: E15x, E15x food additive +el: E15x, E15x food additive +es: E15x, E15x food additive +et: E15x, E15x food additive +fi: E15x, CI 77266, Hiilimusta +fr: E15x, CI 77266, Black carbon, catégorie d'additifs de 152 à 153 +hu: E15x, CI 77266 +it: E15x, E15x food additive +lt: E15x, E15x food additive +lv: E15x, E15x food additive +mt: E15x, E15x food additive +nl: E15x, E15x food additive +nl_be: E15x, E15x food additive +pl: E15x, E15x food additive +pt: E15x, E15x food additive +ro: E15x, CI 77266, Categorie de aditivi a lui E152 și E153 +sk: E15x, E15x food additive +sl: E15x, E15x food additive +sv: E15x, E15x food additive +colour_index:en: CI 77266 +e_number:en: 159 +vegan:en: yes +vegetarian:en: yes + +#comment:en: Use only the generic name in E160 (ending on -oid) +en: E160, Carotenoids +xx: E160 +bg: E160, Каротеноиди +ca: E160, Carotenoides +cs: E160, Karotenoidy +da: E160, Carotenoider, Karotenoid, Carotenoid, Blandede carotener +de: E160, Carotinoide +el: E160, Καροτενοειδή +es: E160, Carotenoides +et: E160, Karotenoidid +fi: E160, Karotenoidit, Karotenoideja +fr: E160, Caroténoïdes, carotènes, Caroténoïde, caroténoïdes mélangés +hr: E160 +hu: E160, Karotinoidok +it: E160, Carotenoidi +ja: E160, カロチノイド色素, カロテノイド色素, カロチノイド, カロテノイド +lt: E160, Karotenoidai +lv: E160, E160 food additive +mt: E160, E160 food additive +nl: E160, E160 food additive +nl_be: E160, E160 food additive +pl: E160, Karotenoidy +pt: E160, Carotenoides +ro: E160, Carotenoide +sk: E160, E160 food additive +sl: E160, E160 food additive +sv: E160, E160 food additive +e_number:en: 160 +efsa_evaluation:en: Scientific Opinion on the reconsideration of the ADI and a refined exposure assessment of beta-apo-8'-carotenal (E 160e) +efsa_evaluation_date:en: 2014-01-22 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2014.3492 +# Stabilizer/carrier may not be vegetarian, can be e.g. fish gelatine, which does not need to be labeled in EU right +# https://www.vrg.org/blog/2012/02/15/beta-carotene-in-us-beverages-not-stabilized-with-gelatin-unlike-some-products-in-the-uk +# https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:32007L0068 +vegan:en: maybe +vegetarian:en: maybe +wikidata:en: Q191907 + +#comment:en: E160a are mixed carotenes and E160b the beta-variants (put those there) +en: E160a, carotene +xx: E160a +bg: E160a, Каротин +ca: E160a, Carotè +cs: E160a, karoteny, karoten +da: E160a, Karotin, Karoten, Caroten +de: E160a, Carotine, Karotin, Carotin, Gamma-Carotin, Alpha-Carotin, γ-Carotin, α-Carotin +el: E160a, Καροτίνη, Καροτένιο, Γάμμα-καροτένιο, Άλφα-καροτένιο +es: E160a, Alfa-caroteno, Alfacaroteno, α-caroteno, Gamma-caroteno, Gammacaroteno, γ-caroteno, Carotina, Tetraterpeno +et: E160a, Karoteenid, Karotiinid, Karotiin, Karoteen +fi: E160a, Karoteeni, Karoteenia +fr: E160a, carotènes mélangés, carotène, γ-Carotène, gamma-carotène, Alphacarotene, Α-Carotène +hr: E160a, karoten, bojilo karoteni, karoteni +hu: E160a, Karotinok +it: E160a, Carotene, Carotina, Caroteni +ja: E160a, カロチン, カロテン, カロテン色素 +lt: E160a, Karotinas +lv: E160a, E160a food additive +mt: E160a, E160a food additive +nb: E160a, Karotener +nl: E160a, caroteen, Carotenen +pl: E160a, karoteny, karoten +pt: E160a, Caroteno +ro: E160a, Caroten +ru: E160a, каротины, e160а +sk: E160a, Karotén +sl: E160a, E160a food additive +sv: E160a, Karoten, Karotener, Karotin, Alfakaroten +tr: E160a, karoten, karotenler +additives_classes:en: en:colour +e_number:en: 160a +efsa_evaluation:en: Safety of the proposed extension of use of synthetic Beta-carotene [E 160a(ii)] in foods for special medical purposes in young children +efsa_evaluation_date:en: 2016-03-18 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2016.4434 +from_palm_oil:en: maybe +mandatory_additive_class:en: en:colour +vegan:en: maybe +vegetarian:en: maybe +wikidata:en: Q190156 + +< en: E160a +en: E160a(i), Beta-carotene, b-carotene +xx: E160a(i) +bg: E160a(i), Бета-каротин +cs: E160a(i), Beta-karoten +da: E160a(i), Beta-caroten, Betacaroten +de: E160a(i), Beta-Carotin, Betacarotin +el: E160a(i), Β-καροτενιο +es: E160a(i), Beta-caroteno, Betacaroteno, ß-caroteno +et: E160a(i), Beetakaroteen +fi: E160a(i), Beetakaroteeni, Beta-karoteeni, Betakaroteeni, Beetakaroteenia, Beta-karoteenia, Betakaroteenia, Betakarotiini +fr: E160a(i), Bêta-carotène, b-carotène +hr: E160a(i), beta karoten, beta carotene +hu: E160a(i), Béta-karotin +it: E160a(i), Beta-carotene +ja: E160a(i), β-カロチン, β-カロテン +lt: E160a(i), Beta karotenas +lv: E160a(i), Beta-karotīns +mt: E160a(i), Beta-karotên +nb: E160a(i), Betakaroten +nl: E160a(i), Bèta-caroteen, betacaroteen +pl: E160a(i), Beta-karoten, B-karoten, betakaroten +pt: E160a(i), Beta-caroteno +ro: E160a(i), Beta-caroten +sk: E160a(i), Beta-karotén +sl: E160a(i), Beta karoten +sv: E160a(i), Betakaroten, beta-karoten +uk: E160a(i), бета-каротин +additives_classes:en: en:colour +anses_additives_of_interest:en: yes +e_number:en: 160a +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/2593.pdf +efsa_evaluation:en: Safety of the proposed extension of use of synthetic Beta-carotene [E 160a(ii)] in foods for special medical purposes in young children +efsa_evaluation_date:en: 2016-03-18 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2016.4434 +vegan:en: maybe +vegetarian:en: maybe +wikidata:en: Q306135 +# comment:en:E160a can be consumed by all religious groups, vegans and vegetarians. + +< en: E160a +en: E160a(ii), Plant carotenes +xx: E160a(ii) +bg: E160a(ii), Растителни каротини +cs: E160a(ii), Rostlinné karoteny +da: E160a(ii), Plantecarotener +de: E160a(ii), Pflanzliche carotine +el: E160a(ii), Φυτικα καροτενια +es: E160a(ii), Carotenos de plantas +et: E160a(ii), Taimsed karoteenid, Toiduks kasutatavate taimede, porgandi, taimsete õlide, kõrreliste +fi: E160a(ii), Kasvikaroteenit, Kasvikaroteeneja +fr: E160a(ii), Carotènes végétaux, carotènes de plantes +hu: E160a(ii), Növényi karotinok +it: E160a(ii), Caroteni vegetali +lt: E160a(ii), Augaliniai karotenai +lv: E160a(ii), Augu karotīni +mt: E160a(ii), Karoteni tal-pjanti +nl: E160a(ii), Plantaardige carotenen +nl_be: E160a(ii), Plantaardige carotenen +pl: E160a(ii), Karoteny otrzymywane z roślin, karoteny roślinne +pt: E160a(ii), Carotenos provenientes de plantas +ro: E160a(ii), Caroten din plante +sk: E160a(ii), Rastlinné karotény +sl: E160a(ii), Rastlinski karoteni +sv: E160a(ii), Karotener från växter +additives_classes:en: en:colour +anses_additives_of_interest:en: yes +e_number:en: 160a +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/2593.pdf +efsa_evaluation:en: Safety of the proposed extension of use of synthetic Beta-carotene [E 160a(ii)] in foods for special medical purposes in young children +efsa_evaluation_date:en: 2016-03-18 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2016.4434 +vegan:en: yes +vegetarian:en: yes +# comment:en:E160a can be consumed by all religious groups, vegans and vegetarians. + +< en: E160a +en: E160a(iii), Beta-carotene from blakeslea trispora +xx: E160a(iii) +bg: E160a(iii), Бета-каротин от blakeslea trispora +cs: E160a(iii), Beta-karoten z blakeslea trispora +da: E160a(iii), Beta-caroten fra blakeslea trispora +de: E160a(iii), Beta-carotin aus blakeslea trispora +el: E160a(iii), Β-καροτενιο από blakeslea trispora +es: E160a(iii), Beta-caroteno de blakeslea trispora +et: E160a(iii), Beetakaroteen saadud blakeslea trispora'st, Saadakse fermenteerimisel +fi: E160a(iii), Blakeslea trispora -sienestä saatu beta-karoteeni +fr: E160a(iii), Bêta-carotène issu de blakeslea trispora, β-carotène extrait de Blakeslea trispora +hu: E160a(iii), Béta-karotin blakeslea trisporából +it: E160a(iii), Beta-carotene derivato da blakeslea trispora +lt: E160a(iii), Beta karotenas iš blakeslea trispora, Gaunamas rauginimo būdu +lv: E160a(iii), Beta-karotīns no blakeslea trispora, Iegūst fermentācijas procesā +mt: E160a(iii), Beta-karotên minn blakeslea trispora +nl: E160a(iii), Bèta-caroteen uit blakeslea trispora +pl: E160a(iii), Beta-karoten otrzymywany z blakeslea trispora +pt: E160a(iii), Beta-caroteno de blakeslea trispora +ro: E160a(iii), Beta-caroten din blakeslea trispora +sk: E160a(iii), Beta-karotén z blakeslea trispora +sl: E160a(iii), Beta karoten iz blakeslea trispora +sv: E160a(iii), Betakaroten från blakeslea trispora +additives_classes:en: en:colour +e_number:en: 160a +efsa_evaluation:en: Safety of the proposed extension of use of synthetic Beta-carotene [E 160a(ii)] in foods for special medical purposes in young children +efsa_evaluation_date:en: 2016-03-18 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2016.4434 +vegan:en: yes +vegetarian:en: yes + +< en: E160a +en: E160a(iv), Algal carotenes +xx: E160a(iv) +bg: E160a(iv), Каротини от водорасли +cs: E160a(iv), Karoteny z řas +da: E160a(iv), Algecarotener +de: E160a(iv), Algencarotine +el: E160a(iv), Καροτενια απο φυκη +es: E160a(iv), Carotenos de algas +et: E160a(iv), Vetikalised karoteenid +fi: E160a(iv), Leväkaroteenit, Leväkaroteeneja +fr: E160a(iv), Carotènes d'algues, β-carotène extrait d'algue +hu: E160a(iv), Algakarotinok +it: E160a(iv), Caroteni derivati dalle alghe +lt: E160a(iv), Dumblių karotenai +lv: E160a(iv), Aļģu karotīni +mt: E160a(iv), Karoteni mill-alga +nl: E160a(iv), Caroteen uit algen +pl: E160a(iv), Karoteny otrzymywane z alg +pt: E160a(iv), Carotenos provenientes de algas +ro: E160a(iv), Caroten din alge +sk: E160a(iv), Karotény z rias +sl: E160a(iv), Karoteni iz alg +sv: E160a(iv), Karotener från alger +additives_classes:en: en:colour +e_number:en: 160a +efsa_evaluation:en: Safety of the proposed extension of use of synthetic Beta-carotene [E 160a(ii)] in foods for special medical purposes in young children +efsa_evaluation_date:en: 2016-03-18 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2016.4434 +vegan:en: yes +vegetarian:en: yes + +en: E160b, Annatto, bixin, norbixin, roucou, achiote, annatto norbixin, annatto bixin, Orlean, Terre orellana, L. Orange, CI Natural Orange 4 +xx: E160b +ar: E160b, أناتو +bg: E160b, Анато, биксин, норбиксин (i), БИКСИН И НОРБИКСИН, анато норбиксин +ca: E160b, Arxiota, Bixina, norbixina de bixa, norbixina +cs: E160b, Annatto, bixin, norbixin +da: E160b, Annatto, Annattoekstrakter (bixin og norbixin), Annattoekstrakter, Bixin, Norbixin +de: E160b, Annatto (Bixin und Norbixin), Bixin und Norbixin, Annatto, Achote, Orlean, E 160b, Anatto, Bixin, Norbixin, Annatto Bixin, Annatto Norbixin +el: E160b, Αννατο, μπιξινη, νορμπιξινη (i) +eo: E160b, Biksa kolorigilo +es: E160b, Annato, bixina, norbixina, Achiote, anato +et: E160b, Annaato, biksiin, norbiksiin (i) +fi: E160b, Annatto, biksiini, norbiksiini, Annattoa, biksiiniä, norbiksiiniä +fr: E160b, Rocou, annatto, mélange de bixine et norbixine, Bixine, Norbixine, Annatto extract, Extraits de rocou, Extrait de graine de roucou, base de bixine, base de norbixine, CI 75120, Orange naturel CI n.4, Natural orange 4, CAS 1393-63-1, 89957-43-7, CAS 6983-79-5, Annatto seed extract, Bixa orellana seed extract, bixa orellana, achiote, Annatto G, bixine d'annatto, norbixine d'annatto +hr: E160b, annatto, e160b(i), e160b(ii), annato norbixin +hu: E160b, Annatto, bixin, norbixin +is: E160b, Annatto +it: E160b, Annatto, bissina, norbissina, C24H28O4 +ja: E160b, アナトー色素, アナトー +jv: E160b, Annatto +kn: E160b, ಅನಾಟೋ +ko: E160b, 안나토 +lt: E160b, Anatas, biksinas, norbiksinas +lv: E160b, Annato, biksīns, norbiksīns +mt: E160b, Annatto, biksin, norbiksin +nb: E160b, Annatto +nl: E160b, annatto, Anatto, Annato, annatto norbixine, annatto bixine +pl: E160b, Annato, biksyna, norbiksyna, Annatto, annato norbiksyna +pt: E160b, Anato, bixina, norbixina, Colorau, Coloral, Urucu +ro: E160b, Annatto, bixină, norbixină (i) +ru: E160b, Annatto, аннато, экстракт анато +sk: E160b, Annatto, bixín, norbixín +sl: E160b, Anato, biksin, norbiksin +sr: E160b, Anato +sv: E160b, Annattoextrakt, bixin, norbixin i., Annatto, E 160b, Roucou +vi: E160b, Màu điều nhuộm +zh: E160b, 胭脂樹紅 +additives_classes:en: en:colour +anses_additives_of_interest:en: yes +colour_index:en: CI 75120 +e_number:en: 160b +efsa_evaluation:en: The safety of annatto extracts (E 160b) as a food additive +efsa_evaluation_date:en: 2016-08-24 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2016.4544 +organic_eu:en: authorized +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q425902 +# comment:en:E160b can be consumed by all religious groups, vegans and vegetarians. + +< en: E160b +en: E160b(i), Annatto bixin, Bixin +xx: E160b(i) +additives_classes:en: en:colour +e_number:en: 160b + +< en: E160b +en: E160b(ii), Annatto norbixin, Norbixin +xx: E160b(ii) +fr: E160b(ii), norbixine de rocou +additives_classes:en: en:colour +e_number:en: 160b + +# in English, we sometimes have "paprika color", in which case it is clearly the additive +en: E160c, Paprika extract, capsanthin, capsorubin, Paprika oleoresin, oleoresin of paprika, oleoresin paprika, paprika color, colored with paprika +xx: E160c +bg: E160c, Паприка екстракт, капсантин, капсорубин +ca: E160c, Capsantina +cs: E160c, Paprikový extrakt, kapsanthin, kapsorubin, Capsanthin +da: E160c, Paprikaekstrakt (capsanthin og capsorubin), Paprikaekstrakt, Capsanthin, Capsorubin +de: E160c, Paprikaextrakt (Capsanthin und Capsorubin), Capsanthin, E 160c, Capsorubin +el: E160c, Εκχυλισμα παπρικας, καψανθινη, καψορουμπινη +es: E160c, Extracto de pimentón, capsantina, capsorrubina, Oleorresina de pimentón, Oleoresina de pimentón, Extracto de paprika, Oleoresina del pimentón, E 160c, Extracto del pimentón +et: E160c, Paprikaekstrakt, kapsantiin, kapsorubiin +fi: E160c, Paprikauute, kapsantiini, kapsorubiini, Paprikauutetta, kapsantiinia, kapsorubiinia +fr: E160c, Extrait de paprika, capsanthéine et capsorubine, Oléorésine de paprika, Capsanthine, Capsanthéine, 465-42-9, C40H56O3 +hr: E160c +hu: E160c, Paprikakivonat, paprika kivonat, kapszantin, kapszorubin, Paprika-oleorezin +it: E160c, Estratto di paprica, capsantina, capsorubina +ja: E160c, パプリカ色素 +lt: E160c, Paprikų ekstraktas, kapsantinas, kapsorubinas, Paprikos ekstraktas +lv: E160c, Paprikas ekstrakts, kapsantīns, kapsorubīns +mt: E160c, Estratt tal-paprika, kapsantin, kapsorubin +nb: E160c, Paprikaekstrakt, Capsantin, Capsorubin +nl: E160c, Paprika-extract, capsanthine, capsorubine +nl_be: E160c, Paprika-extract, capsanthine, capsorubine +pl: E160c, Ekstrakt z papryki, kapsantyna, kapsorubina +pt: E160c, Extracto de pimentão, capsantina, capsorubina +ro: E160c, Extract de ardei roșu, capsantină, capsorubină +ru: E160c, Экстракт паприки, капсантин, капсорубин +sk: E160c, Paprikový extrakt, kapsantín, kapsorubín +sl: E160c, Izvleček paprike, kapsantin, kapsorubin +sv: E160c, Paprikaoleoresin, kapsantin, kapsorubin, Paprikaextrakt +tr: E160c, Paprika ekstraktı +additives_classes:en: en:colour +e_number:en: 160c +efsa_evaluation:en: Scientific Opinion on the re-evaluation of paprika extract (E 160c) as a food additive +efsa_evaluation_date:en: 2015-12-10 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2015.4320 +vegan:en: yes +vegetarian:en: yes + +en: E160d, Lycopene +xx: E160d +bg: E160d, Ликопен i, Ликопен +ca: E160d, Licopè +cs: E160d, Lykopen +da: E160d, Lycopen +de: E160d, Lycopin, Lykopin, Leukopin, Lycopen, E 160d, Lycopene +el: E160d, Λυκοπενιο +es: E160d, Licopeno i., Licopeno, E 160d +et: E160d, Lükopeen i, Lükopeen +fi: E160d, Lykopeeni, Lykopeeniä +fr: E160d, Lycopène, Lycopène extrait de Blakeslea trispora, E160d(ii), E160d(iii), E160d(i), 502-65-8 +hu: E160d, Likopin +it: E160d, Licopene, C40H56, Licopina +ja: E160d, リコペン, リコピン +lt: E160d, Likopenas +lv: E160d, Likopēns +mt: E160d, Likopen i +nl: E160d, Lycopeen +nl_be: E160d, Lycopeen +pl: E160d, Likopen +pt: E160d, Licopeno +ro: E160d, Licopen +sk: E160d, Lykopén +sl: E160d, Likopen +sv: E160d, Lykopen, E 160 d, E 160d +additives_classes:en: en:colour +e_number:en: 160d +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/674.pdf +efsa_evaluation:en: Scientific Opinion on the reconsideration of the ADI and a refined exposure assessment of beta-apo-8'-carotenal (E 160e) +efsa_evaluation_date:en: 2014-01-22 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2014.3492 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q208130 + +en: E160e, Beta-apo-8′-carotenal (c30), Apocarotenal, Beta-apo-8'-carotenal, C.I. Food orange 6, E number 160E, Trans-beta-apo-8'-carotenal, C30H40O +xx: E160e +bg: E160e, Бета-апо-8′-каротенал (c30) +cs: E160e, Β-apo-8′-karotenal (c 30) +da: E160e, Beta-apo-8′-carotenal(c30) +de: E160e, Beta-apo-8′-Carotinal (C30), Beta-apo-8′-carotinal (C30), 8′-Apo-β-caroten-8′-al, E 160e, Apocarotinal, Beta-Apocarotinal, 8'-Apo-β-caroten-8'-al, Beta-apo-8'-Carotinal (C30) +el: E160e, Β-απο-8′-καροτεναλη (c30) +es: E160e, Beta-apo-8′-carotenal (c30), Apocarotenal, Beta-apo-8'-carotenal, E 160e +et: E160e, Beeta-apo-8′-karotenaal (c30) +fi: E160e, Beta-apo-8′-karotenaali (c30), beta-apo-8 -karotenaali (C30) +fr: E160e, Apocaroténal 8', bêta-apocaroténal-8, bêta-apocaroténal-8' (C 30), β-apocaroténal-8’, CI food orange 6, C 30, C30, bêta-apocaroténal-8', colorant alimentaire orange CI 6, Β-apo-8′-caroténal (c30), bêta-apocaroténal, Apocaroténal, 1107-26-2, C30H40O +hr: E160e, beta-apo-8'-carotenal, beta-apo-8'-karotenal, beta-apo-8-carotenal, C30, C 30 +hu: E160e, Béta-apo-8′-karotinal (c30) +it: E160e, Beta-apo-8′-carotenale (c30) +lt: E160e, Beta-apo-8′-karotenalis (c30), Beta apo-8'-karotenalis +lv: E160e, Βeta-apo-8′-karotenāls (c30) +mt: E160e, Beta-apo-8′-karotenal (c30) +nl: E160e, Beta-apo-8'-carotenal (c30), Apocarotenal +nl_be: E160e, Beta-apo-8'-carotenal (c30), Apocarotenal +pl: E160e, Beta-apo-8′-karotenal (c30), β-apo-8′-karotenal, beta-apo-8-karotenal +pt: E160e, Beta-apo-8′-carotenal (c30) +ro: E160e, Beta-apo-8′-carotenal (c30) +sk: E160e, Beta-apo-8′-karotenal (c 30) +sl: E160e, Beta-apo-8'-karotenal (c30) +sv: E160e, Beta-apo-8′-karotenal (c 30), Beta-apo-8'-karotenal, E 160e +additives_classes:en: en:colour +anses_additives_of_interest:en: yes +e_number:en: 160e +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/2499.pdf +efsa_evaluation:en: Scientific Opinion on the reconsideration of the ADI and a refined exposure assessment of beta-apo-8'-carotenal (E 160e) +efsa_evaluation_date:en: 2014-01-22 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2014.3492 +vegan:en: yes +vegetarian:en: yes + +en: E160f, Ethyl ester of beta-apo-8'-carotenic acid (C 30), Ethyl ester of beta-apo-8'-carotenic acid , Food orange 7 +xx: E160f +bg: E160f, Етилов естер на бета-апо-8'-каротенова киселина (C 30), Етилов естер на бета-апо-8'-каротенова киселина +de: E160f, β-Apo-8′-carotinsäureethylester, E 160f, Beta-apo-8’-Carotinsäure (C30) Ethylester, Beta-Carotinsäureester, Apocarotinester, Ethyl-8'-apo-β-caroten-8'-oat, Ethyl-8′-apo-β-caroten-8′-oat +es: E160f, Éster etílico del ácido beta-apo-8'-carotenoico (C 30), Éster etílico del ácido beta-apo-8'-carotenoico +fi: E160f, Beta-apo-8’-karoteenihapon etyyliesteri +fr: E160f, Ester éthylique de l'acide -apocaroténique-8', Ester éthylique de l'acide apocaroténique-8' +hu: E160f, Béta-apo-8'-karoténsav-etil észter +it: E160f, Estere etilico dell'acido beta-apo-8'-carotenico (C 30), Estere etilico dell'acido beta-apo-8'-carotenico +ja: E160f, ベータ-アポ-8'-カロテン酸エチルエステル (C 30), ベータ-アポ-8'-カロテン酸エチルエステル +ko: E160f, 베타-아포-8'-카로틴산 에틸 에스테르 (C 30), 베타-아포-8'-카로틴산 에틸 에스테르 +nl: E160f, Beta-8'-caroteenzure ethylester +nl_be: E160f, Beta-8'-caroteenzure ethylester +pl: E160f, β-apo-8′-karotenian etylu, ester etylowy kwasu β-apo-8′-karotenowego +pt: E160f, Éster etílico do ácido beta-apo-8'-carotênico (C 30), Éster etílico do ácido beta-apo-8'-carotênico +ro: E160f, Beta-apo-carotenic, Acid metil, Etil ester +ru: E160f, Этиловый эфир бета-апо-8'-каротиновой кислоты (C 30), Этиловый эфир бета-апо-8'-каротиновой кислоты +sv: E160f, Beta-apo-8'-karotensyraetylester +zh: E160f, β-阿朴-8'-胡萝卜酸乙酯 (C 30), β-阿朴-8'-胡萝卜酸乙酯 +additives_classes:en: en:colour +anses_additives_of_interest:en: yes +e_number:en: 160f +efsa_evaluation:en: Scientific Opinion on the reconsideration of the ADI and a refined exposure assessment of beta-apo-8'-carotenal (E 160e) +efsa_evaluation_date:en: 2014-01-22 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2014.3492 +vegan:en: yes +vegetarian:en: yes + +en: E161, Xanthophylls +xx: E161 +bg: E161, Ксантофили +ca: E161, Xantofil, Xantòfils +cs: E161, Xantofyly +da: E161, Xanthophyller +de: E161, Xanthophylle +el: E161, Ξανθοφύλλες +es: E161, Xantofilos +et: E161, Ksantofüllid +fi: E161, Ksantofyllit, Ksantofyllejä +fr: E161, Xanthophylles +hu: E161, Xantofillek, Xantofillok +it: E161, Xantofille +lt: E161, Ksantofilai +lv: E161, Ksantofili +mt: E161, Xantofilli +nl: E161, Xanthofylen +pl: E161, Ksantofile +pt: E161, Xantofilos +ro: E161, Xantofile +sk: E161, Xantofyly +sl: E161, Ksantofili +sv: E161, Xantofyller +e_number:en: 161 +efsa_evaluation:en: Scientific Opinion on the re-evaluation of canthaxanthin (E 161 g) as a food additive +efsa_evaluation_date:en: 2010-10-22 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2010.1852 +vegan:en: yes +vegetarian:en: yes +# comment:fr:Dans l'alimentation transformée, les xantophylles sont soit synthétiques, soit d'origine naturelle extraits par solvants chimiques. + +en: E161a, Flavoxanthin +xx: E161a +bg: E161a, Флавоксантин +cs: E161a, Flavoxanthin +da: E161a, Flavoxanthin +de: E161a, Flavoxanthin +el: E161a, Φλαβοξανθίνη +es: E161a, Flavoxantina +et: E161a, Flavoksantiin +fi: E161a, Flavoksantiini, Flavoksantiinia +fr: E161a, Flavoxanthine, flavoxanthin +hu: E161a, Flavoxantin +it: E161a, Flavoxantina +lt: E161a, Flavoksantinas +lv: E161a, Flavoksantīns +mt: E161a, Flavoxanthin +nl: E161a, Flavoxanthine +nl_be: E161a, Flavoxanthine +pl: E161a, Flawoksantyna +pt: E161a, Flavoxantina +ro: E161a, Flavoxantină +sk: E161a, Flavoxanthin +sl: E161a, Flavoksantin +sv: E161a, Flavoxantin +e_number:en: 161a +efsa_evaluation:en: Scientific Opinion on the re-evaluation of canthaxanthin (E 161 g) as a food additive +efsa_evaluation_date:en: 2010-10-22 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2010.1852 +vegan:en: yes +vegetarian:en: yes + +en: E161b, Lutein, Mixed Carotenoids, Xanthophyll, tagete extract +xx: E161b +ar: E161b, لوتين +bg: E161b, Лутеин, Смесени каротиноиди +ca: E161b, luteïna, luteina +cs: E161b, Lutein, Směs karotenoidů +da: E161b, Lutein, Blandede carotenoider +de: E161b, Lutein, Gemischte Carotinoide +el: E161b, Λουτεϊνη, Μείγματα καροτενοειδών +eo: E161b, luteino +es: E161b, Luteína, Mezcla de carotenoides +et: E161b, Luteiin, Karotenoidide segu +eu: E161b, Luteina +fa: E161b, لوتئین +fi: E161b, Luteoliini, luteiini, Luteoliinia, luteiinia +fr: E161b, Lutéine, Lutéines, Lutéines de Tagetes erecta, Extrais de tagetes, xantophylles, Extrait de tagetes, Extraits de tagetes, Lutéol de légumes, extrait de tagète +gl: E161b, Luteína +he: E161b, לוטאין +hr: E161b, lutein +hu: E161b, Lutein, Vegyes karotinoidok +it: E161b, Luteina, Carotenoidi misti +ja: E161b, ルテイン +ko: E161b, 루테인 +lt: E161b, Liuteinas, Karotenoidų mišinys +lv: E161b, Luteīns, Jauktie karotinoīdi +mk: E161b, Лутеин +mt: E161b, Luteina, Karotenojdi mħallta +nb: E161b, Lutein +nl: E161b, Luteïne, Gemengde carotenoïden, extract van afrikaantje +nn: E161b, lutein +pl: E161b, Luteina, Mieszanina karotenoidów +pt: E161b, Luteína, Mistura de carotenóides +ro: E161b, Luteină, Amestec de carotenoide, lutetina +ru: E161b, лютеин +sh: E161b, Lutein +sk: E161b, Luteín, Zmes karotenoidov +sl: E161b, Lutein, mešani karotenoidi +sr: E161b, лутеин +sv: E161b, Lutein, Blandade karotenoider +tr: Lutein +uk: E161b, Лютеїн +vi: E161b, lutein +zh: E161b, 葉黃素 +additives_classes:en: en:colour +anses_additives_of_interest:en: yes +description:en: LUTEIN is a xanthophyll and one of 600 known naturally occurring carotenoids. Lutein is extracted from the petals of African marigold (Tagetes erecta). It is approved for use in the EU and Australia and New Zealand. In the United States lutein may not be used as a food coloring for foods intended for human consumption, but can be added to animal feed. +e_number:en: 161b +efsa_evaluation:en: Scientific Opinion on the re-evaluation of lutein (E 161b) as a food additive +efsa_evaluation_date:en: 2010-07-28 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2010.1678 +vegan:en: yes +vegetarian:en: yes +# nl_be:E161b, Luteïne, Gemengde carotenoïden +# azb:E161b, لوتئین +# pt-br:E161b, luteína +# sr-ec:E161b, лутеин +# sr-el:E161b, Lutein +# zh-cn:E161b, 叶黄素 +# zh-hans:E161b, 叶黄素 +# zh-hant:E161b, 葉黃素 +# zh-hk:E161b, 葉黃素 +# zh-sg:E161b, 叶黄素 +# zh-sg:E161b, 葉黃素 +wikidata:en: Q422067 +wikipedia:en: https://en.wikipedia.org/wiki/Lutein + +en: E161c, Cryptoaxanthin, Cryptoxanthin +xx: E161c +ar: E161c, كريبتوزانتين +bg: E161c, Криптоксантин +ca: E161c, Criptoxantina +cs: E161c, Kryptoxantin +da: E161c, Kryptoxanthin +de: E161c, Cryptoxanthin +el: E161c, Κρυπτοξανθίνη +es: E161c, Criptoxantina, E 161c, Β-Criptoxantina +et: E161c, E161c food additive +fi: E161c, Kryptoksantiini, Kryptoksantiinia +fr: E161c, Cryptoxanthine, Kryptoxanthine, β-carotène-3-ol, β-cryptoxanthine, Cryptoxanthol, Hydroxy-β-carotène, beta-carotène-3-ol, beta-cryptoxanthine, Cryptoxanthol, Hydroxy-beta-carotène +he: E161c, קריפטוקסנטין +hu: E161c, Kriptoxantin +it: E161c, Criptoxantina +ja: E161c, クリプトキサンチン +ko: E161c, 크립토잔틴 +lt: E161c, Kriptoksantinas +nl: E161c, Kryptoxanthine +nl_be: E161c, Kryptoxanthine +pl: E161c, Kryptoksantyna +pt: E161c, Criptoxantina +ro: E161c, Kryptoxantină +ru: E161c, Криптоксантин +sk: E161c, Kryptoxantín +sl: E161c, Kriptoksantin +sv: E161c, Kryptoxantin +tr: E161c, Kriptoksantin +zh: E161c, 隐黄质 +e_number:en: 161c +efsa_evaluation:en: Scientific Opinion on the re-evaluation of canthaxanthin (E 161 g) as a food additive +efsa_evaluation_date:en: 2010-10-22 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2010.1852 +vegan:en: yes +vegetarian:en: yes + +en: E161d, Rubixanthin +xx: E161d +bg: E161d, Рубиксантин +cs: E161d, Rubixantin +da: E161d, Rubixantin +de: E161d, Rubixanthin +el: E161d, Ρουμπιξανθίνη +es: E161d, Rubixantina +et: E161d, Rubikantin +fi: E161d, Rubiksantiini, Rubiksantiinia, Natural yellow 27, C.I. 75135, CI 75135 +fr: E161d, Rubixanthine, Natural yellow 27, C.I. 75135, CI 75135 +hu: E161d, Rubixantin +it: E161d, Rubixantina +lt: E161d, Rubiksantinas +lv: E161d, Rubiksantīns +mt: E161d, Rubixantin +nl: E161d, Rubixanthine +nl_be: E161d, Rubixanthine +pl: E161d, Rubiksantyna, Rubiksanit +pt: E161d, Rubixantina +ro: E161d, Rubixantină +sk: E161d, Rubixantín +sl: E161d, Rubixantin +sv: E161d, Rubixantin +colour_index:en: CI 75135 +e_number:en: 161d +efsa_evaluation:en: Scientific Opinion on the re-evaluation of canthaxanthin (E 161 g) as a food additive +efsa_evaluation_date:en: 2010-10-22 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2010.1852 +vegan:en: yes +vegetarian:en: yes + +en: E161e, Violaxanthin +xx: E161e +ar: E161e, فيولاكسانثين +bg: E161e, Виолаксантин +ca: E161e, Violaxantina +cs: E161e, Violaxanthin +da: E161e, Violaxanthin +de: E161e, Violaxanthin +el: E161e, Βιολαξανθίνη +es: E161e, Violaxantina +et: E161e, Violaksantiin +fi: E161e, Violaksantiini, Violoksantiini, Violaksantiinia, Violoksantiinia +fr: E161e, Violaxanthine, Violoxanthine, Diépoxyde de zéaxanthine +hu: E161e, Violaxantin +it: E161e, Violaxantina +ja: E161e, ビオラキサンチン +ko: E161e, 비올라잔틴 +lt: E161e, Violaksantinas +lv: E161e, Violaksantīns +nl: E161e, Violoxanthine, Violaxanthine +pl: E161e, Wiolaksantyna +pt: E161e, Violaxantina +ro: E161e, Violoxantină +ru: E161e, Виолаксантин +sk: E161e, Violaxanthin +sl: E161e, Violaxanthin +sv: E161e, Violaxantin +zh: E161e, 紫黄质 +e_number:en: 161e +efsa_evaluation:en: Scientific Opinion on the re-evaluation of canthaxanthin (E 161 g) as a food additive +efsa_evaluation_date:en: 2010-10-22 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2010.1852 +vegan:en: yes +vegetarian:en: yes + +en: E161f, Rhodoxanthin +xx: E161f +ar: E161f, رودوكسانثين +bg: E161f, Родоксантин +ca: E161f, Rodoxantina +cs: E161f, Rhodoxanthin +da: E161f, Rhodoxanthin +de: E161f, Rhodoxanthin +el: E161f, Ροδοξανθίνη +es: E161f, Rodoxantina +et: E161f, Rodoksantiin +fi: E161f, Rodoksantiini, Rodoksantiinia +fr: E161f, Rhodoxanthine +hu: E161f, Rhodoxantin +it: E161f, Rodoxantina +ja: E161f, ロドキサンチン +ko: E161f, 로독산틴 +lt: E161f, Rodoksantinas +lv: E161f, Rodoksantīns +nl: E161f, Rhodoxanthine +pl: E161f, Rodoksantyna +pt: E161f, Rodoxantina +ro: E161f, Rodoxantină +ru: E161f, Родоксантин +sk: E161f, Rodoxantín +sl: E161f, Rodoksantin +sv: E161f, Rodoxantin +th: E161f, โรดอกแซนทีน +tr: E161f, Rodoksantin +uk: E161f, Родоксантин +zh: E161f, 红黄素 +e_number:en: 161f +efsa_evaluation:en: Scientific Opinion on the re-evaluation of canthaxanthin (E 161 g) as a food additive +efsa_evaluation_date:en: 2010-10-22 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2010.1852 +vegan:en: yes +vegetarian:en: yes + +en: E161g, Canthaxanthin +xx: E161g +bg: E161g, Кантаксантин +cs: E161g, Kanthaxanthin, Kantaxantin +da: E161g, Canthaxanthin +de: E161g, Canthaxanthin +el: E161g, Κανθαξανθινη +es: E161g, Cantaxantina +et: E161g, Kantaksantiin +fi: E161g, Kantaksantiini, Kantaksantiinia, CI 40850 +fr: E161g, Canthaxanthine, Colorant alimentaire orange C.I. no.8, C.I. Food Orange 8, C.I. 40850, CI 40850 +hu: E161g, Kantaxantin +it: E161g, Cantaxantina +lt: E161g, Kantaksantinas +lv: E161g, Kantaksantīns +mt: E161g, Kantaksantina +nl: E161g, Canthaxanthine, Canthaxantine +pl: E161g, Kantaksantyna +pt: E161g, Cantaxantina +ro: E161g, Cantaxantină +sk: E161g, Kantaxantín +sl: E161g, Kantaksantin +sv: E161g, Kantaxantin +additives_classes:en: en:colour +colour_index:en: CI 40850 +e_number:en: 161g +efsa:en: http://www.efsa.europa.eu/fr/efsajournal/doc/1852.pdf +efsa_evaluation:en: Scientific Opinion on the re-evaluation of canthaxanthin (E 161 g) as a food additive +efsa_evaluation_date:en: 2010-10-22 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2010.1852 +vegan:en: yes +vegetarian:en: yes +# comment:en:E161g can be consumed by all religious groups, vegans and vegetarians. + +en: E161h, Zeaxanthin +xx: E161h +ar: E161h, زياكسانثين +bg: E161h, Зеаксантин +ca: E161h, Zeaxantina +cs: E161h, zeaxantin +da: E161h, Zeaxanthin +de: E161h, Zeaxanthin +el: E161h, Ζεαξανθίνη +eo: E161h, Zeaksantino +es: E161h, Zeaxantina +et: E161h, Zeaksantiin +fa: E161h, زآگزانتین +fi: E161h, Tseaksantiini, Tseaksantiinia +fr: E161h, Zéaxanthine, Zéaxanthine riche en extrait de Tagetes erecta +he: E161h, זאקסנטין +hi: E161h, ज़ेक्सैंथिन +hu: E161h, Zeaxantin +id: E161h, Zeaxanthin +it: E161h, Zeaxantina +ja: E161h, ゼアキサンチン +ko: E161h, 제아잔틴 +lt: E161h, Zeaksantinas +lv: E161h, Zeaksantīns +nl: E161h, Zeaxanthine +pl: E161h, Zeaksantyna +pt: E161h, Zeaxantina +ro: E161h, Zeaxantină +ru: E161h, Зеаксантин +sk: E161h, Zeaxantín +sl: E161h, Zeaksantin +sv: E161h, Zeaxantin +th: E161h, ซีแซนทีน +tr: E161h, Zeaksantin +uk: E161h, Зеаксантин +zh: E161h, 玉米黄质 +additives_classes:en: en:colour +e_number:en: 161h +efsa_evaluation:en: Scientific Opinion on the re-evaluation of canthaxanthin (E 161 g) as a food additive +efsa_evaluation_date:en: 2010-10-22 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2010.1852 +vegan:en: yes +vegetarian:en: yes +# comment:en:E161h can be consumed by all religious groups, vegans and vegetarians. + +en: E161i, Citranaxanthin +xx: E161i +ar: E161i, سيتراناكسانثين +bg: E161i, Цитранксантин +ca: E161i, Citranaxantina +cs: E161i, Citranaxanthin +da: E161i, Citranaxanthin +de: E161i, Citranaxanthin +el: E161i, Κιτραναξανθίνη +es: E161i, Citranaxantina +et: E161i, Tsitranaksantiin +fi: E161i, Sitranaksantiini, Sitranaksantiinia +fr: E161i, Citranaxanthine +hu: E161i, Citranaxantin +it: E161i, Citranaxantina +ja: E161i, シトラナキサンチン +ko: E161i, 시트라나크산틴 +lt: E161i, Citranaksantinas +lv: E161i, Citranaksantīns +nl: E161i, Citranaxanthine +pl: E161i, Cytranaksantyna +pt: E161i, Citranaxantina +ro: E161i, Citranaxantină +ru: E161i, Цитранксантин +sk: E161i, Citranaxantín +sl: E161i, Citranaksantin +sv: E161i, Citranaxanthin +th: E161i, ซิทรานาแซนทิน +tr: E161i, Sitranaksantin +uk: E161i, Цитранксантин +zh: E161i, 柑橘黄质 +description:fr: La CITRANAXANTHINE est un pigment xantophylle naturel (famille des caroténoïdes ), mais elle est vraisemblablement produite par synthèse +e_number:en: 161 +efsa_evaluation:en: Scientific Opinion on the re-evaluation of canthaxanthin (E 161 g) as a food additive +efsa_evaluation_date:en: 2010-10-22 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2010.1852 +vegan:en: yes +vegetarian:en: yes + +en: E161j, Astaxanthin +xx: E161j +ar: E161j, أستازانتين +az: E161j, Astaksantin +bg: E161j, Астаксантин +ca: E161j, Astaxantina +cs: E161j, Astaxanthin +da: E161j, Astaxanthin +de: E161j, Astaxanthin, Haematochrom +el: E161j, Ασταξανθίνη +eo: E161j, Astaksantino +es: E161j, Astaxantina +et: E161j, Astaksantiin +fa: E161j, آستاگزانتین +fi: E161j, Astaksantiini, Astaksantiinia +fr: E161j, Astaxanthine, 472-61-7, C40H52O4 +he: E161j, אסטקסנטין +hr: E161j, Astaksantin +hu: E161j, Asztaxantin +id: E161j, Astaxanthin +it: E161j, Astaxantina, C40H52O4 +ja: E161j, アスタキサンチン +ko: E161j, 아스타잔틴 +lt: E161j, Astaksantinas +lv: E161j, Astaksantīns +mk: E161j, Астаксантин +mt: E161j, Astaxanthin +nl: E161j, Astaxanthine +pl: E161j, Astaksantyna +pt: E161j, Astaxantina +ro: E161j, Astaxantină +ru: E161j, Астаксантин +sk: E161j, Astaxantín +sl: E161j, Astaksantin +sv: E161j, Astaxantin, E 161 j +th: E161j, แอสตาแซนธิน +tr: E161j, Astaksantin +uk: E161j, Астаксантин +zh: E161j, 虾青素 +e_number:en: 161 +efsa_evaluation:en: Scientific Opinion on the re-evaluation of canthaxanthin (E 161 g) as a food additive +efsa_evaluation_date:en: 2010-10-22 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2010.1852 +vegan:en: yes +vegetarian:en: yes +# comment:fr:La production commerciale d'astaxanthine serait d'origine naturelle ou synthétisée de sources pétrochimiques + +en: E162, Beetroot red, betanin +xx: E162 +ar: E162, بيتانين +bg: E162, Оцветител от червено цвекло, бетанин +ca: E162, Betanina, vermell de remolatxa +cs: E162, Betalainová červeň, betanin +da: E162, Rødbedefarve, Betaniner +de: E162, Betanin, Beetenrot, Betanoin, Betenrot +el: E162, Ερυθρα χρωστικη της ριζας των τευτλων, βετανινη +es: E162, Rojo de remolacha, Betanina, Betacianina, E 162, Rojo remolacha +et: E162, Peedipunane, betaniin +fa: E162, بتانین +fi: E162, Punajuuriväri, betalaiini, betaniini, Punajuuriväriä, betalaiinia, betaniinia +fr: E162, Rouge de betterave, bétanine, rouge betterave +hr: E162, betanin, crvena boja iz cikle +hu: E162, Céklavörös, betanin +it: E162, Rosso di radice di barbabietola, betanina, rosso di barbabietola +ja: E162, ベタニン +lt: E162, Burokėlių raudonasis, betaninas +lv: E162, Biešu sarkanais, betanīns +ml: E162, :ബെറ്റാനിൻ +mt: E162, Aħmar tal-pitravi, betanina +nb: E162, Rødbeterødt, Betanin +nl: E162, Betanine, Bietenrood +pl: E162, Czerwień buraczana, betanina +pt: E162, Vermelho de beterraba, betanina, vermelho beterraba +ro: E162, Roșu de sfeclă, betanină +ru: E162, краситель красный свекольный, краситель пищевой красный свекольный +sh: E162, Betanin +sk: E162, Cviklová červená, betanín +sl: E162, Betalain, betanin +sv: E162, Rödbetsrött, betanin +additives_classes:en: en:colour +carbon_footprint_fr_foodges_ingredient:fr: Betteraves +carbon_footprint_fr_foodges_value:fr: 0.2 +# azb:E162, بتانین +e_number:en: 162 +efsa_evaluation:en: Scientific Opinion on the re-evaluation of beetroot red (E 162) as a food additive +efsa_evaluation_date:en: 2015-12-09 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2015.4318 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q420138 + +en: E163, Anthocyanins, Anthocyanin +xx: E163 +ar: E163, أنثوسيان +be: E163, Антацыяны +bg: E163, Антоцианини, Антоциани, Антоцианин +ca: E163, Antocianines, Antocianina +cs: E163, Anthokyany, Antokyan +da: E163, Anthocyaniner, Anthocyanin +de: E163, Anthocyane +el: E163, Ανθοκυανινες +eo: E163, Antocianino +es: E163, Antocianinas, Antocianina +et: E163, Antotsüaniinid +eu: E163, Antozianina +fa: E163, آنتوسیانین +fi: E163, Antosyaanit, Antosyaani, Antosyaaneja, Antosyaania, Antosyaaniväri, Antosyaaniväriä, Antosyaanivärit, Antosyaanivärejä +fr: E163, Anthocyanes, Anthocyane, Anthocyanines +he: E163, אנתוציאנין +hr: E163, antocijani, antocijanin, bojilo antocijani +hu: E163, Antocianinok, Antociánok +hy: E163, Անտոցիաններ +id: E163, Antosianin +is: E163, Antósýanefni +it: E163, Antociani, Antociano +ja: E163, アントシアニン +jv: E163, Antosianin +kk: E163, Антоциандар +ko: E163, 안토시아닌 +ky: E163, Антоциандар +lt: E163, Antocianinai +lv: E163, Antocianīni +ml: E163, ആൻതോസയാനിൻ +mn: E163, Anthocyanin +ms: E163, Antosianin +mt: E163, Antocijanini +nb: E163, Antocyaniner, Antocyanin +nl: E163, Anthocyanen, Anthocyaan +pl: E163, Antocyjany, Antocyjan +pt: E163, Antocianinas, Antocianina +ro: E163, Antocianine +ru: E163, Антоцианы +sk: E163, Antokyaníny +sl: E163, Antocianini, Antocian +sr: E163, Антоцијан +sv: E163, Antocyaner, Antocyanin, Antocyaniner +sw: E163, Antocyanin +tg: E163, Антосианҳо +th: E163, แอนโทไซยานิน +tr: E163, Antosiyanin +uk: E163, Антоціани +uz: E163, Antotsianinlar +zh: E163, 花色素苷 +additives_classes:en: en:colour +# ext:E163, Antocianina +# gsw:E163, Anthocyane +e_number:en: 163 +efsa_evaluation:en: Scientific Opinion on the re-evaluation of anthocyanins (E 163) as a food additive +efsa_evaluation_date:en: 2013-04-23 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2013.3145 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q262547 + +en: E163a, Cyanidin +xx: E163a +ar: E163a, سيانيدين +az: E163a, Siyanidin +bg: E163a, Цианидин +ca: E163a, Cianidina +cs: E163a, Cyanidin +da: E163a, Cyanidin +de: E163a, Cyanidin +el: E163a, Κυανιδίνη +eo: E163a, Cianidino +es: E163a, Cianidina +et: E163a, Tsüanidiin +fi: E163a, Syanidiini, Syanidiiniä +fr: E163a, Cyanidine +he: E163a, ציאנידין +hr: E163a, Cijanidin +hu: E163a, Cianidin +id: E163a, Sianidin +it: E163a, Cianidina +ja: E163a, シアニジン +ko: E163a, 시아니딘 +lt: E163a, Cianidinas +lv: E163a, Cianidīns +mk: E163a, Цијанидин +ms: E163a, Sianidin +mt: E163a, Ċjanidin +nl: E163a, Cyanidine +pl: E163a, Cyjanidyna +pt: E163a, Cianidina +ro: E163a, Cianidină +ru: E163a, Цианидин +sk: E163a, Cyanidín +sl: E163a, Cianidin +sq: E163a, Cianidin +sv: E163a, Cyanidin +tr: E163a, Siyanidin +uk: E163a, Ціанідин +vi: E163a, Cyanidin +zh: E163a, 花青素 +additives_classes:en: en:colour +e_number:en: 163a +efsa_evaluation:en: Scientific Opinion on the re-evaluation of anthocyanins (E 163) as a food additive +efsa_evaluation_date:en: 2013-04-23 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2013.3145 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q417606 + +en: E163b, Delphinidin +xx: E163b +bg: E163b, Делфинидин +cs: E163b, Delphinidin +da: E163b, Delphinidin +de: E163b, Delphinidin +el: E163b, Δελφινιδίνη +es: E163b, Delphinidina +et: E163b, Delphinidiin +fi: E163b, Delfiinidiini, Delfinidiiniä +fr: E163b, Delphinidine +hu: E163b, Delphinidin +it: E163b, Delphinidin +lt: E163b, Delphinidinas +lv: E163b, Delfinidīns +mt: E163b, Delphinidin +nl: E163b, Delphinidine +pl: E163b, Delfinidyna +pt: E163b, Delphinidina +ro: E163b, Delphinidină +sk: E163b, Delphinidín +sl: E163b, Delphinidin +sv: E163b, Delphinidin +additives_classes:en: en:colour +e_number:en: 163b +efsa_evaluation:en: Scientific Opinion on the re-evaluation of anthocyanins (E 163) as a food additive +efsa_evaluation_date:en: 2013-04-23 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2013.3145 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q367258 + +en: E163c, Malvidin +xx: E163c +bg: E163c, Малвидин +cs: E163c, Malvidin +da: E163c, Malvidin +de: E163c, Malvidin +el: E163c, Μαλβιδίνη +es: E163c, Malvidina +et: E163c, Malvidiin +fi: E163c, Malvidiini, Malvidiiniä +fr: E163c, Malvidine +hu: E163c, Malvidin +it: E163c, Malvidin +lt: E163c, Malvidinas +lv: E163c, Malvidīns +mt: E163c, Malvidin +nl: E163c, Malvidine +pl: E163c, Malwidyna +pt: E163c, Malvidina +ro: E163c, Malvidină +sk: E163c, Malvidin +sl: E163c, Malvidin +sv: E163c, Malvidin +additives_classes:en: en:colour +e_number:en: 163c +efsa_evaluation:en: Scientific Opinion on the re-evaluation of anthocyanins (E 163) as a food additive +efsa_evaluation_date:en: 2013-04-23 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2013.3145 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q137220 + +en: E163d, Pelargonidin +xx: E163d +ar: E163d, بيلارغونيدين +az: E163d, Pelarqonidin +bg: E163d, Пеларгонидин +ca: E163d, Pelargonidina +cs: E163d, Pelargonidin +da: E163d, Pelargonidin +de: E163d, Pelargonidin +el: E163d, Πελαργονιδίνη +eo: E163d, Pelargonidino +es: E163d, Pelargonidina +et: E163d, Pelargoniin +fa: E163d, پلارگونیدین +fi: E163d, Pelargonidiini, Pelargonidiiniä +fr: E163d, Pélargonidine +he: E163d, פלרגונידין +hu: E163d, Pelargonidin +id: E163d, Pelargonidin +it: E163d, Pelargonidina +ja: E163d, ペラルゴニジン +ko: E163d, 펠라르고니딘 +lt: E163d, Pelargonidinas +lv: E163d, Pelargonidīns +mk: E163d, Пеларгонидин +ms: E163d, Pelargonidin +mt: E163d, Pelargonidin +nl: E163d, Pelargonidine +pl: E163d, Pelargonidyna +pt: E163d, Pelargonidina +ro: E163d, Pelargonidină +ru: E163d, Пеларгонидин +sk: E163d, Pelargonidín +sl: E163d, Pelargonidin +sq: E163d, Pelargonidin +sv: E163d, Pelargonidin +th: E163d, เพลาร์โกนิดิน +tr: E163d, Pelargonidin +uk: E163d, Пеларгонідин +vi: E163d, Pelargonidin +zh: E163d, 飞燕草素 +additives_classes:en: en:colour +e_number:en: 163d +efsa_evaluation:en: Scientific Opinion on the re-evaluation of anthocyanins (E 163) as a food additive +efsa_evaluation_date:en: 2013-04-23 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2013.3145 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q2522451 + +en: E163e, Peonidin +xx: E163e +ar: E163e, بيونيدين +az: E163e, Peonidin +bg: E163e, Пеонидин +ca: E163e, Peonidina +cs: E163e, Peonidin +da: E163e, Peonidin +de: E163e, Peonidin +el: E163e, Παιονιδίνη +eo: E163e, Peonidino +es: E163e, Peonidina +et: E163e, Peonidiin +fa: E163e, پیونیدین +fi: E163e, Peonidiini, Peonidiiniä +fr: E163e, Péonidine +he: E163e, פאונידין +hi: E163e, पियोनिडिन +hr: E163e, Peonidin +hu: E163e, Peonidin +id: E163e, Peonidin +it: E163e, Peonidin +ja: E163e, ペオニジン +ko: E163e, 페오니딘 +lt: E163e, Peonidinas +lv: E163e, Peonidīns +mk: E163e, Peonidin +ms: E163e, Peonidin +mt: E163e, Peonidin +nl: E163e, Peonidine +pl: E163e, Peonidyna +pt: E163e, Peonidina +ro: E163e, Peonidină +ru: E163e, Пеонидин +sk: E163e, Peonidín +sl: E163e, Peonidin +sq: E163e, Peonidin +sv: E163e, Peonidin +th: E163e, พีโอนิดิน +tr: E163e, Peonidin +uk: E163e, Пеонідин +vi: E163e, Peonidin +zh: E163e, 芍药苷 +additives_classes:en: en:colour +e_number:en: 163e +efsa_evaluation:en: Scientific Opinion on the re-evaluation of anthocyanins (E 163) as a food additive +efsa_evaluation_date:en: 2013-04-23 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2013.3145 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q3072948 + +en: E163f, Petunidin +xx: E163f +bg: E163f, Petunidin +cs: E163f, Petunidin +da: E163f, Petunidin +de: E163f, Petunidin +el: E163f, Petunidin +es: E163f, Petunidin +et: E163f, Petunidin +fi: E163f, Petunidiini, Petunidiiniä +fr: E163f, Pétunidine +hu: E163f, Petunidin +it: E163f, Petunidin +lt: E163f, Petunidin +lv: E163f, Petunidin +mt: E163f, Petunidin +nl: E163f, Petunidin +pl: E163f, Petunidyna, Petunidin +pt: E163f, Petunidin +ro: E163f, Petunidin +sk: E163f, Petunidin +sl: E163f, Petunidin +sv: E163f, Petunidin +additives_classes:en: en:colour +e_number:en: 163f +efsa_evaluation:en: Scientific Opinion on the re-evaluation of anthocyanins (E 163) as a food additive +efsa_evaluation_date:en: 2013-04-23 +efsa_evaluation_url:en: http://dx.doi.org/10.2903/j.efsa.2013.3145 +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q27145212 + +en: E164, saffron, Gardenia Yellow +xx: E164 +af: E164, saffraan +an: E164, zafrán +ar: E164, زعفران +az: E164, زافران +be: E164, шафран +bg: E164, шафран +bn: E164, জাফরান +br: E164, safron +bs: E164, šafran +ca: E164, safrà +cs: E164, šafrán +da: E164, safran +de: E164, Safran +dv: E164, ކުކުން +el: E164, σαφράνι +eo: E164, safrano +es: E164, azafrán +et: E164, safran +eu: E164, azafrai +fa: E164, زعفران +fi: E164, sahrami, sahramia +fr: E164, safran, Jaune de gardénia +ga: E164, cróch +gl: E164, azafrán +he: E164, זעפרן +hi: E164, केसर +hr: E164, šafran, šafrana +hu: E164, šafran +id: E164, kuma-kuma +io: E164, safrano +is: E164, saffran +it: E164, zafferano +ja: E164, サフラン +kn: E164, ಕೇಸರಿ +ko: E164, 사프란 +la: E164, safranum +lb: E164, safran +lt: E164, safrāns +lv: E164, safrāns +ml: E164, കുങ്കുമം +mr: E164, केशर +ms: E164, safron +my: E164, ကုံကုမံ +nb: E164, safran +ne: E164, केशर +nl: E164, saffraan +nn: E164, safran +oc: E164, safran +pa: E164, ਕੇਸਰ +pl: E164, szafran +ps: E164, ګنګو +pt: E164, açafrão +ro: E164, șofran +ru: E164, шафран +sa: E164, केसरम् +sc: E164, zafferano +sd: E164, زعفران +sh: E164, šafran +si: E164, කුංකුම +sl: E164, žafran +sr: E164, шафран +sv: E164, saffran +ta: E164, குங்குமப்பூ +te: E164, కుంకుమ పువ్వు +th: E164, หญ้าฝรั่น +tr: E164, safran +uk: E164, шафран +ur: E164, زعفران +vi: E164, saffron +yi: E164, זאפרען +zh: E164, 番紅花 +ciqual_food_code:en: 11039 +ciqual_food_name:en: Saffron +ciqual_food_name:fr: Safran +# arz:E164, زعفران +# diq:E164, esparıkê kutıkan +# lad:E164, alsafran +# pnb:E164, کیسر +# sco:E164, saffron +# yue:E164, 藏紅花 +e_number:en: 164 +mandatory_additive_class:en: en:colour +vegan:en: yes +vegetarian:en: yes +wikidata:en: Q25434 +wikipedia:en: https://en.wikipedia.org/wiki/Saffron + +en: E165, Gardenia Blue +xx: E165 +bg: E165, Гардения синя +cs: E165, Modrá gardénie +da: E165, Gardenia Blå +de: E165, Gardenia Blau +el: E165, Μπλε γαρδένια +es: E165, Azul de Gardenia +et: E165, Gardenia Sinine +fi: E165, Gardenian sininen +fr: E165, Bleu de gardénia +hu: E165, Gardénia kék, Kék gardénia +it: E165, Blu di Gardenia +lt: E165, Gardenijos mėlyna +lv: E165, Zilā gardēnija +mt: E165, Blu tal-Gardenia +nl: E165, Gardenia Blauw +pl: E165, Gardenia niebieski, Niebieski gardenii +pt: E165, Azul de Gardenia +ro: E165, Albastru de gardénia +ru: E165, Гардения синяя, Синий гардения +sk: E165, Modrá gardénia +sl: E165, Modra gardenija +sv: E165, Gardenia Blå +e_number:en: 165 +vegan:en: yes +vegetarian:en: yes + +en: E166, Sandalwood +xx: E166 +bg: E166, Сандалово дърво +cs: E166, Santalovník +da: E166, Sandeltræ +de: E166, Sandelholz +el: E166, Σανδαλόξυλο +es: E166, Sándalo +et: E166, Sandlipuu +fi: E166, Santelipuu, Santelipuuta +fr: E166, Bois de santal, extrait de bois de santal rouge, extrait de bois de santal +hu: E166, Szantálfa, vörös szantálfa kivonat, szantálfa kivonat +it: E166, Sandalo +lt: E166, Sandalmedis +lv: E166, Sandalkoks +mt: E166, Sandal +nl: E166, Sandelhout +pl: E166, Drzewo sandałowe +pt: E166, Sândalo +ro: E166, Lemn de santal +sk: E166, Santalovník +sl: E166, Sandalovina +sv: E166, Sandelträ +e_number:en: 166 +vegan:en: yes +vegetarian:en: yes + +# the E170 family contains E170(i): Calcium carbonate and E170(ii): Calcium hydrogen carbonate +# put plural for E170 and singular for E170(i) whenever it is possible +# otherwise (Japanese, Korean, Thai, Arabic), put "Calcium carbonate group" or "Calcium carbonate family" +en: E170, Calcium carbonates +xx: E170 +af: E170, Kalsiumkarbonate +ar: E170, مجموعة كربونات الكالسيوم +az: E170, Kalsium karbonatlar +be: E170, Карбанаты кальцыю +bg: E170, Калциеви карбонати +bn: ক্যালসিয়াম কার্বোনেটস +ca: E170, Carbonats de calci +cs: E170, Uhličitany vápenaté +da: E170, calciumkarbonater, calciumcarbonater +de: E170, Calciumcarbonate +el: E170, ανθρακικά άλατα ασβεστίου +eo: E170, Kalcia karbonatoj +es: E170, Carbonatos de calcio +et: E170, Kaltsiumkarbonaadid +eu: E170, Kaltzio karbonatoak +fa: E170, کربنات کلسیم +fi: E170, Kalsiumkarbonaatit +fr: E170, Carbonates de calcium +ga: E170, Carbónáití cailciam +gl: E170, Carbonatos de calcio +he: E170, קרבונטים של סידן +hi: E170, कैल्शियम कार्बोनेट +hr: E170, Kalcijevi karbonati +hu: E170, Kalcium-karbonátok +id: E170, Kalsium karbonat +is: E170, Kalsíumkarbónöt +it: E170, Carbonati di calcio +ja: E170, 炭酸カルシウム族 +jv: E170, Kalsium karbonat +ko: E170, 탄산 칼슘 계열 +lt: E170, Kalcio karbonatai +lv: E170, Kalcija karbonāti +mk: E170, Калциум карбонати +ms: E170, Kalsium karbonat +mt: E170, Karbonati tal-kalċju +nl: E170, Calciumcarbonaten +nn: E170, Kalsiumkarbonatar +no: E170, Kalsiumkarbonater +pl: E170, Węglany wapnia +pt: E170, Carbonatos de cálcio +ro: E170, Carbonați de calciu +ru: E170, Карбонаты кальция +sk: E170, Uhličitany vápnika +sl: E170, Kalcijevi karbonati +sq: E170, Karbonatet kalcium +sr: E170, Калцијум карбонати +sv: E170, Kalciumkarbonater +th: E170, กลุ่มแคลเซียมคาร์บอเนต +tr: E170, Kalsiyum karbonatlar +uk: E170, Карбонати кальцію +vi: E170, Cacbonat canxi +zh: E170, 碳酸钙 +anses_additives_of_interest:en: yes +comment:en: enter the synonyms in plural. +vegan:en: yes +vegetarian:en: yes + +#comment:en:This entry must be doubled in the minerals and additives taxonomy (for the time being). +#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 +organic_eu:en: authorized +vegan:en: yes +vegetarian:en: yes +# azb:E250, سودیوم نیتریت +# sco:E250, Sodium nitrite +# sr-ec:E250, натријум нитрит +# sr-el:E250, Natrijum nitrit +# zh-cn:E250, 亚硝酸钠 +# zh-hans:E250, 亚硝酸钠 +# zh-hant:E250, 亞硝酸鈉 +# zh-hk:E250, 亞硝酸鈉 +# zh-sg:E250, 亚硝酸钠 +# zh-tw:E250, 亞硝酸鈉 +wikidata:en: Q339975 +wikipedia:en: https://en.wikipedia.org/wiki/Sodium_nitrite + +# 1 and values[1] else e_number + record = records.setdefault(e_number, {"e_number": e_number, "name": name, "aliases": set()}) + record["aliases"].update(value.lower() for value in values[1:] if value) + return [{**record, "aliases": sorted(record["aliases"])} for record in records.values()] + + +def import_additives(source=DEFAULT_SOURCE): + records = parse_taxonomy(Path(source).read_text(encoding="utf-8")) + additives = Additive.query.all() + by_code = {additive.e_number: additive for additive in additives if additive.e_number} + by_name = {additive.name.lower(): additive for additive in additives} + for record in records: + code, name = record["e_number"], record["name"] + additive = by_code.get(code) + if additive is None: + candidate = by_name.get(name.lower()) + if candidate is not None and candidate.e_number is None: + additive = candidate + else: + if candidate is not None: + name = f"{name} ({code})" + additive = Additive(name=name) + db.session.add(additive) + by_name[name.lower()] = additive + additive.e_number = code + by_code[code] = additive + additive.aliases = sorted({alias.lower() for alias in (additive.aliases or [])} | set(record["aliases"])) + db.session.commit() + ScanService.refresh_alias_index() + return len(records) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("source", nargs="?", default=DEFAULT_SOURCE, help="Path to an OFF raw taxonomy snapshot") + args = parser.parse_args() + app = create_app() + with app.app_context(): + print(f"Imported {import_additives(args.source)} additives") diff --git a/backend/pytest.ini b/backend/pytest.ini new file mode 100644 index 0000000..c7b23ec --- /dev/null +++ b/backend/pytest.ini @@ -0,0 +1,3 @@ +[pytest] +pythonpath = . +testpaths = tests diff --git a/backend/requirements-dev.txt b/backend/requirements-dev.txt new file mode 100644 index 0000000..1441c92 --- /dev/null +++ b/backend/requirements-dev.txt @@ -0,0 +1,2 @@ +-r requirements.txt +pytest==9.1.1 diff --git a/backend/requirements.txt b/backend/requirements.txt index 3a4a758..779cb8c 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,9 +1,13 @@ -Flask -easyocr -SQLAlchemy -Flask-SQLAlchemy -opencv-python-headless -numpy -thefuzz -python-Levenshtein -Pillow +# The extra index provides CPU-only torch wheels (torch-2.14.0+cpu). pip picks them over the +# CUDA wheels on PyPI because PEP 440 orders a local version (+cpu) above the bare version. +# Pins stay without "+cpu" on purpose: the PyTorch index has no +cpu builds for macOS, where +# the plain PyPI wheel is already CPU-only, so this file installs on every developer machine. +--extra-index-url https://download.pytorch.org/whl/cpu +Flask==3.1.3 +Flask-SQLAlchemy==3.1.1 +Flask-Cors==6.0.5 +easyocr==1.7.2 +Pillow==12.3.0 +thefuzz==0.22.1 +torch==2.14.0 +torchvision==0.29.0 diff --git a/backend/run.py b/backend/run.py index 652877e..e45d4fc 100644 --- a/backend/run.py +++ b/backend/run.py @@ -1,6 +1,12 @@ +import os + from app import create_app app = create_app() if __name__ == '__main__': - app.run(debug=True, host='0.0.0.0', port=5000) + app.run( + debug=os.environ.get('FLASK_DEBUG') == '1', + host='0.0.0.0', + port=int(os.environ.get('PORT', 5000)), + ) diff --git a/backend/seed.py b/backend/seed.py index 3f3a79d..aee3bbb 100644 --- a/backend/seed.py +++ b/backend/seed.py @@ -12,6 +12,7 @@ def seed_database(): # High Risk (Red) Additive( name="Sodium Nitrite", + e_number="E250", aliases=["sodium nitrite"], description="Preservative used in cured meats.", toxicity_level=9, exposure_level=8, @@ -23,6 +24,7 @@ def seed_database(): # Medium Risk (Yellow) Additive( name="Sodium Benzoate", + e_number="E211", aliases=["sodium benzoate"], description="Preservative in acidic foods.", toxicity_level=6, exposure_level=7, @@ -34,6 +36,7 @@ def seed_database(): # Low Risk (Green) Additive( name="Vitamin C", + e_number="E300", aliases=["vitamin c", "ascorbic acid"], description="Ascorbic Acid, antioxidant.", toxicity_level=1, exposure_level=1, @@ -45,6 +48,7 @@ def seed_database(): # Additional Dummy Data Additive( name="Aspartame", + e_number="E951", aliases=["aspartame"], description="Artificial sweetener.", toxicity_level=5, exposure_level=9, @@ -55,6 +59,7 @@ def seed_database(): ), Additive( name="Monosodium Glutamate", + e_number="E621", aliases=["monosodium glutamate", "msg"], description="Flavor enhancer (MSG).", toxicity_level=4, exposure_level=8, diff --git a/backend/tests/conftest.py b/backend/tests/conftest.py new file mode 100644 index 0000000..6045d6e --- /dev/null +++ b/backend/tests/conftest.py @@ -0,0 +1,38 @@ +from io import BytesIO + +import pytest +from PIL import Image + +from app import create_app, db +from app.models import Additive + + +@pytest.fixture +def app(): + app = create_app({ + "TESTING": True, + "SQLALCHEMY_DATABASE_URI": "sqlite:///:memory:", + }) + with app.app_context(): + db.session.add_all([ + Additive(name="Sodium Nitrite", description="Preservative.", + toxicity_level=9, exposure_level=8, sensitivity_level=7, cumulative_level=9), + Additive(name="Sodium Benzoate", description="Preservative.", + toxicity_level=6, exposure_level=7, sensitivity_level=5, cumulative_level=4), + Additive(name="Vitamin C", description="Antioxidant.", + toxicity_level=1, exposure_level=1, sensitivity_level=1, cumulative_level=1), + ]) + db.session.commit() + yield app + + +@pytest.fixture +def client(app): + return app.test_client() + + +@pytest.fixture +def png_bytes(): + buffer = BytesIO() + Image.new("RGB", (8, 8), "white").save(buffer, format="PNG") + return buffer.getvalue() diff --git a/backend/tests/test_import_additives.py b/backend/tests/test_import_additives.py new file mode 100644 index 0000000..4d0572b --- /dev/null +++ b/backend/tests/test_import_additives.py @@ -0,0 +1,94 @@ +from pathlib import Path + +from app import create_app +from app.models import Additive, db +from app.services.scan_service import ScanService, match_additives +from import_additives import DEFAULT_SOURCE, import_additives, parse_taxonomy +from seed import seed_database + + +def test_parser_handles_english_synonyms_subtypes_and_escaped_commas(): + assert parse_taxonomy(r"""fr: E250, nitrite de sodium +en: E250, Sodium nitrite, NaNO2 +en: E150A, Plain caramel +en: E101(i), Riboflavin, Vitamin B2 +en: E621, Monosodium glutamate, L-Glutamic acid\, monosodium salt +en: E571 +en: E14XX, Modified starch +en: Organic acids +""") == [ + {"e_number": "E250", "name": "Sodium nitrite", "aliases": ["nano2", "sodium nitrite"]}, + {"e_number": "E150a", "name": "Plain caramel", "aliases": ["plain caramel"]}, + {"e_number": "E101(i)", "name": "Riboflavin", "aliases": ["riboflavin", "vitamin b2"]}, + {"e_number": "E621", "name": "Monosodium glutamate", "aliases": ["l-glutamic acid, monosodium salt", "monosodium glutamate"]}, + {"e_number": "E571", "name": "E571", "aliases": []}, + ] + + +def test_full_snapshot_upsert_preserves_all_seeded_ratings_and_is_offline(tmp_path, monkeypatch): + monkeypatch.setenv("DATABASE_URL", f"sqlite:///{tmp_path / 'additives.db'}") + seed_database() + app = create_app() + with app.app_context(): + seeded = {a.e_number: a.to_dict() for a in Additive.query.all()} + assert len(seeded) == 5 + first_count = import_additives() + first = {a.e_number: a.to_dict() for a in Additive.query.all()} + assert first_count > 600 + assert len(first) == first_count + assert import_additives() == first_count + assert {a.e_number: a.to_dict() for a in Additive.query.all()} == first + for code, original in seeded.items(): + for field in ("id", "name", "toxicity_level", "exposure_level", "sensitivity_level", "cumulative_level", "description", "health_risk", "usage_limit"): + assert first[code][field] == original[field] + for code, data in first.items(): + assert all(alias == alias.lower() for alias in data["aliases"]) + if code not in seeded: + assert all(data[field] is None for field in ("toxicity_level", "exposure_level", "sensitivity_level", "cumulative_level")) + assert first["E101"]["id"] != first["E101(i)"]["id"] + assert "ascorbic acid" in first["E300"]["aliases"] + assert "msg" in first["E621"]["aliases"] + + +def test_import_refreshes_existing_aliases_without_changing_curation(app, tmp_path, monkeypatch): + service = ScanService() + monkeypatch.setattr(service, "extract_text", lambda _: ["Sodium nitrite"]) + service.analyze_image(b"") + source = tmp_path / "taxonomy.txt" + source.write_text("en: E250, Sodium nitrite, curing additive\n", encoding="utf-8") + original = Additive.query.filter_by(name="Sodium Nitrite").one().to_dict() + import_additives(source) + assert "additive_alias_index" not in app.extensions + updated = Additive.query.filter_by(e_number="E250").one() + assert updated.id == original["id"] + assert updated.toxicity_level == original["toxicity_level"] + monkeypatch.setattr(service, "extract_text", lambda _: ["curing additive"]) + assert service.analyze_image(b"")[0]["matched_text"] == "curing additive" + + +def test_full_taxonomy_matching_does_not_confuse_nearby_chemicals(app): + import_additives() + additives = {a.id: a for a in Additive.query.all()} + index = ScanService._build_index(additives) + labels = [ + ("Water, sugar, flour, salt. 250g 621kJ", set()), + ("Sodium nitrite, ascorbic acid", {"E250", "E300"}), + ("Sodium nitrate, isoascorbic acid", {"E251", "E315"}), + ("E 211, E-330, E150a", {"E211", "E330", "E150a"}), + ("flavour enhancer (621)", {"E621"}), + ("S0dium benz0ate, asc0rbic acid", {"E211", "E300"}), + ("msgpack, messages, 250 621", set()), + ("E101(i)", {"E101(i)"}), + ("Carbonated water, sugar, natural flavouring", set()), + ("Emulsifier: lecithin", {"E322(i)"}), + ] + for label, expected in labels: + matches = match_additives([label], index) + assert {additives[key].e_number for key in matches} == expected, label + + +def test_snapshot_checksum_is_documented(): + import hashlib + + checksum = hashlib.sha256(DEFAULT_SOURCE.read_bytes()).hexdigest() + assert checksum in (Path(DEFAULT_SOURCE).parent / "PROVENANCE.md").read_text() diff --git a/backend/tests/test_label_matching.py b/backend/tests/test_label_matching.py new file mode 100644 index 0000000..8c78b37 --- /dev/null +++ b/backend/tests/test_label_matching.py @@ -0,0 +1,81 @@ +import pytest + +from app.models import Additive, db +from app.services.scan_service import ScanService, match_additives, normalize_e_number, normalize_phrase + + +@pytest.fixture +def label_additives(): + return [ + Additive(name="Sodium Nitrite", e_number="E250", aliases=["sodium nitrite"]), + Additive(name="Sodium Benzoate", e_number="E211", aliases=["sodium benzoate"]), + Additive(name="Vitamin C", e_number="E300", aliases=["ascorbic acid"]), + Additive(name="Monosodium Glutamate", e_number="E621", aliases=["msg"]), + Additive(name="Citric acid", e_number="E330", aliases=[]), + Additive(name="Plain caramel", e_number="E150a", aliases=[]), + Additive(name="Sodium nitrate", e_number="E251", aliases=[]), + Additive(name="Isoascorbic acid", e_number="E315", aliases=[]), + ] + + +@pytest.mark.parametrize("text, codes", [ + ("Ingredients: pork, salt, sodium nitrite, antioxidant ascorbic acid.", {"E250", "E300"}), + ("Carbonated water, sugar, E 211, E-330, colour E150a.", {"E211", "E330", "E150a"}), + ("Sodium nitrite (E250), MSG, flavour enhancer (621), ascorbic acid.", {"E250", "E621", "E300"}), + ("Ingredients: water, sugar, flour, salt. 250 g. Energy 621 kJ.", set()), + ("S0dium benzoate; asc0rbic acid; monosodium glutamte", {"E211", "E300", "E621"}), + ("amsgword, messages, msgpack", set()), + ("Preservatives (250, 211); flavour enhancer (621); antioxidant: 300", {"E250", "E211", "E621", "E300"}), + ("Flavour 621, agent 250, regulator 330, 150a", set()), + ("E250a, E150, XE211, 1E330, E6210", set()), + ("Sodium nitrate, isoascorbic acid", {"E251", "E315"}), +]) +def test_realistic_labels_are_matched_without_ocr_or_database(label_additives, text, codes): + additives = dict(enumerate(label_additives)) + matches = match_additives([text], ScanService._build_index(additives)) + assert {additives[key].e_number for key in matches} == codes + assert all(matches.values()) + + +def test_normalization_preserves_codes_and_normalizes_safe_noise(): + assert normalize_e_number(" e-150A ") == "E150a" + assert normalize_e_number("250") is None + assert normalize_phrase("S0dium, asc0rbic 250 1000 E250") == "sodium ascorbic 250 1000 e250" + + +def test_every_missing_risk_factor_is_unrated(): + service = ScanService() + for field in ("toxicity_level", "exposure_level", "sensitivity_level", "cumulative_level"): + additive = Additive(toxicity_level=1, exposure_level=1, sensitivity_level=1, cumulative_level=1) + setattr(additive, field, None) + assert service.calculate_risk_score(additive) is None + assert service.determine_traffic_light(None) == "Unrated" + + +def test_index_reused_and_new_rows_refresh_it(app, monkeypatch): + service = ScanService() + monkeypatch.setattr(service, "extract_text", lambda _: ["Sodium nitrite"]) + service.analyze_image(b"") + index = app.extensions["additive_alias_index"][1] + service.analyze_image(b"") + assert app.extensions["additive_alias_index"][1] is index + db.session.add(Additive(name="Citric acid", e_number="E330")) + db.session.commit() + monkeypatch.setattr(service, "extract_text", lambda _: ["E330"]) + assert service.analyze_image(b"")[0]["traffic_light"] == "Unrated" + assert app.extensions["additive_alias_index"][1] is not index + + +def test_explicit_refresh_picks_up_alias_edits_and_current_risk(app, monkeypatch): + service = ScanService() + monkeypatch.setattr(service, "extract_text", lambda _: ["Sodium nitrite"]) + service.analyze_image(b"") + additive = Additive.query.filter_by(name="Sodium Nitrite").one() + additive.aliases = ["curing additive"] + additive.toxicity_level = None + db.session.commit() + ScanService.refresh_alias_index() + monkeypatch.setattr(service, "extract_text", lambda _: ["curing additive"]) + result = service.analyze_image(b"")[0] + assert result["matched_text"] == "curing additive" + assert result["risk_score"] is None diff --git a/backend/tests/test_routes.py b/backend/tests/test_routes.py new file mode 100644 index 0000000..6bee810 --- /dev/null +++ b/backend/tests/test_routes.py @@ -0,0 +1,105 @@ +import struct +import zlib +from io import BytesIO + +from app import routes + + +def post_scan(client, payload, filename="scan.jpg"): + return client.post("/api/scan", data={"image": (BytesIO(payload), filename)}, content_type="multipart/form-data") + + +def test_scan_without_image_field_returns_400(client): + response = client.post("/api/scan", data={}, content_type="multipart/form-data") + assert response.status_code == 400 + assert response.get_json() == {"error": "No image provided"} + + +def test_scan_with_empty_filename_returns_400(client): + response = post_scan(client, b"", filename="") + assert response.status_code == 400 + assert response.get_json() == {"error": "No image provided"} + + +def test_scan_rejects_non_image_payload(client): + response = post_scan(client, b"this is not an image") + assert response.status_code == 400 + assert response.get_json() == {"error": "Uploaded file is not a valid image"} + + +def test_scan_rejects_corrupt_png_with_400(client, png_bytes): + corrupt = png_bytes[:-12] + b"\x00" * 12 + response = post_scan(client, corrupt) + assert response.status_code == 400 + assert response.get_json() == {"error": "Uploaded file is not a valid image"} + + +def test_scan_rejects_decompression_bomb_with_400(client): + def chunk(kind, payload): + return struct.pack(">I", len(payload)) + kind + payload + struct.pack(">I", zlib.crc32(kind + payload)) + + bomb = ( + b"\x89PNG\r\n\x1a\n" + + chunk(b"IHDR", struct.pack(">IIBBBBB", 60000, 60000, 8, 0, 0, 0, 0)) + + chunk(b"IDAT", zlib.compress(b"\x00")) + + chunk(b"IEND", b"") + ) + response = post_scan(client, bomb) + assert response.status_code == 400 + assert response.get_json() == {"error": "Uploaded file is not a valid image"} + + +def test_scan_rejects_oversized_upload_with_json(client, app): + app.config["MAX_CONTENT_LENGTH"] = 1024 + response = post_scan(client, b"x" * 2048) + assert response.status_code == 413 + assert "error" in response.get_json() + + +def test_scan_returns_matches_and_overall_risk(client, png_bytes, monkeypatch): + monkeypatch.setattr(routes.scan_service, "extract_text", lambda _: ["Sodium Nitrite,", "Vitamin C"]) + + response = post_scan(client, png_bytes) + + assert response.status_code == 200 + body = response.get_json() + assert body["status"] == "success" + assert body["additives_found"] == 2 + assert body["overall_risk_score"] == 0.83 + assert body["overall_traffic_light"] == "Red" + assert {r["name"]: r["traffic_light"] for r in body["results"]} == {"Sodium Nitrite": "Red", "Vitamin C": "Green"} + + +def test_scan_with_no_matches_is_green(client, png_bytes, monkeypatch): + monkeypatch.setattr(routes.scan_service, "extract_text", lambda _: ["Water", "Sugar"]) + + body = post_scan(client, png_bytes).get_json() + + assert body["additives_found"] == 0 + assert body["overall_risk_score"] == 0 + assert body["overall_traffic_light"] == "Green" + assert body["results"] == [] + + +def test_scan_hides_internal_errors(client, png_bytes, monkeypatch): + def explode(_): + raise RuntimeError("secret internal detail") + + monkeypatch.setattr(routes.scan_service, "extract_text", explode) + + response = post_scan(client, png_bytes) + + assert response.status_code == 500 + assert response.get_json() == {"error": "Image analysis failed"} + + +def test_unknown_route_returns_json_404(client): + response = client.get("/api/nope") + assert response.status_code == 404 + assert "error" in response.get_json() + + +def test_cors_header_present_on_api(client, png_bytes, monkeypatch): + monkeypatch.setattr(routes.scan_service, "extract_text", lambda _: []) + response = post_scan(client, png_bytes) + assert response.headers["Access-Control-Allow-Origin"] == "*" diff --git a/backend/tests/test_scan_service.py b/backend/tests/test_scan_service.py new file mode 100644 index 0000000..06d56fd --- /dev/null +++ b/backend/tests/test_scan_service.py @@ -0,0 +1,98 @@ +import sys +from types import SimpleNamespace + +import pytest + +from app.models import Additive +from app.services.scan_service import ScanService + + +def make_additive(**levels): + return SimpleNamespace( + toxicity_level=levels.get("toxicity", 1), + exposure_level=levels.get("exposure", 1), + sensitivity_level=levels.get("sensitivity", 1), + cumulative_level=levels.get("cumulative", 1), + ) + + +def test_risk_score_weights_factors(): + service = ScanService() + assert service.calculate_risk_score(make_additive(toxicity=10, exposure=10, sensitivity=10, cumulative=10)) == 1.0 + assert service.calculate_risk_score(make_additive(toxicity=10)) == 0.46 + assert service.calculate_risk_score(make_additive(exposure=10)) == 0.37 + assert service.calculate_risk_score(make_additive(sensitivity=10)) == 0.28 + assert service.calculate_risk_score(make_additive(cumulative=10)) == 0.19 + + +@pytest.mark.parametrize("score, expected", [ + (0.71, "Red"), + (0.7, "Yellow"), + (0.4, "Yellow"), + (0.39, "Green"), + (0, "Green"), +]) +def test_traffic_light_thresholds(score, expected): + assert ScanService().determine_traffic_light(score) == expected + + +def test_reader_is_not_loaded_on_construction(): + assert ScanService()._reader is None + + +def test_reader_is_built_once_under_concurrent_first_access(monkeypatch): + import threading + import types + + builds = [] + + class FakeReader: + def __init__(self, *args, **kwargs): + builds.append(threading.get_ident()) + + monkeypatch.setitem(sys.modules, "easyocr", types.SimpleNamespace(Reader=FakeReader)) + service = ScanService() + threads = [threading.Thread(target=lambda: service.reader) for _ in range(8)] + for t in threads: + t.start() + for t in threads: + t.join() + + assert len(builds) == 1 + + +def test_analyze_image_matches_additives_in_ocr_text(app, monkeypatch): + service = ScanService() + monkeypatch.setattr(service, "extract_text", lambda _: ["INGREDIENTS:", "Pork, Salt,", "sodium nitrite", "(E250)"]) + + results = service.analyze_image(b"irrelevant") + + assert [r["name"] for r in results] == ["Sodium Nitrite"] + assert results[0]["risk_score"] == 0.83 + assert results[0]["traffic_light"] == "Red" + assert results[0]["details"]["toxicity_level"] == 9 + + +def test_analyze_image_ignores_punctuation_and_case(app, monkeypatch): + service = ScanService() + monkeypatch.setattr(service, "extract_text", lambda _: ["Antioxidant:", "VITAMIN-C."]) + + assert [r["name"] for r in service.analyze_image(b"irrelevant")] == ["Vitamin C"] + + +def test_analyze_image_tolerates_ocr_typos(app, monkeypatch): + service = ScanService() + monkeypatch.setattr(service, "extract_text", lambda _: ["contains", "S0dium Benzoate", "as preservative"]) + + assert [r["name"] for r in service.analyze_image(b"irrelevant")] == ["Sodium Benzoate"] + + +def test_analyze_image_uses_additives_cache_instead_of_db(app, monkeypatch): + service = ScanService() + monkeypatch.setattr(service, "extract_text", lambda _: ["vitamin c"]) + cache = [Additive(name="Vitamin C", toxicity_level=1, exposure_level=1, sensitivity_level=1, cumulative_level=1)] + + results = service.analyze_image(b"irrelevant", additives_cache=cache) + + assert len(results) == 1 + assert results[0]["traffic_light"] == "Green" diff --git a/backend/tests/test_unrated_routes.py b/backend/tests/test_unrated_routes.py new file mode 100644 index 0000000..6d946ac --- /dev/null +++ b/backend/tests/test_unrated_routes.py @@ -0,0 +1,29 @@ +from io import BytesIO + +import pytest + +from app import routes +from app.models import Additive, db + + +@pytest.mark.parametrize("label, score, light, count", [ + ("E330", None, "Unrated", 1), + ("E330 Sodium Nitrite", 0.83, "Red", 2), + ("E330 Vitamin C", 0.1, "Green", 2), +]) +def test_overall_excludes_unrated_detections(app, client, png_bytes, monkeypatch, label, score, light, count): + db.session.add(Additive(name="Citric acid", e_number="E330", aliases=["citric acid"])) + db.session.commit() + monkeypatch.setattr(routes.scan_service, "extract_text", lambda _: [label]) + response = client.post("/api/scan", data={"image": (BytesIO(png_bytes), "scan.png")}) + assert response.status_code == 200 + body = response.get_json() + assert body["overall_risk_score"] == score + assert body["overall_traffic_light"] == light + assert body["additives_found"] == count + unrated = next(result for result in body["results"] if result["name"] == "Citric acid") + assert unrated["risk_score"] is None + assert unrated["traffic_light"] == "Unrated" + assert unrated["matched_text"] == "e330" + assert unrated["details"]["aliases"] == ["citric acid"] + assert unrated["details"]["e_number"] == "E330" diff --git a/frontend/App.tsx.bak b/frontend/App.tsx.bak deleted file mode 100644 index 0329d0c..0000000 --- a/frontend/App.tsx.bak +++ /dev/null @@ -1,20 +0,0 @@ -import { StatusBar } from 'expo-status-bar'; -import { StyleSheet, Text, View } from 'react-native'; - -export default function App() { - return ( - - Open up App.tsx to start working on your app! - - - ); -} - -const styles = StyleSheet.create({ - container: { - flex: 1, - backgroundColor: '#fff', - alignItems: 'center', - justifyContent: 'center', - }, -}); diff --git a/frontend/app.json b/frontend/app.json index 6fc3988..607bf7c 100644 --- a/frontend/app.json +++ b/frontend/app.json @@ -1,7 +1,7 @@ { "expo": { - "name": "frontend", - "slug": "frontend", + "name": "AddiGuard", + "slug": "addiguard", "version": "1.0.0", "orientation": "portrait", "icon": "./assets/icon.png", @@ -27,7 +27,13 @@ "favicon": "./assets/favicon.png" }, "plugins": [ - "expo-router" + "expo-router", + [ + "expo-camera", + { + "cameraPermission": "Allow AddiGuard to use the camera to scan ingredient labels." + } + ] ] } } diff --git a/frontend/app/_layout.tsx b/frontend/app/_layout.tsx index 19e7a22..5b073be 100644 --- a/frontend/app/_layout.tsx +++ b/frontend/app/_layout.tsx @@ -1,9 +1,10 @@ import { Stack } from 'expo-router'; import { StatusBar } from 'expo-status-bar'; +import { ScanResultProvider } from '../contexts/ScanResultContext'; export default function Layout() { return ( - <> + - + ); } diff --git a/frontend/app/index.tsx b/frontend/app/index.tsx index 4b64ea3..61768bc 100644 --- a/frontend/app/index.tsx +++ b/frontend/app/index.tsx @@ -1,17 +1,24 @@ import React, { useState, useRef } from 'react'; import { StyleSheet, Text, View, TouchableOpacity, ActivityIndicator, Alert, Switch } from 'react-native'; -import { CameraView, CameraType, useCameraPermissions } from 'expo-camera'; +import { CameraView, useCameraPermissions } from 'expo-camera'; +import * as ImageManipulator from 'expo-image-manipulator'; import { useRouter } from 'expo-router'; import { analyzeImage } from '../services/api'; import { MOCK_SCAN_RESULT } from '../services/mockData'; -import { SafeAreaView } from 'react-native-safe-area-context'; +import { ApiResponse } from '../types'; +import { frameToPhotoCrop, Rect } from '../utils/cropRect'; +import { useScanResult } from '../contexts/ScanResultContext'; export default function CameraScreen() { const [permission, requestPermission] = useCameraPermissions(); const [scanning, setScanning] = useState(false); const [isMockMode, setIsMockMode] = useState(false); const cameraRef = useRef(null); + const [cameraRect, setCameraRect] = useState({ x: 0, y: 0, width: 0, height: 0 }); + const [middleTop, setMiddleTop] = useState(0); + const [frame, setFrame] = useState({ x: 0, y: 0, width: 0, height: 0 }); const router = useRouter(); + const { setResult } = useScanResult(); if (!permission) { return ( @@ -38,43 +45,29 @@ export default function CameraScreen() { setScanning(true); try { + let result: ApiResponse; if (isMockMode) { - // Simulate network delay - setTimeout(() => { - setScanning(false); - router.push({ - pathname: '/result', - params: { data: JSON.stringify(MOCK_SCAN_RESULT) } - }); - }, 1500); - return; + await new Promise(resolve => setTimeout(resolve, 1500)); + result = MOCK_SCAN_RESULT; + } else { + const photo = await cameraRef.current?.takePictureAsync({ quality: 1 }); + if (!photo?.uri) throw new Error('Could not capture a photo.'); + const crop = frameToPhotoCrop({ ...frame, x: frame.x + cameraRect.x, y: frame.y + middleTop + cameraRect.y }, cameraRect, { width: photo.width, height: photo.height }); + const longSide = Math.max(crop.width, crop.height); + const resize = longSide > 1600 ? { [crop.width >= crop.height ? 'width' : 'height']: 1600 } : undefined; + const processed = await ImageManipulator.manipulateAsync(photo.uri, [ + { crop: { originX: crop.x, originY: crop.y, width: crop.width, height: crop.height } }, + ...(resize ? [{ resize }] : []), + ], { compress: 0.8, format: ImageManipulator.SaveFormat.JPEG }); + result = await analyzeImage(processed.uri); } - if (cameraRef.current) { - const photo = await cameraRef.current.takePictureAsync({ - quality: 0.7, - base64: false, - }); - - if (photo?.uri) { - console.log('Photo taken:', photo.uri); - const result = await analyzeImage(photo.uri); - - if (result.status === 'success') { - router.push({ - pathname: '/result', - params: { data: JSON.stringify(result) } - }); - } else { - Alert.alert('Scan Failed', result.error || 'Unknown error'); - } - } - } + setResult(result); + router.push('/result'); } catch (error) { - console.error(error); - Alert.alert('Error', 'Failed to capture or analyze image.'); + Alert.alert('Scan Failed', error instanceof Error ? error.message : 'Failed to capture or analyze image.'); } finally { - if (!isMockMode) setScanning(false); + setScanning(false); } }; @@ -84,24 +77,27 @@ export default function CameraScreen() { style={styles.camera} facing="back" ref={cameraRef} + onLayout={({ nativeEvent }) => setCameraRect({ x: nativeEvent.layout.x, y: nativeEvent.layout.y, width: nativeEvent.layout.width, height: nativeEvent.layout.height })} > - - {/* Header Actions */} - - - Mock Mode - + + {__DEV__ && ( + + + Mock Mode + + - + )} - + + setMiddleTop(nativeEvent.layout.y)}> - + setFrame(nativeEvent.layout)}> @@ -123,7 +119,7 @@ export default function CameraScreen() { Align ingredients within the frame - + ); @@ -189,15 +185,16 @@ const styles = StyleSheet.create({ }, scanFrame: { width: 300, + maxWidth: '80%', height: 250, borderColor: 'transparent', position: 'relative', }, overlayBottom: { - flex: 1.5, + flex: 1, backgroundColor: 'rgba(0,0,0,0.5)', alignItems: 'center', - paddingTop: 40, + justifyContent: 'center', }, captureButton: { backgroundColor: '#4CAF50', diff --git a/frontend/app/result.tsx b/frontend/app/result.tsx index 331dcf0..cd76fea 100644 --- a/frontend/app/result.tsx +++ b/frontend/app/result.tsx @@ -1,49 +1,33 @@ import React, { useState } from 'react'; import { StyleSheet, Text, View, FlatList, TouchableOpacity, Modal, ScrollView, Dimensions } from 'react-native'; -import { useLocalSearchParams, useRouter } from 'expo-router'; -import { ApiResponse, ScanResult } from '../types'; +import { Redirect, useRouter } from 'expo-router'; +import { ScanResult, TrafficLight } from '../types'; +import { useScanResult } from '../contexts/ScanResultContext'; import { SafeAreaView } from 'react-native-safe-area-context'; import { Ionicons } from '@expo/vector-icons'; const { height: SCREEN_HEIGHT } = Dimensions.get('window'); +const TRAFFIC_LIGHT: Record = { + Red: { color: '#E53935', label: 'HIGH RISK' }, + Yellow: { color: '#FFB300', label: 'MEDIUM RISK' }, + Green: { color: '#4CAF50', label: 'LOW RISK' }, + Unrated: { color: '#757575', label: 'UNRATED' }, +}; + export default function ResultScreen() { - const params = useLocalSearchParams(); + const { result: data } = useScanResult(); const router = useRouter(); const [selectedItem, setSelectedItem] = useState(null); - let data: ApiResponse | null = null; - - try { - if (params.data) { - data = JSON.parse(params.data as string); - } - } catch (e) { - console.error("Failed to parse results", e); - } - - const results = data?.results || []; - const totalRiskScore = results.length > 0 - ? Math.max(...results.map(r => r.risk_score)) - : 0; - - const getTrafficColor = (score: number) => { - if (score > 0.7) return '#E53935'; // Red - if (score >= 0.4) return '#FFB300'; // Yellow - return '#4CAF50'; // Green - }; - - const getTrafficLabel = (score: number) => { - if (score > 0.7) return 'HIGH RISK'; - if (score >= 0.4) return 'MEDIUM RISK'; - return 'LOW RISK'; - }; + if (!data) return ; - const overallColor = getTrafficColor(totalRiskScore); + const results = data.results; + const totalRiskScore = data.overall_risk_score; + const overall = TRAFFIC_LIGHT[data.overall_traffic_light]; const renderItem = ({ item }: { item: ScanResult }) => { - const isHighRisk = item.risk_score > 0.7; - const badgeColor = getTrafficColor(item.risk_score); + const isHighRisk = item.traffic_light === 'Red'; return ( setSelectedItem(item)} activeOpacity={0.7} > - + @@ -63,7 +47,8 @@ export default function ResultScreen() { {item.name} {isHighRisk && } - Risk Level: {item.traffic_light} + {TRAFFIC_LIGHT[item.traffic_light].label} + Read: {item.matched_text} {item.details.description} @@ -75,7 +60,7 @@ export default function ResultScreen() { {/* Header Summary */} - + router.back()} @@ -86,10 +71,10 @@ export default function ResultScreen() { Analysis Report - {totalRiskScore.toFixed(2)} - / 1.0 + {totalRiskScore === null ? '—' : totalRiskScore.toFixed(2)} + {totalRiskScore !== null && / 1.0} - {getTrafficLabel(totalRiskScore)} + {overall.label} @@ -137,34 +122,48 @@ export default function ResultScreen() { {selectedItem.name} - - {selectedItem.traffic_light} Risk + + {TRAFFIC_LIGHT[selectedItem.traffic_light].label} + {selectedItem.traffic_light === 'Unrated' && ( + + Detected, but no curated risk rating is available. This does not mean it is safe or unsafe. Unrated additives are excluded from the overall score. + + )} + Description - {selectedItem.details.description} + {selectedItem.details.description || 'No description available.'} ⚠️ Health Impact - {selectedItem.details.health_risk || 'No significant health risks reported.'} + {selectedItem.details.health_risk || 'No curated health information available.'} ⚖️ Usage Limits - {selectedItem.details.usage_limit || 'No specific limits.'} + {selectedItem.details.usage_limit || 'No curated usage limit available.'} Risk Factors Toxicity: - {selectedItem.details.toxicity_level}/10 + {selectedItem.details.toxicity_level === null ? 'Unrated' : `${selectedItem.details.toxicity_level}/10`} Exposure: - {selectedItem.details.exposure_level}/10 + {selectedItem.details.exposure_level === null ? 'Unrated' : `${selectedItem.details.exposure_level}/10`} + + + Sensitivity: + {selectedItem.details.sensitivity_level === null ? 'Unrated' : `${selectedItem.details.sensitivity_level}/10`} + + + Cumulative effect: + {selectedItem.details.cumulative_level === null ? 'Unrated' : `${selectedItem.details.cumulative_level}/10`} diff --git a/frontend/contexts/ScanResultContext.tsx b/frontend/contexts/ScanResultContext.tsx new file mode 100644 index 0000000..b17fb6f --- /dev/null +++ b/frontend/contexts/ScanResultContext.tsx @@ -0,0 +1,23 @@ +import React, { createContext, useContext, useState } from 'react'; +import { ApiResponse } from '../types'; + +const ScanResultContext = createContext<{ + result: ApiResponse | null; + setResult: React.Dispatch>; +} | null>(null); + +export function ScanResultProvider({ children }: { children: React.ReactNode }) { + const [result, setResult] = useState(null); + + return ( + + {children} + + ); +} + +export function useScanResult() { + const context = useContext(ScanResultContext); + if (!context) throw new Error('useScanResult must be used within ScanResultProvider'); + return context; +} diff --git a/frontend/index.ts.bak b/frontend/index.ts.bak deleted file mode 100644 index 1d6e981..0000000 --- a/frontend/index.ts.bak +++ /dev/null @@ -1,8 +0,0 @@ -import { registerRootComponent } from 'expo'; - -import App from './App'; - -// registerRootComponent calls AppRegistry.registerComponent('main', () => App); -// It also ensures that whether you load the app in Expo Go or in a native build, -// the environment is set up appropriately -registerRootComponent(App); diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 2386dc3..1b3e698 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,21 +1,24 @@ { - "name": "frontend", + "name": "addiguard", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "frontend", + "name": "addiguard", "version": "1.0.0", "dependencies": { + "@expo/vector-icons": "^15.1.1", "axios": "^1.13.2", "expo": "~54.0.30", "expo-camera": "~17.0.10", "expo-constants": "~18.0.12", + "expo-image-manipulator": "~14.0.8", "expo-linking": "~8.0.11", "expo-router": "~6.0.21", "expo-status-bar": "~3.0.9", "react": "19.1.0", + "react-dom": "19.1.0", "react-native": "0.81.5", "react-native-safe-area-context": "~5.6.0", "react-native-screens": "~4.16.0" @@ -2198,6 +2201,17 @@ "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", "license": "MIT" }, + "node_modules/@expo/vector-icons": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.1.1.tgz", + "integrity": "sha512-Iu2VkcoI5vygbtYngm7jb4ifxElNVXQYdDrYkT7UCEIiKLeWnQY0wf2ZhHZ+Wro6Sc5TaumpKUOqDRpLi5rkvw==", + "license": "MIT", + "peerDependencies": { + "expo-font": ">=14.0.4", + "react": "*", + "react-native": "*" + } + }, "node_modules/@expo/ws-tunnel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", @@ -4891,6 +4905,42 @@ "react-native": "*" } }, + "node_modules/expo-font": { + "version": "57.0.3", + "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-57.0.3.tgz", + "integrity": "sha512-kiVUnc2A8vAvO2FfDJTsQa5BwmY+PAkof/1wRb5MOkcX1jtiaSTwz9gCUAyscMBFLundZDmZrLy1P7LZVC+NvA==", + "license": "MIT", + "peer": true, + "dependencies": { + "fontfaceobserver": "^2.1.0" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-image-loader": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/expo-image-loader/-/expo-image-loader-6.0.0.tgz", + "integrity": "sha512-nKs/xnOGw6ACb4g26xceBD57FKLFkSwEUTDXEDF3Gtcu3MqF3ZIYd3YM+sSb1/z9AKV1dYT7rMSGVNgsveXLIQ==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-image-manipulator": { + "version": "14.0.8", + "resolved": "https://registry.npmjs.org/expo-image-manipulator/-/expo-image-manipulator-14.0.8.tgz", + "integrity": "sha512-sXsXjm7rIxLWZe0j2A41J/Ph53PpFJRdyzJ3EQ/qetxLUvS2m3K1sP5xy37px43qCf0l79N/i6XgFgenFV36/Q==", + "license": "MIT", + "dependencies": { + "expo-image-loader": "~6.0.0" + }, + "peerDependencies": { + "expo": "*" + } + }, "node_modules/expo-linking": { "version": "8.0.11", "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-8.0.11.tgz", @@ -5473,17 +5523,6 @@ } } }, - "node_modules/expo/node_modules/@expo/vector-icons": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.0.3.tgz", - "integrity": "sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==", - "license": "MIT", - "peerDependencies": { - "expo-font": ">=14.0.4", - "react": "*", - "react-native": "*" - } - }, "node_modules/expo/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -8280,25 +8319,17 @@ } }, "node_modules/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", "license": "MIT", - "peer": true, "dependencies": { - "scheduler": "^0.27.0" + "scheduler": "^0.26.0" }, "peerDependencies": { - "react": "^19.2.3" + "react": "^19.1.0" } }, - "node_modules/react-dom/node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT", - "peer": true - }, "node_modules/react-fast-compare": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index 1a3bc7d..cfde678 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,22 +1,26 @@ { - "name": "frontend", + "name": "addiguard", "version": "1.0.0", "main": "expo-router/entry", "scripts": { + "test": "tsc utils/cropRect.ts --target ES2020 --module commonjs --outDir .test-dist --skipLibCheck && node --test utils/cropRect.test.js", "start": "expo start", "android": "expo start --android", "ios": "expo start --ios", "web": "expo start --web" }, "dependencies": { + "@expo/vector-icons": "^15.1.1", "axios": "^1.13.2", "expo": "~54.0.30", "expo-camera": "~17.0.10", "expo-constants": "~18.0.12", + "expo-image-manipulator": "~14.0.8", "expo-linking": "~8.0.11", "expo-router": "~6.0.21", "expo-status-bar": "~3.0.9", "react": "19.1.0", + "react-dom": "19.1.0", "react-native": "0.81.5", "react-native-safe-area-context": "~5.6.0", "react-native-screens": "~4.16.0" diff --git a/frontend/services/api.ts b/frontend/services/api.ts index 550d808..f096d88 100644 --- a/frontend/services/api.ts +++ b/frontend/services/api.ts @@ -1,31 +1,35 @@ import axios from 'axios'; +import Constants from 'expo-constants'; import { ApiResponse } from '../types'; -// Replace with your local IP address for physical device testing -// For emulator: 'http://10.0.2.2:5000/api' (Android) or 'http://localhost:5000/api' (iOS) -const API_URL = 'http://localhost:5000/api'; +// Resolution order: +// 1. EXPO_PUBLIC_API_URL (set in frontend/.env or the shell) for an explicit backend. +// 2. The machine serving the Expo dev bundle, so a physical device on the same +// network reaches a backend started with `python run.py` without any config. +// 3. localhost, which only works on the iOS simulator / web. +const devHost = Constants.expoConfig?.hostUri?.split(':')[0]; +export const API_URL = process.env.EXPO_PUBLIC_API_URL ?? `http://${devHost ?? 'localhost'}:5000/api`; export const analyzeImage = async (imageUri: string): Promise => { const formData = new FormData(); - - // Append image file - // @ts-ignore: React Native FormData requires specific object structure formData.append('image', { uri: imageUri, name: 'scan.jpg', type: 'image/jpeg', - }); + } as unknown as Blob); try { const response = await axios.post(`${API_URL}/scan`, formData, { headers: { 'Content-Type': 'multipart/form-data', }, - timeout: 10000, // 10s timeout + timeout: 60000, }); return response.data; } catch (error) { - console.error('API Scan Error:', error); + if (axios.isAxiosError(error)) { + throw new Error(error.response?.data?.error ?? `Could not reach the backend at ${API_URL}`); + } throw error; } }; diff --git a/frontend/services/mockData.ts b/frontend/services/mockData.ts index 6c4ac58..9180648 100644 --- a/frontend/services/mockData.ts +++ b/frontend/services/mockData.ts @@ -2,15 +2,20 @@ import { ApiResponse } from '../types'; export const MOCK_SCAN_RESULT: ApiResponse = { status: 'success', - additives_found: 3, + additives_found: 4, + overall_risk_score: 0.83, + overall_traffic_light: 'Red', results: [ { name: 'Sodium Nitrite', - risk_score: 0.95, + matched_text: 'e250', + risk_score: 0.83, traffic_light: 'Red', details: { id: 1, name: 'Sodium Nitrite', + e_number: 'E250', + aliases: ['sodium nitrite'], description: 'Preservative used in cured meats to prevent botulism and maintain pink color.', toxicity_level: 9, exposure_level: 8, @@ -22,11 +27,14 @@ export const MOCK_SCAN_RESULT: ApiResponse = { }, { name: 'Sodium Benzoate', - risk_score: 0.55, + matched_text: 'sodium benzoate', + risk_score: 0.59, traffic_light: 'Yellow', details: { id: 2, name: 'Sodium Benzoate', + e_number: 'E211', + aliases: ['sodium benzoate'], description: 'Common preservative in acidic foods like sodas and pickles.', toxicity_level: 6, exposure_level: 7, @@ -38,11 +46,14 @@ export const MOCK_SCAN_RESULT: ApiResponse = { }, { name: 'Vitamin C', + matched_text: 'ascorbic acid', risk_score: 0.1, traffic_light: 'Green', details: { id: 3, name: 'Vitamin C', + e_number: 'E300', + aliases: ['ascorbic acid', 'vitamin c'], description: 'Ascorbic Acid, used as an antioxidant and nutrient supplement.', toxicity_level: 1, exposure_level: 1, @@ -51,6 +62,25 @@ export const MOCK_SCAN_RESULT: ApiResponse = { health_risk: 'Generally safe; beneficial for immune system.', usage_limit: 'None (GRAS).' } + }, + { + name: 'Citric acid', + matched_text: 'e330', + risk_score: null, + traffic_light: 'Unrated', + details: { + id: 6, + name: 'Citric acid', + e_number: 'E330', + aliases: ['citric acid'], + description: null, + toxicity_level: null, + exposure_level: null, + sensitivity_level: null, + cumulative_level: null, + health_risk: null, + usage_limit: null, + }, } ] }; diff --git a/frontend/types.ts b/frontend/types.ts index 36c0ebb..da534c4 100644 --- a/frontend/types.ts +++ b/frontend/types.ts @@ -1,25 +1,31 @@ +export type TrafficLight = 'Red' | 'Yellow' | 'Green' | 'Unrated'; + export interface Additive { id: number; name: string; - description: string; - toxicity_level: number; - exposure_level: number; - sensitivity_level: number; - cumulative_level: number; - health_risk: string; - usage_limit: string; + e_number: string | null; + aliases: string[]; + description: string | null; + toxicity_level: number | null; + exposure_level: number | null; + sensitivity_level: number | null; + cumulative_level: number | null; + health_risk: string | null; + usage_limit: string | null; } export interface ScanResult { name: string; - risk_score: number; - traffic_light: 'Red' | 'Yellow' | 'Green'; + matched_text: string; + risk_score: number | null; + traffic_light: TrafficLight; details: Additive; } export interface ApiResponse { status: string; additives_found: number; + overall_risk_score: number | null; + overall_traffic_light: TrafficLight; results: ScanResult[]; - error?: string; } diff --git a/frontend/utils/cropRect.test.js b/frontend/utils/cropRect.test.js new file mode 100644 index 0000000..783593c --- /dev/null +++ b/frontend/utils/cropRect.test.js @@ -0,0 +1,31 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); +const { frameToPhotoCrop } = require('../.test-dist/cropRect.js'); + +test('landscape photo cover crop maps centered frame', () => { + assert.deepEqual(frameToPhotoCrop({ x: 100, y: 250, width: 300, height: 250 }, { x: 0, y: 0, width: 500, height: 800 }, { width: 1600, height: 900 }), { x: 631, y: 281, width: 338, height: 282 }); +}); + +test('portrait photo cover crop maps frame with horizontal crop', () => { + assert.deepEqual(frameToPhotoCrop({ x: 100, y: 250, width: 300, height: 250 }, { x: 0, y: 0, width: 500, height: 800 }, { width: 900, height: 1600 }), { x: 180, y: 530, width: 540, height: 450 }); +}); + +test('nonmatching camera origin and bounds clamp to photo', () => { + assert.deepEqual(frameToPhotoCrop({ x: -200, y: -10, width: 1000, height: 900 }, { x: 10, y: 20, width: 500, height: 800 }, { width: 1000, height: 1000 }), { x: 0, y: 0, width: 1000, height: 1000 }); +}); + +test('invalid dimensions reject the crop before native manipulation', () => { + assert.throws(() => frameToPhotoCrop({ x: 0, y: 0, width: 1, height: 1 }, { x: 0, y: 0, width: 0, height: 1 }, { width: 1, height: 1 })); + assert.throws(() => frameToPhotoCrop({ x: NaN, y: 0, width: 1, height: 1 }, { x: 0, y: 0, width: 1, height: 1 }, { width: 1, height: 1 })); +}); + +test('translated camera and frame coordinates give the same crop', () => { + assert.deepEqual(frameToPhotoCrop({ x: 60, y: 120, width: 200, height: 100 }, { x: 10, y: 20, width: 300, height: 400 }, { width: 3000, height: 4000 }), { x: 500, y: 1000, width: 2000, height: 1000 }); +}); + +test('offscreen frames are rejected and fractional edges stay within bounds', () => { + assert.throws(() => frameToPhotoCrop({ x: 500, y: 0, width: 10, height: 10 }, { x: 0, y: 0, width: 100, height: 100 }, { width: 1000, height: 1000 })); + const crop = frameToPhotoCrop({ x: 0.06, y: 0.06, width: 99.94, height: 99.94 }, { x: 0, y: 0, width: 100, height: 100 }, { width: 999, height: 999 }); + assert.equal(crop.x + crop.width, 999); + assert.equal(crop.y + crop.height, 999); +}); diff --git a/frontend/utils/cropRect.ts b/frontend/utils/cropRect.ts new file mode 100644 index 0000000..889466d --- /dev/null +++ b/frontend/utils/cropRect.ts @@ -0,0 +1,25 @@ +export type Rect = { x: number; y: number; width: number; height: number }; + +/** Maps a frame in the camera view to pixels in a photo rendered with aspect-ratio cover. */ +export function frameToPhotoCrop(frame: Rect, camera: Rect, photo: { width: number; height: number }): Rect { + if (![...Object.values(frame), ...Object.values(camera), ...Object.values(photo)].every(Number.isFinite) + || camera.width <= 0 || camera.height <= 0 || photo.width <= 0 || photo.height <= 0 + || frame.width <= 0 || frame.height <= 0) { + throw new Error('Camera frame is not ready. Please try again.'); + } + const scale = Math.max(camera.width / photo.width, camera.height / photo.height); + const renderedWidth = photo.width * scale; + const renderedHeight = photo.height * scale; + const offsetX = (camera.width - renderedWidth) / 2; + const offsetY = (camera.height - renderedHeight) / 2; + const left = Math.max(0, Math.min(photo.width, (frame.x - camera.x - offsetX) / scale)); + const top = Math.max(0, Math.min(photo.height, (frame.y - camera.y - offsetY) / scale)); + const right = Math.max(left, Math.min(photo.width, (frame.x + frame.width - camera.x - offsetX) / scale)); + const bottom = Math.max(top, Math.min(photo.height, (frame.y + frame.height - camera.y - offsetY) / scale)); + const x = Math.round(left); + const y = Math.round(top); + const width = Math.round(right) - x; + const height = Math.round(bottom) - y; + if (width <= 0 || height <= 0) throw new Error('Scan frame is outside the photo.'); + return { x, y, width, height }; +}