How to Translate Webpages Offline in Chrome (No Cloud Upload)
On this page· 7 sections
Offline translation in Chrome works only after the language pack for that pair is already on the device. The first Translator.create() downloads the pack; once availability() is available, a later translate() stays on-device, which a recorded Chrome 151 session confirmed with DevTools Offline.
Native Translate is the Chrome extension that calls this Translator API for page text. It uses the same on-device pack. It cannot skip the first download.
What the recorded session showed
These figures come from one desktop session on 2026-08-26. The same three measurements are on the Native Translate product page. This note is one session, not a benchmark suite. Raw JSON: translator-create-offline-2026-08-26.json.
The browser was Chrome 151.0.0.0 on macOS. Translator was present. The pair was English to Chinese.
Translator.availability({ sourceLanguage: "en", targetLanguage: "zh" })returneddownloadablebefore anycreate().- The first
create()ran while the tab was online. That call was the download: 43,829 ms and 334downloadprogressevents. Chrome reported a normalizedtotalof 1, so this note has no pack size in bytes. - After that,
availability()returnedavailable. - Online
translate()ofPrivacy stays on this device after the pack downloads.returned包下载后,隐私在此设备上保留。in 30 ms. - The same tab was then set to DevTools Offline (
navigator.onLine === false).availability()stayedavailable. A secondcreate()plustranslate()finished in 118 ms and returned the same Chinese sentence. There was no second download.
Check this browser before you trust a version number
The Native Translate product page requires Chrome 138 or later on desktop and checks the Translator and Language Detector APIs at runtime. It also says Chrome mobile does not currently expose these APIs. The session above was Chrome 151, which is newer than that floor. The version label did not make English-to-Chinese usable. availability() did.
Feature-detect with typeof Translator !== "undefined" and typeof Translator.availability === "function". On that 2026-08-26 probe, Translator was a function. A check that requires typeof Translator === "object" misses this constructor.
Ask for the pair you actually need:
const availability = await Translator.availability({
sourceLanguage: "en",
targetLanguage: "zh",
})
downloadable means the pair is supported and the pack is not on disk yet. available means a later translate() can run from the local pack. unavailable means this Chrome cannot do that pair. Run the check on the machine in front of you before you treat offline translation as ready.
Download the language pack once
While availability() is downloadable or downloading, Translator.create() needs a user gesture. A separate Playwright Chrome for Testing 151 profile, with no click, failed with NotAllowedError: Requires a user gesture when availability is "downloading" or "downloadable". The Chrome 151 tab that already had a real user navigation was able to download.
- Open desktop Chrome on a page you can click.
- Call
availability()for the source and target languages. - When the result is
downloadable, callTranslator.create({ sourceLanguage, targetLanguage })from a click or other user gesture, and leave the machine online until it resolves. - Call
availability()again. Continue when it returnsavailable.
The first create in this session took 43,829 ms. That is one observation on one Mac. Quote the number with the machine and the date, or remeasure. A later visit on the same profile can be shorter because the pack is already there. This note only covers that afternoon.
Repeat the translation offline
After the pack was available, DevTools Offline showed the second call did not need the network:
navigator.onLinewasfalseavailability()stayedavailablecreate()plustranslate()took 118 ms- the output matched the online sentence
That is the offline proof in this guide: same API, same sentence, no second download. It is a single string through Translator.translate(), not a timed crawl of a full website. DevTools Offline plus a matching result is the evidence. This note does not include a packet capture.
Translate a webpage with Native Translate
The webpage UI is Native Translate. The extension calls Chrome's built-in Translator API after the language pack download. The product page documents full-page translation, hover-to-translate, and input translation, and it says packs stay available for offline use once Chrome has downloaded them. This guide did not remeasure those extension controls. The timed calls were the API session above.
A check you can run on your own desktop Chrome:
- Install Native Translate from the product page. The page requires Chrome 138 or later on desktop, and the extension checks Translator at runtime.
- Translate one page while online so Chrome can fetch the language pack for that pair.
- Turn the network off and translate again. When the pack is on disk, the second pass is the offline path.
If step 2 never finishes, Chrome is still downloading. If step 3 fails, run availability() again and read the result for that pair.
Two other tools on this site do different jobs. Translate is the on-device Hy-MT model pipeline with self-hosted model delivery. It is a separate runtime from Chrome's built-in Translator API. MangoFlow is an AI chat sidebar for browsing. It does not install Chrome language packs.
On the same probe, LanguageDetector.availability() was unavailable, and LanguageDetector.create() threw NotSupportedError: Model not available. The offline path used source language en chosen up front. Auto-detect was not part of the recorded translation.
Limits of this recording
- Pack size is unknown. Progress
totalwas 1. - The clocked output is one sentence. There is no quality score against a cloud translator.
- The clocked calls were
Translator.create()andtranslate()on a single string. - The browser was desktop Chrome 151.0.0.0 on macOS. The product requirement published on this site is Chrome 138 or later on desktop, with a runtime check, and mobile Chrome is outside that support note.
LanguageDetectorwas present as an API and still unusable in that session.- Automation without a user gesture could not start the pack download.
- One profile, one pair (
entozh), one afternoon. A later session on another profile can come back asdownloadable.
Install Native Translate
For page, hover, and input translation without writing the Translator calls yourself, install Native Translate and let Chrome download the language pack once. For the separate self-hosted model path, see Translate. For sidebar chat while you browse, see MangoFlow.