Translate text inside an image: one Nano Banana 2 edit per language

Google says Nano Banana 2 can translate and localize text within an image. Loop one edit per language through Sume POST /v1/images and keep the layout fixed.

5 min readSume
All posts

To localize an image that has text in it, send the original as an input_references URL to google/nano-banana-2 with one instruction per language, and set aspect_ratio to auto so the layout is not recropped. Google's launch post says Nano Banana 2 can 'translate and localize text within an image' (Google, read 2026-10-01). Sume exposes the model on POST /v1/images, so a loop of N languages is N edit calls.

This is an edit, not a redraw: you are asking the model to keep the artwork and swap the words. Check every output, because short headlines survive better than dense paragraphs.

What do I send?

The fields below come from the Image API docs.

Fields for a translate-in-image edit, read 2026-10-01
FieldValueWhy
modelgoogle/nano-banana-2The model Google describes for text localization
input_referencesOne public HTTPS image URLThe source artwork
aspect_ratioautoDocs advise auto on edits to match the input
n1One result per language, easy to label

What does the loop look like?

Keep the instruction short and name the exact strings you want, so the model does not invent copy. Each call can return a hosted URL in data[0].url.

import os
import requests

H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
SRC = os.environ["SOURCE_IMAGE_URL"]
LANGS = ["Spanish", "German", "Japanese"]

for lang in LANGS:
    r = requests.post("https://api.sume.com/v1/images", headers=H, timeout=60,
        json={"model": "google/nano-banana-2", "aspect_ratio": "auto",
            "prompt": f"Translate all text in this image to {lang}. "
                      "Keep the artwork, fonts and layout unchanged.",
            "input_references": [{"type": "image_url",
                                  "image_url": {"url": SRC}}]})
    print(lang, r.status_code, r.json().get("data", [{}])[0].get("url"))

How do I check the result?

Have a fluent reader look at each file. Models can swap characters in scripts with many glyphs, and Japanese or Arabic need the most scrutiny. If a language fails, retry that language alone rather than the batch. The cost of each call is in usage.cost; add them up before committing to a large language list.

Limits

Google's claim is from its own post and I did not test accuracy per language. A 202 job envelope means the call outlasted the 30-second sync wait; poll the job. The model may reflow text that is longer in the target language, so leave room in the original design.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume