Watch in the language you're learning, read along in your own, and look up any word you don't know — without leaving the player.
- Install
- Quick start
- Good to know
- Features
- Settings reference
- Privacy
- Tips
- Limitations
- How it works
- Contributing
- License
Subduo isn't on the Chrome Web Store yet — load it unpacked:
git clone git@github.com:ertanm/subduo.git- Open
chrome://extensionsin Chrome. - Turn on Developer mode (top-right).
- Click Load unpacked and select the cloned
subduofolder. - Pin Subduo from the puzzle-piece icon in the toolbar.
Works in any Chromium browser (Chrome, Edge, Brave, Arc).
- Open a Netflix or YouTube video and turn on subtitles in the language you're learning.
- Click the Subduo toolbar icon and pick your language pair and mode.
- Play. Subduo replaces the native subtitles with its own dual/lookup layer.
Subtitles not showing? Subduo occasionally misses the player on first load. A hard refresh fixes it —
Ctrl+Shift+Ron Windows/Linux, or⌘+Shift+Ron macOS. You can also just flip Subduo off and back on from the popup switch.
A few things worth knowing before your first session:
- The video must already have subtitles in the language you're learning. Subduo reads and translates existing subtitle text — it can't generate subtitles from the audio (Netflix audio is DRM-protected, so that's not possible).
- Works on
netflix.com/watchandyoutube.com/watch— not on other sites or the browse/home pages. - Originally-produced shows give the tightest match between what you hear and what you read. On dubbed content, the audio track and subtitles are translated independently and often differ.
- The first appearance of a line is slightly delayed while its translation is fetched; after that it's instant from the local cache.
- Translation comes from Google's public translate endpoint. It's the same service behind translate.google.com, but it's unofficial — if Google changes the format, translation can stop until Subduo is updated.
Shows the original line on top and a full translation underneath, every line.
- Turn on: popup → Subtitles → Dual
- Best for: following along while still reading the original.
Shows only the original line. Hover any word for ~0.2s to get a popup card with its translation, dictionary entries (part of speech + alternatives), an example sentence, and a 🔊 button to hear it pronounced.
- Turn on: popup → Subtitles → Source only
- Best for: active reading — test yourself, look up only what you're stuck on.
Subduo is not limited to German→Turkish. Pick any source → target from the popup. Supported: German, English, Turkish, Spanish, French, Italian, Portuguese, Dutch, Russian, Japanese, Korean, Chinese, Arabic.
- Set it: popup → Languages → choose source and target.
Learning Spanish from English content? Set
English → Spanishand you're done.
In Dual mode, the translation line is blurred until you hover it — so you try to understand by listening first, then reveal the meaning to check yourself.
- Turn on: popup → Study → Blur translation (or press B)
Pauses the video automatically when each new subtitle line appears, giving you time to read, repeat, or look up words. Press your player's normal play button to continue.
- Turn on: popup → Study → Auto-pause
| Key | Action |
|---|---|
| R | Replay the last few seconds (rewind ~3s) |
| B | Toggle blur on the translation line |
Shortcuts are ignored while you're typing in a search box.
The popup itself can be shown in English, Türkçe, or Deutsch —
independent of the subtitle languages. Auto follows your browser language.
- Set it: popup → Interface
A master switch at the top of the popup turns Subduo on or off instantly, with no page reload. When off, the overlay disappears and the site's own subtitles come back — exactly as if the extension weren't installed. Flip it back on and the overlay returns.
- Toggle: popup → switch in the top-right.
| Setting | Options | Default | What it does |
|---|---|---|---|
| On/off | on / off | on | Master switch; off restores native subtitles, live |
| Mode | Dual · Source only | Dual | Full translation vs. hover-to-look-up |
| Source language | 13 languages | German | The spoken/subtitle language of the video |
| Target language | 13 languages | Turkish | The language you translate into |
| Blur translation | on / off | off | Hide the translation until hovered (Dual mode) |
| Auto-pause | on / off | off | Pause on every new subtitle line |
| Interface | Auto · EN · TR · DE | Auto | Language of the popup UI |
All settings are saved instantly and sync across the open tabs.
Subduo has no accounts, no analytics, and no servers of its own.
- Subtitle lines and the words you hover are sent to Google's public translate endpoint to be translated — the same service behind translate.google.com.
- Translations are cached locally in
chrome.storageso repeats are instant and offline-friendly. - Permissions are minimal:
storage, plus access to Netflix, YouTube, and the Google translate endpoint. Nothing else is read or transmitted.
- On Netflix, a dubbed audio track and the subtitles are translated independently and often differ. You'll get the tightest audio↔subtitle match on originally-produced shows — e.g. Dark, Babylon Berlin, Kleo, Bonn.
- The first time a line appears, its translation arrives after a short delay. Rewind or re-encounter the same word and it appears instantly from cache.
- Uses Google's unofficial translate endpoint; if Google changes the format, translation can stop until Subduo is updated.
- Runs only on
https://www.netflix.com/watch/*andhttps://www.youtube.com/watch*. - Occasionally doesn't catch the player on first load. Hard refresh
(
Ctrl+Shift+Ron Windows/Linux,⌘+Shift+Ron macOS) or toggle Subduo off and on from the popup. - Dictionary entries and example sentences aren't available for every word or language pair.
- Netflix audio is DRM-protected, so subtitles can't be generated from the sound itself — the video must already have subtitles in your source language.
┌───────────────────────────────┐
player DOM ───▶│ content.js (per-tab overlay) │
subtitle node │ • picks a platform adapter │
│ • renders the dual / lookup │
│ overlay │
└───────────────┬───────────────┘
│ chrome.runtime message
▼
┌───────────────────────────────┐
│ background.js (service worker)│
│ • fetches Google translate │
│ • caches in chrome.storage │
└───────────────────────────────┘
- Platform adapters (
platforms/netflix.js,platforms/youtube.js) know how to find each site's player, subtitle node, and video element. Netflix's subtitle node is observed directly; YouTube's stable player element is observed instead. content.jsis platform-agnostic: it builds the overlay, handles hovering, blur, auto-pause, and shortcuts.background.jsdoes all network calls so they aren't blocked by a site's content security policy, and centralizes the cache.settings.js/i18n.jsare shared by the popup and content scripts.
Want to add another streaming site? Implement a new adapter in platforms/ that
exposes urlMatches, getPlayerContainer, getVideoEl, getSubtitleRoot,
getObserveTarget, extractLine, hideNativeSubtitles, and
showNativeSubtitles, then register it and add the host to manifest.json.
PRs and issues welcome.
Subduo is free, open source, and built by one person. If it helps you learn a language, you can buy me a coffee — it goes straight toward fixing bugs, adding languages, and keeping Subduo free for everyone.
Released under the MIT License.








