Skip to content

Selection translation

Translate any highlighted text

Highlight text on any page. Swiftin shows a small floating "S" button near your cursor, then a popup with the translation when you click it. The popup also holds an engine picker, language selectors, TTS, and copy buttons, everything on one card.

How a selection translation runs

Two-stage on purpose, selecting text doesn't fire a request, only your click does. Keeps the page quiet when you're reading.

  1. 1Highlight text with the mouse, `selectionchange` + `mouseup` events fire
  2. 2A floating "S" button appears near the end of your selection
  3. 3Click the button, the popup opens in a loading state and the translate request fires
  4. 4The translation renders inline; engine, language, TTS and copy controls are right there

What's in the popup

One card with everything. No extra menus, no settings page round-trip.

Engine switcher

Switch engine right inside the popup, Google, Bing or any AI brand. The choice persists as your selection engine for next time.

Language selectors

Source language defaults to Auto (server-detected; client-side trigram fallback if the server didn't return one). Target language is searchable.

Speaker icons (×2)

Two speaker buttons, one for the translation, one for the source. See Text-to-Speech for engine and quota details.

Copy + pin

Copy the original or the translation to clipboard. Pin keeps the popup open while you click around the page.

Engine for selection vs page / input

Each surface has its own engine setting. `settings.selectionTranslationEngine` lives independently from page and input. Switching the engine in the popup updates this key, the next selection on a fresh page uses your last choice.

Free plans get Google and Bing for selection. Pro/Team pick any AI brand; BYOK users can plug their own key per brand (see BYOK docs).

Listening to the translation

The popup has a speaker icon next to the translation and another next to the original. Pro/Team accounts get AI voice (Gemini TTS, Kore/Orus voice); Free accounts use the browser's built-in voice for the user's OS. AI-quota exhausted = silent fallback to browser voice. Text-to-Speech →

Where it works (and where it doesn't)

Selection sits on the browser's native Selection API, works wherever the browser hands us text.

Plain HTML pages

Articles, blogs, social feeds, docs, anywhere browser's `window.getSelection()` returns text.

Shadow DOM

The SelectionPopup itself mounts in a closed Shadow DOM (no host-page CSS leaks). Selection inside other Shadow DOMs is captured via `composedPath`.

PDFs & canvas

PDF viewer uses a special rendering surface, selection works only if the viewer exposes text via the DOM. Canvas is bitmap, so no text to select.

Excluded sites

Global excludes (`excludedSites`), selection-only excludes (`selectionExcludedUrls`), and per-host overrides (`siteOverrides[host].selectionDisabled`) each disable the popup. Configure them in Options → Excluded URLs.

Saving selection translations

Off by default. Two switches must both be on: the master `Save translation history` and the per-source `Save selection translation history`. Free plans keep history local-only; Pro/Team can opt in to cloud sync separately. See the History docs. History →

Common issues

If the popup misbehaves on a specific page, check the table below, most cases fix themselves in a click or two.

NO_POPUP

Popup doesn't appear

Extension globally disabled, the site is in your excluded list, or you snoozed selection translation. Check Options → General toggle, Excluded URLs, and per-host overrides.

PDF_VIEWER

Selection on PDF does nothing

Some PDF viewers expose text to the DOM, some don't. If your viewer doesn't, selection translation can't see the text. Open the PDF in a text-exposing viewer or copy-paste into the input translator.

CANVAS

Text in a canvas / image is ignored

Canvas text is a bitmap, there is no DOM text to select. No fix at the extension level; the site would have to expose text as DOM.

WRONG_LANG

Auto-detect picks the wrong source language

Short or mixed text trips the trigram detector. Open the source-language dropdown in the popup and set it explicitly.

SAME_LANG

"Already in your target language" message

Auto-detected source equals your target. If detection is wrong, override the source in the popup; otherwise the translation would be a no-op.

ENGINE_FAILED

Engine error badge in popup

Provider rejected the request (quota, auth, rate-limit). Switch engine inside the popup; for BYOK, see the BYOK error table for the exact code.

NO_AI_VOICE

Speaker icon plays a poor-quality voice

AI voice quota exhausted or you're on Free, extension falls back to your OS voice. Quality varies by OS. Upgrade or install a better system voice for that language.

Page translationInput translation