How offline translation works on your iPhone

Last updated: 2026-09-03

How offline translation works on your iPhone

The app's translation path is entirely on-device. No photo, no OCR result and no translation request leaves the iPhone. This post explains what "on-device" actually means, where the models live and what trade-offs come with running translation locally.

The pieces that run on the device

There are three independent pieces of work that happen on the phone for a camera translation:

  1. OCR. A forked vision_text_recognition package runs text recognition locally. It supports Latin, Chinese (Simplified and Traditional), Japanese and Korean scripts. Each recognised text block carries its own bounding box and detected text.
  2. Translation. Google ML Kit's on-device translation engine takes the OCR output and produces translated text. The engine is bundled as a downloadable language model per language pair; the app downloads models on demand and caches them on disk.
  3. Rendering. The result page paints each translated block back over the original photo, using the bounding boxes the OCR engine returned. No round-trip to a server is needed to render the overlay — the image, the source blocks and the translations all live in memory on the device.

Why this matters

Where the models live

ML Kit publishes on-device translation models for 19 languages. Each model is roughly 10–50 MB. When you pick a source or target language, the app downloads the corresponding model into the app's local sandbox on first use. The model persists across app restarts; deleting it reclaims the storage immediately.

The full list of supported languages: Arabic, Chinese (Simplified), Czech, Dutch, English, French, German, Croatian, Hungarian, Italian, Japanese, Korean, Polish, Portuguese, Romanian, Russian, Slovak, Slovenian and Spanish.

What is uploaded (and what is not)

Trade-offs of running locally

What this means for you

If you have ever hesitated to photograph a sensitive document because the photo would end up on someone else's server, that hesitation is the reason the app exists. Every part of the pipeline runs locally, and the app's data model is designed around the premise that nothing leaves the device unless the user explicitly chooses to share a result.