Master Interlinear Dual Language Translation

The ultimate guide to reading web pages in two languages simultaneously. Translate, learn in context, and setup unlimited private translations.

📖 How to Use DuoLines

Transform the way you read the web. DuoLines preserves the source language and places the translation directly beneath or alongside it, making it the perfect tool for language learners, expats, and researchers.

1. Install & Pin

Add the DuoLines extension to your Chromium browser and pin it to your toolbar for quick access to your translation settings.

2. Highlight & Click

Select any text on a webpage. Right-click to open the context menu and choose "Translate with DuoLines".

3. Read & Export

A clean popup will display the original lines followed by their translations. You can easily Select All (Ctrl+A) and copy to Anki, Word, or Notion.

🚀 Advanced Technical Features

Universal Compatibility

Works seamlessly across the web. Whether reading news, blog posts, or documentation, generate bilingual text instantly.

Real-Time Progress

For longer texts, watch the translation happen chunk by chunk with a live progress bar. Never wonder when the process will finish.

Manifest V3 Compliant

Built on the latest browser standards. Uses optimized background service workers to handle text without slowing down your browser.

🔧 Fix "PERSONAL_KEYS" & API Limits

If the community Google Translation API is overloaded, use your own Personal API Key for unlimited speed and high-volume translation:

  1. Sign in to script.google.com and start a + New Project.
  2. Replace existing code with the block below.
  3. Click Deploy > New deployment. Select Web app.
  4. Execute as: Me, Access: Anyone. Copy the Web App URL and paste it into the DuoLines extension settings.
function doPost(e) {
  try {
    var data = JSON.parse(e.postData.contents);
    var targetLang = data.target || 'en';
    var textToTranslate = data.q || '';

    if (!textToTranslate) {
      return createResponse({status: 'error', message: 'No text'});
    }

    var translated = LanguageApp.translate(textToTranslate, '', targetLang, {contentType: 'text'});

    return createResponse({
      status: 'success',
      translatedText: translated
    });

  } catch (error) {

    return createResponse({status: 'error', message: error.toString()});
  }
}

function doGet(e) {
  return createResponse({status: 'error', message: 'Ready to work. Use POST.'});
}

function createResponse(data) {
  return ContentService.createTextOutput(JSON.stringify(data))
    .setMimeType(ContentService.MimeType.JSON);
}

🌍 Supported Languages

Leverage the full power of translation. DuoLines supports all major global languages and rare dialects:

Afrikaans, Albanian (Shqip), Amharic (አማርኛ), Arabic (العربية), Armenian (Հայերեն), Assamese (অসমীয়া), Aymara (Aymar aru), Azerbaijani (Azərbaycan), Bambara (Bamanankan), Basque (Euskara), Belarusian (Беларуская), Bengali (বাংলা), Bhojpuri (भोजपुरी), Bosnian (Bosanski), Bulgarian (Български), Catalan (Català), Cebuano, Chinese Simp (简体中文), Chinese Trad (繁體中文), Corsican (Corse), Croatian (Hrvatski), Czech (Čeština), Danish (Dansk), Divehi (Dhivehi), Dogri (डोगरी), Dutch (Nederlands), English, Esperanto, Estonian (Eesti), Ewe (Eʋegbe), Filipino, Finnish (Suomi), French (Français), Frisian (Frysk), Galician (Galego), Georgian (ქართული), German (Deutsch), Greek (Ελληνικά), Guarani (Avañe'ẽ), Gujarati (ગુજરાતી), Haitian Creole (Kreyòl ayisyen), Hausa, Hawaiian (ʻŌlelo Hawaiʻi), Hebrew (עברית), Hindi (हिन्दी), Hmong (Hmoob), Hungarian (Magyar), Icelandic (Íslenska), Igbo, Ilocano, Indonesian (Indonesia), Irish (Gaeilge), Italian (Italiano), Japanese (日本語), Javanese (Jawa), Kannada (ಕನ್ನಡ), Kazakh (Qazaq), Khmer (ខ្មែរ), Kinyarwanda, Korean (한국어), Krio, Kurdish (Kurdî), Kyrgyz (Кыргызча), Lao (ລາວ), Latin (Latina), Latvian (Latviešu), Lingala, Lithuanian (Lietuvių), Luganda, Luxembourgish (Lëtzebuergesch), Macedonian (Македонски), Maithili (मैтили), Malagasy, Malay (Melayu), Malayalam (മലയാളം), Maltese (Malti), Maori (Māori), Marathi (मราठी), Meiteilon (Manipuri), Mizo, Mongolian (Монгол), Myanmar (Burmese), Nepali (नेपाली), Norwegian (Norsk), Nyanja (Chichewa), Odia (Oriya), Oromo (Oromoo), Pashto (پښتو), Persian (فарси), Polish (Polski), Portuguese (Português), Punjabi (ਪੰਜਾਬੀ), Quechua, Romanian (Română), Russian (Русский), Samoan, Sanskrit (संस्कृतम्), Scots Gaelic (Gàidhlig), Sepedi, Serbian (Српски), Sesotho, Shona (ChiShona), Sindhi (سنڌي), Sinhala (සිංහල), Slovak (Slovenčina), Slovenian (Slovenščina), Somali (Soomaali), Spanish (Español), Sundanese (Basa Sunda), Swahili (Kiswahili), Swedish (Svenska), Tajik (Тоҷикӣ), Tamil (தமிழ்), Tatar (Tatarça), Telugu (తెలుగు), Thai (ไทย), Tigrinya (ትግርኛ), Tsonga (Xitsonga), Turkish (Türkçe), Turkmen (Türkmençe), Twi, Ukrainian (Українська), Urdu (اردو), Uyghur (ئۇيغۇرչە), Uzbek (Oʻzbek), Vietnamese (Tiếng Việt), Welsh (Cymraeg), Xhosa (isiXhosa), Yiddish (ייִדיש), Yoruba (Èdè Yorùbá), Zulu (isiZulu).

🔒 Privacy-First Architecture & Permissions

Your data belongs to you. DuoLines processes translations through secure channels, and your personal settings are stored locally or synced via your secure browser profile.

  • Storage: Required to save your UI theme (light/dark), language preferences, and personal Google Apps Script API keys.
  • script.google.com: Essential for connecting to Google Apps Script (both developer-provided and user-personal keys).
  • translate.googleapis.com: Used as a critical fallback mechanism to ensure the extension remains functional.
  • raw.githubusercontent.com: Required to fetch the latest configuration files and translation engine updates safely.

* The extension follows the principle of least privilege, requesting access only to the specific domains necessary for its operation.