Yandex Translate для Visual Studio Code

Начну с того, что использую vim в качестве редактора файлов. Все удобно и быстро, но есть некоторые проблемы которые выделил при длительном пользовании:

  • Нет асинхронности. Знаю что есть nvim — но он работает не так быстро и не так гладко
  • Сложность написания плагинов. Спорный конечно вопрос для разных гуру — но честно говоря так много «каши», не хватает модульности и какой то структурности из уже реализованных «велосипедов»
  • Когда слишком много плагинов vim стартует — нужно быть честным, довольно долго и это напрягает

Пользуюсь так же по основному своему хобби — Android Studio. Очень прожорлив этот IDE к ресурсам системы, процессор иногда сходит с ума обрабатывая очередной цикл gradle assembleDebug.

Visual Studio Code испытывал скептически. Первое что удивило скорость запуска вместе с большой структурой проекта. Моментальный поиск по файлам и множество плагинов, отличный менеджер плагинов похожий на Sublime. Минимальная загрузка процессора.

Давно в Android Studio не хватало одной полезной штуки — перевод ресурсов strings.xml под другие языки. Делать раньше это было весьма неудобно:

  • Выделить текст
  • Скопировать
  • Перейти в любой онлайн переводчик
  • Вставить текст
  • Выбрать текущий язык перевода
  • Выбрать в какой язык перевести
  • Скопировать перевод
  • Открыть результирующий strings.xml
  • Вставить перевод

Чего хотелось — одной комбинацией клавиш получить моментальный результат.

Честно говоря искал сразу похожий плагин под vim, он нашелся достаточно быстро, но его реализация похоже устарела и была актуальна на то время, когда google-translate online был бесплатным для использования в режиме «запрос — ответ».

Visual Studio Code обладает своим маркетом. Поиск плагина для переводов дал один результат, но это был не тот переводчик который я себе представлял — перевод с традиционного китайского на упрощенный китайский как то не особо устраивал мои запросы.

Поэтому я приступил к реализации собственного плагина. Начал с того, что искал сервис, который поможет решить основную задачу — перевести текст. Таким сервисом, к счастью, оказался translate.yandex.ru.

Плюсом оказалось так же тот факт, что пакетный менеджер для node.js быстро нашел уже реализованный модуль для сервиса Yandex Translate.

Ну что же — осталось написать сам плагин для Visual Studio Code.

Базовая структура и описание хорошо документированы и не представляли сложности подготовки к реализации.

TypeScript был для меня нечто новым, до этого использовал чистый node.js для достаточно большого проекта учета статистических данных.

Остановлюсь на моментах которые представляли сложность. В node.js для того что бы обработать асинхронно какой то процесс удобно использовать библиотеку async. Очень удобен особенно метод async.map который позволяет передать массив данных которые нужно обработать и на выходе получить массив результатов.

Выглядит это дело приблизительно так:

var async = require('async');

async.map(['test1','test2','test3'], test, function(err, results){
    console.log(results);
});

function test(item) {
    return item;
}

Для чего мне нужна была подобная структура — что бы передать массив выделенных строк в функцию перевода, затем перевести каждую и результатом заменить целевые строки расположенные между тегами
<item>string to translate</item>
которые расположены в ресурсе строк strings.xml android проекта.

Но, как оказалось можно использовать Promise:

async function processData(data: any[]) {
  const promises = data.map(async (item) => {
    await doSomeAsyncStuff(item);
    // здесь Вы можете продолжать работать дальше с `item`
  });
  await Promise.all(promises);

  // дальнейший код будет вызван после того как все асинхронные коды выполнятся
}

async function doSomeAsyncStuff(value) {
  return new Promise((resolve, reject) => {
    // вызывайте любую асинхронную библиотеку или к примеру setTimeout а дальше resolve(подтвердите) или reject(отклоните) promise (обещание)
  });
}

Что это дало — в итоге размер плагина уменьшился на 2Мб, так как не пришлось подтягивать async пакет для node.js

В процессе реализации плагина наткнулся на проблему — в режиме отладки всё работало идеально. Когда собрал плагин — поспешил его выложить в маркет студии. Как это сделать не спеша описано в инструкции.

К чему привело — ошибка при запуске любой команды расширения: «An extension might be missing an activation event.»
Почему так происходило — система не находила имени action команды которое прописано в файлах основного кода и настраиваемого файла package.json расширения. На самом деле все имена совпадали — а соль была в том что изначально подтянул не ту библиотеку async используя устаревшую node-async которая давала сбой при инициализации. В результате и та и другая библиотека async была удалена из зависимостей по причине использования Promise.

Итог реализации


Запустив Visual Studio Code нажимаем Ctrl+P и вставляем «ext install yandex-translate». После установки студия предложит «Перезагрузить» что бы применить расширение к своей оболочке. После перезагрузки берем любой файл в котором нужно что либо перевести, нажимаем F1 выбираем Yandex translate selected, либо же комбинация клавиш Ctrl+t.

Можно указывать с какого языка на какой осуществлять перевод комбинацией клавиш Ctrl+shift+t либо F1 -> Yandex choose languages

В файлах strings.xml выделив необходимые строки и нажав комбинацию Ctrl+alt+t получим перевод всех строк заключенных между элементами:


<item>string to translate</item>

На всякий случай реализовал смену Yandex Api Key — вдруг по одному и тому же ключу можно делать ограниченное количество переводов. Тогда можно будет сменить ключ на свой.

Все! Удачного перевода.

Ссылки:

Visual Studio Code
Описание системы расширений для Visual Studio Code
Расширение yandex-translate в маркете
Проект расширения yandex-translate на Github
Поделиться публикацией

Комментарии 18

    0
    Почему бы не использовать Atom тогда?
      +1
      Атом тоже на борту, но грузит систему. Вот есть сравнение пользователя к примеру atom vs code.
        +1
        Мда, «атомным» разработчикам есть куда стремиться в ускорении.
      0
      Наткнулся не так давно на упоминание, что сейчас гугловцы во главе с тем самым Raph Levien пилят некий «Xi editor» на rust. Обещают, мол, круто и производительно все будет, но до нормального релиза ждать еще долго. Тем не менее, 4K звезд им уже понатыкали на github. В общем, если кому интересно будет:
      https://github.com/google/xi-editor
        0
        Пока что этот редактор не универсален для задач под разные системы. Интересно почему такая цифра — мол все должно быть быстрее 16 мс — любая операция. Откуда такая цифра? Преимущество node.js в асинхронности операций. Rust асинхронный? Умеет работать с callback? Основной ли это его принцип при обработке длительных операций?
          –1
          Интересно, почему ребята их Гугл не взяли golang для этого?
            0
            Возможно, эта цитата по ссылке что-то прояснит:
            Asynchronous operations. The editor should never, ever block and prevent the user from getting their work done. For example, autosave will spawn a thread with a snapshot of the current editor buffer (the peristent rope data structure is copy-on-write so this operation is nearly free), which can then proceed to write out to disk at its leisure, while the buffer is still fully editable.
            • НЛО прилетело и опубликовало эту надпись здесь
              0
              Пока он слишком сырой, но имеет смысл, так как код писать на Rust приятней намного, и он более лаконичен получается. Имхо, если neovim не взлетит (а он пока ни шатко, ни валко развивается, но сильно далеко от заявленных при краудфандинге планов), то это ему достойная замена.
              0
              На такой случай я пользуюсь QTranslate — делает ту же фигню, с любым языком, с любым редактором/IDE, и не только yandex'ом — но только windows, до этого устанавливал плагин в Visual Studio, который делал то-же самое, но перевод был только с одного языка…
                0
                Уверен есть удобные решения под любые задачи, тут речь идет о кроссплатформенности — возможность использования под любой системой. Интересно кстати какие еще знаете ресурсы онлайн перевода?
                  0
                  Больше не знаю. Но хотелось бы тоже знать альтернативы — если такие существуют, мало ли что… А о предыдущем сабже — автор намекает, — что планов на Linux и другие платформы нет — что жалко(
                    0
                    Только что лазил по торренту (те кто будет плеваться на счёт лицензии — freeware) — Dicter. Также, у кого установлен PROMPT, есть агент, который висит в трее, и переводит текст по double control
                  0
                  Для IntelliJ Idea разработан аналогичный плагин
                    0
                    Интересно почему он недоступен для AndroidStudio?
                      0
                      Загрузил этот плагин сначала на диск. Потом через AndroidStudio выбрал Настройки-Плагины-Установить с диска. В итоге мы имеем всего лишь подсветку в выпадающем окне значения слова.

                      Плагин же разработанный для vscode умеет переводить и заменять слова on the fly +умная замена в ресурсах strings.xml именно между тегами
                      <item>test</item>
                      

                      не затрагивая сами тэги xml, что очень удобно — если выбрать все строки и нажать перевод.
                        0
                        Я с удовольствием его доработаю.
                          0
                          Здорово!

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое