Переводчик текста для терминала

Всем привет! Думаю, что большое количество специалистов в области IT используют переводчики текста в своей работе, и я тому не исключение. Достаточно часто в вакансиях Системного администратора можно встретить требуемый навык — «чтение технической документации на английском языке», но, не всегда такая документация может быть очевидной в полной мере, даже имея базовый уровень английского языка, и как мне кажется, тут нечему стесняется. Зачастую такая документация могла быть переведена с родного языка разработчика, который также использовал переводчик, а чаще всего такие переводы можно встретить в репозиториях на GitHub. Стоит заметить, что системы по переводу текста очень сильно прокачались за последние годы (отчасти, благодаря ИИ), и в этом у меня получилось убедиться при общении в Discord с англоговорящими (носителями языка) разработчиками, где чаще всего оказывается поддержка проектов с открытым исходным кодом. Если необходимо перевести текст, который находится в браузере, тут совсем не сложно открыть в соседней вкладке любой переводчик и быстро понять, о чем же там шла речь. Если говорить про браузер, мне привычнее всего использовать Google и DeepL, которые очень часто могут выдавать немного отличные результаты для восприятия, что не всегда, но может стать проблемой для понимания контекста.

Если вам неудобно пользоваться браузером, например, у вас и без того открыто много вкладок и вам недостаточно использовать расширения (которые доступны опять же только в браузере), то тут альтернативой может выступать десктопные приложения для перевода. Например, DeepL имеет отличный интерфейс, который поддерживает быстрый вызов перевода из любого приложения, а также со снимков экрана при нажатии предварительно настроенных комбинаций клавиш. Конечно же присутствуют ограничение, которое составляет 1500 символов за один вызов (3000 символов в браузере). Из минусов интерфейса, нет горячих клавиш для реверсивного переключения языка (я очень часто пользуюсь функций обратного перевода для проверки), кнопки для быстрого копирования вывода в буфер обмена, или, например, не всегда корректно срабатывает автоматическое определение исходного языка (в основном при переключении с одного на другой), по этому приходится все чаще прибегать к мыши, что порой может вызывать неудобства. Зато, перевод можно очень быстро вызывать по горячей клавише, как и само приложение из панели задач, а это уже куда удобнее браузерной версии. Например, если вы используете Windows и ваше приложение находится четвертым слева из закрепленных приложений, интерфейс приложения можно быстро развернуть или свернуть с помощью комбинации клавиш Win+4.

Windows и PowerShell

Может быть и такое, что у вас нет возможности установить приложение, особенно это актуально на рабочем (офисном) компьютере, и вам по прежнему не хотелось бы пользоваться браузером (а еще возможно к нему нет доступа на машине, как например на чистом Windows Server, где стоит один только Internet Explorer, который еще может быть заблокирован политиками безопасности), или вовсе привычнее использовать консольные утилиты, где возможно было бы быстро перевести какой-то мануал или кусок лога. Долгое время я пытался найти достаточно простое и открытое решение, возможно, оно существует, но найти у меня его не получилось, по этому написал достаточно простой модуль на PowerShell, который активно использовал на протяжении последнего года. Модуль (по сути это набор команд, которые вызывают функции) можно быстро установить с помощью менеджера пакетов NuGet:

# Регистрируем репозиторий NuGet (если он у вас еще не установлен)
Register-PSRepository -Name "NuGet" -SourceLocation "https://www.nuget.org/api/v2" -InstallationPolicy Trusted
# Устанавливаем модуль
Install-Module Console-Translate -Repository NuGet

Перевода текста вызывает одной командой:

# Используем переводчик Google
Get-Translate -Provider Google 'Проверка перевода'
Translation check

# Используем переводчик MyMemory
Get-Translate -Provider MyMemory "Проверка перевода"
Validate the translation
Checking your transfer

# Используем параметры для определения языка
Get-Translate -Provider MyMemory "Validate the translation" -LanguageTarget ru -LanguageSource en
Проверка перевода
Редактировать перевод

Мне привычнее всего использовать Windows-Terminal, где возможно назначить или изменить вызов команд на заданные комбинации клавиш, что сильно упрощает взаимодействие с модулем, так и с терминалом в целом. Для этого, открываем вкладку Параметры с настройками приложения терминала Windows, и в нижнем левом углу нажимаем Открытие файла JSON. В открывшимся файле конфигурации добавляем (или изменяем) блок actions для перепрограммирования комбинаций клавиш:

"actions": 
    [
        {
            "command": 
            {
                "action": "copy",
                "singleLine": false
            },
            "keys": "ctrl+c" // default: ctrl+shift+c
        },
        {
            "command": "paste",
            // Сохраняем классическую вставку интерпритатора через ctrl+v, не заставляя выполнять код построчно
            "keys": "ctrl+shift+v" // default: ctrl+v
        },
        {
            "command": 
            {
                "action": "sendInput",
                "input": "\u0001\u001b[3~Get-Translate -Provider Google ''\u001b[D"
            },
            "keys": "ctrl+g"
        },
        {
            "command": 
            {
                "action": "sendInput",
                "input": "\u0001\u001b[3~Get-Translate -Provider Google -Text $(Get-Clipboard)\u001b[D\r"
            },
            "keys": "ctrl+shift+g"
        }
    ]

Первые два блока command отвечают за переопределение клавиш копирования и вставки из буфера обмена (использовать Ctrl+C и Ctrl+V как в классическом терминале PowerShell, избавляясь от навязчивых предупреждений о вставке текста и построчного исполнения команд). Третий параметр отвечает за обработку нажатия клавиши Ctrl+G, что предварительно очищает строку ввода, после чего вызывает вставку текста: Get-Translate -Provider Google '' и подводит курсор в центр кавычек, что позволяет сразу после нажатия вводить текст и вызывать перевод по нажатию Enter. Последняя команда делает тоже самое, но вставляет текст из буфера обмена (с помощью встроенной команды Get-Clipboard) и вызывает выполнение для перевода текста при нажатии Ctrl+Shift+G. Точно также можно назначить вызов перевода для других провайдеров перевода (например, DeepLX или MyMemory) на другие комбинации клавиш.

Большим преимуществом данного интерпретатора PowerShell является навигация по истории команд, которую можно включить с помощью клавиши F2, что позволяет, например, введя текст Console-Translate в начале строке получить доступ к истории всех вызываем команд (в данном случае, к истории переводов). По мимо этого, в PowerShell, начиная с версии 7+ (Core) доступно использование большенства модулей также в системе Linux.

И хотя можно использовать aliaces для команд, такое решение для меня оказалась максимально удобным, терминал у меня всегда закреплен первым приложением на панели задач, на который я быстро переключаюсь комбинацией клавиш Win+1 и используя указанные выше комбинации клавиш произвожу перевод текста. Точно также использую такое решение на рабочем компьютере, и почти перестал заходить в браузер для перевода, но, уже достаточно давно меня не покидала мысль написать полноценное терминальное приложение, которое позволит получать перевод одновременно из нескольких источников одновременно.

Кроссплатформенное решение на Node.js

Не так давно я начал освоение Node.js, и мне стало любопытно, какие существуют фреймворки для создания TUI приложений (пользовательских интерфейсов на базе текста). По сравнению с другими языками (как напримерGo или Rust, которые используется куда чаще для решения подобных задач) выбор оказался очень небольшим — это библиотека Blessed. И не смотря на то, что сама библиотека больше не поддерживается (последний commit производился целых 9 лет назад), она использовалась для реализации других популярных библиотек, таких как blessed-contrib (расширяет библиотеку за счет создания дополнительных виджетов, графиков, диаграмма и т.д.) и текстового редактора slap, а также являлась источником вдохновения для создания проекта termui для GoLang. Для пример, одним из популярных терминальных приложений для управления контейнерами Docker является Dockly, интерфейс который написан как раз на базе данной библиотеки.

Создание таких форм с использованием уже готовой библиотеки процесс совсем несложный, все примеры и документация доступны на главной странице репозитория GitHub. Остается только найти открытые и бесплатные API, которые будут производить перевод без необходимости регистрации и получения токена. У меня получилось найти таких четыре (естественно, с лазейками), по этому ниже представлен список используемых провайдеров, с ссылками на источники:

  • Google Translate через бесплатный и безлимитный API (проект размещен на GitHub, достаточно старый, но все еще рабочий) с использованием serverless (простыми словами это модель, которая выполняет набор заданных функций, без необходимости управления самим сервером), размещенный на Vercel (один из самых популярных поставщиков услуг для запуска таких функций). Запустить такой код и опубликовать собственный сервер вы можете самостоятельно и абсолютно бесплатно, что по сути является правильным решением для уменьшения нагрузки на один запущенный экземпляр.

  • DeepLX — бесплатный API для DeepL с использованием serverless, размещенный на Vercel (аналогично Google Translate).

  • MyMemory — Это огромная база перевода (архив), которая создана людьми со всего мира. Присутствует полностью бесплатный, анонимный и открытый API (не требуется токен доступа, хотя его использование также возможно), использование ограничено 5000 символами в день как заявлено на официальном сайте, по факту, 500 символов на один запрос.

  • Reverso — содержит бесплатный и официальный API. У меня не получилось найти официальной документации, по этому запрос был получен с официального сайта через инструменты DevTools (только его никак не получилось подружить с библиотекой Axios).

В случае с Google и DeepL возможно получить токен доступа к API официально и бесплатно, но для этого требуется регистрации, что достаточно сложно сделать из РФ на сегодняшний день. К тому же это потребует предварительная настройка приложения (добавление токена) конечному пользователю для его работы.

Все что нужно было сделать, это нарисовать формы, обработать вызовы запросов и передать вывод результатов перевода в формы вывода. Выглядит это следующим образом:

Интерфейс multranslate.

Интерфейс multranslate.

Самые »оригинальные» результаты чаще всего выдает MyMemory, особенно, если это короткие предложения. Конечно же присутствуют ограничение на количество символов, которые сопоставимы с браузерными версиями, где в среднем это 5 тысяч символов, за исключением Reverso, который позволяет переводить до 8 тысяч за один запрос (что выше, чем в браузерной версии, и практически не имеет ограничений на количество запросов). Так как акцент сделан на перевод между русским и английским языками, реализован механизм автоматического определения языка на уровне кода, который анализирует исходный текст посимвольно, и в отличии от переводчика не допускает ошибок (т.е. если русских букв больше чем английских, то исходный текст является русским, соответственно перевод будет производиться на английский язык, и наоборот).

Установить интерфейс возможно через менеджер пакетов npm с помощью одной команды (предварительно в вашей системе уже должен быть установлен пакет node.js):

npm install -g multranslate
multranslate --help

Для запуска приложения используется команда: multranslate без параметров, но также возможно запустить с использованием только одного из представленных провайдеров перевода. По мимо этого, вы можете запустить приложение из исходного кода, который размещен на GitHub.

Так как большинство модулей на платформе node.js могут исполнять код JavaScript в любой системе, установить и использовать такой интерфейс возможно как на Windows, так и на Linux и MacOS (мне удалось проверить работоспособность на всех трех платформах).

Перевод текста производится автоматически, при каждом нажатии клавиши Enter. Что бы очистить поле ввода текста, используется комбинация клавиш Ctrl+C, для вставки из буфера обмена используется классическая комбинация Ctrl+V (которая определена на уровне самого приложения). Для быстрого копирования текста в буфер обмена из любого полей вывода с результатом перевода используются комбинации клавиш Ctrl+ (комбинация клавиш указана в скобках, справа от названия переводчика). Для удобства и наглядности при копировании текста, выбранное поле будет выделено зеленым цветом:

Копирование текста из вывода перевода Reverso с помощью комбинации клавиш Ctrl+E.

Копирование текста из вывода перевода Reverso с помощью комбинации клавиш Ctrl+E.

Преимуществом такого решения является то, что данный инструмент хранит историю всех переводов в локальной базе SQLite, тем самым вы можете очень быстро получить доступ к любым предыдущим переводам с помощью комбинации клавиш Ctrl+Z (до 500 запросов на перевод, после чего производится автоматическая очистка старых записей). Самой большой проблемой в реализации интерфейса оказалось ограничение управлением курсора из-за смещения текста при использовании встроенного autowrap в библиотеке Blessed, и для решения этой проблемы мне понадобилось достаточно много времени, что бы получить привычное (полноценное) управление курсором, как например, в браузере.

Такой метод перевода для меня является максимально удобным, возможно быстро скопировать текст, очистить поле ввода и вставить текст для обратной проверки перевода с помощью трех нажатий, а потом вернуться назад к предыдущему тексту в поле ввода еще одной комбинацией клавиш. Если текст выходит за рамки окна вывода, то появляется возможность пролистывать все полня вывода одновременно с помощью стрелочек вверх и вниз. Как я заметил для себя на протяжение последних трех месяцев активного использования, удобнее всего запустить переводчик во втором терминале через split-режим или в соседней вкладке Windows Terminal, или Tabby, на которую возможно быстро переключаться с помощью комбинации клавиш Ctrl+Tab. В случае, если нужно произвести перевод текста с экрана (когда нет возможности его выделить напрямую, например, с картинки), я обычно использую Text Extractor из набора утилит PowerToys (также возможно установить Text-Grab отдельно), который распознает символы с помощью системы OCR и копирует результат в буфер обмена.

Вывод

Хотелось уточнить, что по профессии не являюсь разработчиком, и для меня это только хобби, поэтому такой инструмент вряд ли может стать идеальным решением для всех, тем не менее, у меня получилось создать максимально удобный и минималистичный интерфейс, который теперь использую ежедневно, и возможно, он также пригодится и вам. Если на ваш взгляд есть функции, которые было бы полезно внедрить, возможно что-то изменить или вдруг у вас возникнут проблемы с запуском или работой, можете написать мне на Хабр, или оставить запрос на внедрение в разделе Issues на GitHub.

© Habrahabr.ru