Skip to content

ertanm/subduo

Repository files navigation

Subduo

Subduo

Dual subtitles + hover-to-translate words for Netflix & YouTube — built for language learners.

License: MIT  Manifest V3 · Chrome

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.

Subduo — dual subtitles and hover-to-translate for Netflix & YouTube


Contents


Install

Subduo isn't on the Chrome Web Store yet — load it unpacked:

git clone git@github.com:ertanm/subduo.git
  1. Open chrome://extensions in Chrome.
  2. Turn on Developer mode (top-right).
  3. Click Load unpacked and select the cloned subduo folder.
  4. Pin Subduo from the puzzle-piece icon in the toolbar.

Works in any Chromium browser (Chrome, Edge, Brave, Arc).

Quick start

  1. Open a Netflix or YouTube video and turn on subtitles in the language you're learning.
  2. Click the Subduo toolbar icon and pick your language pair and mode.
  3. 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+R on Windows/Linux, or +Shift+R on macOS. You can also just flip Subduo off and back on from the popup switch.


Good to know

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/watch and youtube.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.

Features

1. Dual subtitles

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.

Dual subtitles on a video — original line on top, translation underneath

Choosing a subtitle mode in the popup

2. Source-only mode + word lookup

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.

Hover word lookup card

3. Configurable language pairs

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.

Source and target language selectors

Learning Spanish from English content? Set English → Spanish and you're done.

4. Blur the translation

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)

Study controls: blur translation and auto-pause

A blurred translation line, revealed on hover

5. Auto-pause

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

6. Keyboard shortcuts

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.

7. Interface language

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

Interface language selector

8. Turn it on or off

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.

Subduo on/off switch at the top of the popup


Settings reference

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.


Privacy

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.storage so 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.

Tips

  • 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.

Limitations

  • 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/* and https://www.youtube.com/watch*.
  • Occasionally doesn't catch the player on first load. Hard refresh (Ctrl+Shift+R on Windows/Linux, +Shift+R on 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.

How it works

                 ┌───────────────────────────────┐
  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.js is platform-agnostic: it builds the overlay, handles hovering, blur, auto-pause, and shortcuts.
  • background.js does all network calls so they aren't blocked by a site's content security policy, and centralizes the cache.
  • settings.js / i18n.js are shared by the popup and content scripts.

Contributing

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.

Support

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.

Buy Me a Coffee


Released under the MIT License.

About

Dual subtitles + hover-to-translate words on Netflix & YouTube. Learn a language while you watch no account, no tracking.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors