Translate a restaurant menu image into Spanish and French on Sume

Translate the text in a menu image with Ideogram 4.5: one edit call per language from the original, with prices and dish names kept. Python loop included.

5 min readSume
All posts

To translate a menu image into Spanish and French, make two separate edit calls to POST /v1/images, each starting from the original image and each naming one target language. Do not translate the English image into Spanish and then the Spanish result into French: every pass starts from a changed image, and a mistake in pass one is baked into pass two.

Ideogram's launch post (read 2026-10-05) says 4.5 is built for precise edits and multi-turn use. A partner page, Morphic, lists translating text in an image among the things the model does. Sume's docs say ideogram/ideogram-v4.5 edits the first reference image when you send references.

Why one call per language

Each call is independent, so you can run them at the same time and a failed Spanish job does not block the French one. The docs say failed or cancelled generations are not charged; a completed generation is billed in full. That makes the count simple: two languages are two billed edits per menu page, plus any re-runs you choose to make.

Menu-specific traps

Menus are dense, and dense text is where translation edits fail first. Plan for the traps before you run a batch:

The image keeps its shape because the call has no aspect_ratio; the docs say an edit without it keeps the source image shape. A tall menu stays tall. If you send a menu as a photo of a printed page, the paper edges and background come along unchanged, which is usually what you want for a table tent or a screen at the counter. If you need a clean version for a PDF, start from the original design file instead of a photo.

Quality tiers are low, medium (the default) and high. For a dense page, run one language at low to see the layout behavior before you commit to high for all of them.

  • Dish names often stay in the source language on purpose (a French dish on a Spanish menu). Put those names in a do-not-translate list.
  • Menu sections like "Starters" and "Desserts" are short and safe; long ingredient lines are where wrapping breaks.
  • Currency formats differ: a comma or a dot as decimal separator. If your market needs a different format, say so, or keep prices exactly and change them in a design tool.
  • Allergen icons and abbreviations (GF, V) are not words in every language. Say "keep abbreviations as they are" if they are your own codes.

A loop for it

The script reuses one function and one source URL. It prints the result URL, or the status_url when the call returns 202.

import os, requests

H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
SRC = "https://example.com/menu-en.png"

def edit(prompt):
    body = {"model": "ideogram/ideogram-v4.5", "quality": "medium", "prompt": prompt,
            "input_references": [{"type": "image_url", "image_url": {"url": SRC}}]}
    r = requests.post("https://api.sume.com/v1/images", headers=H, json=body, timeout=60)
    r.raise_for_status()
    if r.status_code == 202:
        return "202 poll " + r.json()["data"]["status_url"]
    return r.json()["data"][0]["url"]

for lang in ["Spanish", "French"]:
    p = (f"Translate all text on this menu into {lang}. Keep prices, "
         "numbers, layout, fonts and photos identical.")
    print(lang, edit(p))

What to keep out of the translation

Menus mix text that should change with text that should not. Decide before you run:

  • Prices and currency symbols: say "keep all prices exactly".
  • Restaurant name and logo: say "do not translate the restaurant name".
  • Dish names that are the same in every language: list them.
  • Allergen codes and footnotes: check them by eye, because a translated footnote can change meaning.

Review and cost

Have someone who reads each language check the output. Translated text is often longer than the English, so look for lines that run into a photo or off the edge. If a line does not fit, shorten that line in the prompt and re-run only that language.

Check the live per-image price from the endpoint record before a batch: GET /v1/images/models/ideogram/ideogram-v4.5/endpoints returns the pricing lines that Sume bills.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume