WordToast: браузерное расширение для перевода слов с интервальными повторениями

Habr AI · оригинал

Материал подготовлен автоматизированной редакционной системой. Факты можно сверить по указанному первоисточнику.

Разработчик представил WordToast — кроссбраузерное расширение, которое объединяет мгновенный перевод выделенного текста и систему запоминания лексики. Инструмент поддерживает локальную обработку данных в Chrome и интеграцию с внешними LLM для контекстного объяснения значений.

Проект демонстрирует современные подходы к приватности в браузерных расширениях, используя встроенные API Chrome для локального перевода и обходя ограничения MV3 через shadow DOM и прямые вызовы LLM без серверной части.

Популярное ранее китайское расширение Dadda Translate перестало функционировать из-за изменения сторонних API, на которых оно базировалось. В ответ на это разработчик создал с нуля новый инструмент — WordToast, доступный для Firefox, Chrome и Edge. В отличие от оригинала, который поддерживал только пару «английский — китайский», новая версия переводит текст на язык, установленный в браузере, и предлагает гибкую систему запоминания слов.

Архитектура перевода построена на цепочке из пяти движков: публичный эндпоинт Google, MyMemory, DeepL (с пользовательским ключом), встроенный переводчик Chrome и любая языковая модель. Если один из сервисов возвращает ошибку или исчерпывает лимиты, система автоматически переключается на следующий. Для обогащения карточки перевода одиночных английских слов используется словарь dictionaryapi.dev, который предоставляет части речи, определения и примеры произношения. Автор отмечает, что бесплатные API могут отвечать медленно, поэтому карточка сначала показывает основной перевод, а дополнительные данные подгружаются асинхронно.

Ключевым преимуществом в Chrome является использование встроенного Translator API, доступного начиная с версии 138. Это позволяет выполнять перевод и определение языка локально, не отправляя текст на внешние серверы, что критически важно для приватности. Однако разработчик указывает на технические нюансы: API недоступен в service worker, поэтому вызовы выполняются из content script. Кроме того, загрузка модели требует жеста пользователя, а детектор языка может показывать низкую уверенность при работе с короткими текстами, что приводит к откату на другие движки.

Для глубокого понимания значений реализована функция «Объяснить с ИИ». Пользователь может подключить OpenAI, Claude, Gemini или локальную Ollama, передавая модели контекст предложения. Запросы отправляются напрямую из расширения к провайдеру, минуя собственный сервер. При работе с Anthropic API требуется специальная заголовочная директива для разрешения доступа из браузерного контекста, что является осознанным риском хранения ключа на клиенте.

Визуализация карточек перевода и всплывающих напоминаний реализована через shadow DOM. Это защищает стили расширения от конфликтов с CSS сторонних сайтов и позволяет обходить строгие Content Security Policy (CSP), используя adoptedStyleSheets. Координаты элементов рассчитываются на основе выделенного текста, а карточка автоматически меняет ориентацию, если не помещается в нижней части экрана.

Система интервальных повторений основана на растущих временных интервалах: от 5 минут до 60 дней. Сохраняемое слово привязывается к предложению и ссылке на страницу. Из-за ограничений MV3, где у фонового service worker нет долгоживущих таймеров, напоминания запускаются через chrome.alarms раз в минуту. Словарь можно экспортировать в форматы Anki (TSV), CSV и JSON.

Разработчик также столкнулся с проблемой назначения горячих клавиш, которые Chrome мог молча игнорировать. Для решения этой задачи были написаны E2E-тесты, а страница настроек теперь отображает фактически назначенные сочетания. Проект распространяется под лицензией MIT, не содержит аккаунтов и аналитики, код доступен на GitHub.