<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jason</title>
    <description>The latest articles on DEV Community by Jason (@airhunter).</description>
    <link>https://dev.to/airhunter</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4193366%2Fc2795d63-51ec-47af-b16c-5eba3fbf5f4a.jpg</url>
      <title>DEV Community: Jason</title>
      <link>https://dev.to/airhunter</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/airhunter"/>
    <language>en</language>
    <item>
      <title>Why I maintain my own translation extension</title>
      <dc:creator>Jason</dc:creator>
      <pubDate>Mon, 19 Oct 2026 06:38:29 +0000</pubDate>
      <link>https://dev.to/airhunter/why-i-maintain-my-own-translation-extension-3d4k</link>
      <guid>https://dev.to/airhunter/why-i-maintain-my-own-translation-extension-3d4k</guid>
      <description>&lt;p&gt;There are already plenty of browser translation extensions. Some handle webpages, video subtitles, and documents very well. I started working on OnlyTranslate because I wanted a different set of trade-offs in a tool I use every day.&lt;/p&gt;

&lt;p&gt;I spend a lot of time reading articles, forum posts, and technical documentation in other languages. What I wanted was straightforward: open something, translate it, and continue reading with the original text still nearby.&lt;/p&gt;

&lt;p&gt;Some capable products put considerable attention into accounts, subscriptions, and upgrades. Others have settings and features I rarely use. Paying for software is reasonable, and maintaining it costs money. But I wanted my reading tool to demand less attention, including less time deciding how to configure or subscribe to it.&lt;/p&gt;

&lt;p&gt;Free tools offered other compromises. Some were pleasantly simple but did not cover the reading situations I encountered. I wanted something I could keep improving around my own habits.&lt;/p&gt;

&lt;h2&gt;
  
  
  From contributing upstream to maintaining a fork
&lt;/h2&gt;

&lt;p&gt;OnlyTranslate is based on &lt;a href="https://github.com/Bistutu/FluentRead" rel="noopener noreferrer"&gt;FluentRead&lt;/a&gt;. It continues to be open source under GPL v3.&lt;/p&gt;

&lt;p&gt;My initial plan was to add the features I needed and contribute them upstream. That would let me build on the existing work without maintaining another project.&lt;/p&gt;

&lt;p&gt;In practice, my needs and the upstream project's direction and release cycle did not always align. A feature that mattered to me did not necessarily belong in the original project. Preparing changes for review, explaining the design, responding to feedback, and waiting for a release also took time.&lt;/p&gt;

&lt;p&gt;That is a normal part of responsible open-source maintenance. The original maintainer needs to manage scope and long-term costs. I wanted to experiment more quickly: find a problem on a page I was reading, fix it, check for regressions, and use the result.&lt;/p&gt;

&lt;p&gt;Maintaining a fork gave me that freedom. It also made me responsible for keeping the fork working. The original project remains an important part of its history, and I want that credit to stay visible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing which parts of a page to translate
&lt;/h2&gt;

&lt;p&gt;One preference became clearer as I used the extension: most of the time, I wanted to translate the reading content.&lt;/p&gt;

&lt;p&gt;For an article or discussion, that usually means the title, body, and comments. Navigation, tags, share buttons, and subscription prompts are less important to me. Translating them can change their size and disturb the page's visual hierarchy.&lt;/p&gt;

&lt;p&gt;I can usually understand those short interface labels. Continuous reading is where I feel the effort: understanding and mentally translating paragraph after paragraph gradually takes attention away from the subject.&lt;/p&gt;

&lt;p&gt;OnlyTranslate's &lt;strong&gt;Smart&lt;/strong&gt; scope prioritizes the main reading areas and tries to leave surrounding controls alone. It works best for articles, blogs, posts, and longer discussions.&lt;/p&gt;

&lt;p&gt;But documentation, dashboards, and information-dense pages do not always have a single article body. The extension also has a &lt;strong&gt;Full page&lt;/strong&gt; scope, which covers more visible text and provides a fallback when Smart misses something.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw12wyrm4nae9rehefnha.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw12wyrm4nae9rehefnha.png" alt="OnlyTranslate showing original text and translations on a webpage" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The display mode is a separate choice. &lt;strong&gt;Bilingual&lt;/strong&gt; keeps the original available for checking meaning; &lt;strong&gt;translation-only&lt;/strong&gt; provides a more continuous reading flow.&lt;/p&gt;

&lt;p&gt;Keeping those choices understandable has been more useful to me than trying to make every decision automatic. I can choose the scope and display mode that fit the page in front of me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subtitles bring a different timing problem
&lt;/h2&gt;

&lt;p&gt;Video was another reading situation I wanted to cover.&lt;/p&gt;

&lt;p&gt;Web paragraphs can wait for a translation. A video keeps playing. Requesting each subtitle only when it appears can fall behind; processing too much in advance adds waiting. Translating isolated lines also loses context.&lt;/p&gt;

&lt;p&gt;OnlyTranslate reads the subtitle track supplied by a supported site, translates segments with context, and displays bilingual subtitles according to playback position. Local caching reduces repeated requests when revisiting a section.&lt;/p&gt;

&lt;p&gt;The supported sites include YouTube, Udemy, Coursera, and Khan Academy. The source video must already have a readable subtitle track. The extension does not transcribe audio or generate missing subtitles.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgfaw0fgav9xph2iqhhm0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgfaw0fgav9xph2iqhhm0.png" alt="Bilingual subtitles displayed during video playback" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My goal was to keep watching in the existing player, with the original subtitles available for comparison.&lt;/p&gt;

&lt;h2&gt;
  
  
  Continuing the same reading approach with books and PDFs
&lt;/h2&gt;

&lt;p&gt;Local ebooks used to mean switching applications and configuring another reading environment. I added an EPUB reader so I could import a DRM-free book, read it chapter by chapter, and keep the same bilingual or translation-only display choices.&lt;/p&gt;

&lt;p&gt;The library, reading progress, and EPUB bookmarks stay in the current browser profile. There is no OnlyTranslate account or cloud library.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsxmpcf32kes6a4gutvvn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsxmpcf32kes6a4gutvvn.png" alt="OnlyTranslate EPUB reader" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The library also supports local PDFs and directly accessible online PDFs. The PDF reader offers original-page comparison and separate original, bilingual, and translation-only display modes. An optional local layout model can help with reading order on complex pages.&lt;/p&gt;

&lt;p&gt;EPUB and PDF reading remain in beta. PDFs need extractable text: image-only scans have no OCR support, and complex layouts can still produce imperfect results. MOBI and DRM- or password-protected books are not supported.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmzau6x14vy80erh8zot7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmzau6x14vy80erh8zot7.png" alt="OnlyTranslate PDF reader feature illustration" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The storage boundary matters here. Original EPUB and PDF files stay in the browser. When an online translation service is used, the text needed for translation is sent to that service. Local storage does not make online translation an entirely local process.&lt;/p&gt;

&lt;p&gt;Removing a book deletes its saved reading data. Uninstalling the extension or clearing its storage removes the library, so backing it up is important.&lt;/p&gt;

&lt;h2&gt;
  
  
  Letting the reader choose the translation service
&lt;/h2&gt;

&lt;p&gt;Translation quality, speed, privacy, and cost vary between providers. I did not want the extension to make that choice permanent.&lt;/p&gt;

&lt;p&gt;OnlyTranslate includes no-setup options such as Microsoft Translator and Google Translate, alongside services that use the reader's own API key. Chrome's built-in translation is another option when the browser and language pair support it.&lt;/p&gt;

&lt;p&gt;The extension itself is free, with no OnlyTranslate subscription. Third-party providers may require accounts, impose quotas, or charge for usage. Their privacy policies also apply to the text they receive.&lt;/p&gt;

&lt;p&gt;Settings, cache, and the library are stored locally, and the project does not collect extension usage data. Those choices still leave the reader responsible for choosing a provider they are comfortable using.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I want to learn from other readers
&lt;/h2&gt;

&lt;p&gt;OnlyTranslate now supports Chrome, Edge, and Firefox. It still has the usual browser extension boundaries: browser-internal pages, extension stores, and some embedded or restricted content cannot be translated. Complex and changing pages can have missed text or layout problems.&lt;/p&gt;

&lt;p&gt;The project has grown around my work and reading habits. Sharing it gives me a chance to find out what I have missed: which pages people actually read, where the scope choices are confusing, and which operations take more effort than they should.&lt;/p&gt;

&lt;p&gt;I expect those concrete problems to guide the next changes. A useful improvement might make translation more dependable, make reading less interrupted, or remove a confusing step. It does not need to add another item to a feature list.&lt;/p&gt;

&lt;p&gt;For anyone working on similar browser tools, I would be interested in your experience: where do you draw the line between automatic content selection and giving the reader an explicit choice?&lt;/p&gt;

&lt;p&gt;The implementation and current limitations are available in the &lt;a href="https://github.com/airhunter/OnlyTranslate" rel="noopener noreferrer"&gt;OnlyTranslate repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Translation note: AI was used to help translate and edit the English version of my Chinese draft.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>browser</category>
      <category>productivity</category>
      <category>software</category>
      <category>tools</category>
    </item>
  </channel>
</rss>
