Начну с того, что использую 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)


  1. xvilka
    10.05.2016 18:38

    Почему бы не использовать Atom тогда?


    1. tgsoft
      10.05.2016 21:01
      +1

      Атом тоже на борту, но грузит систему. Вот есть сравнение пользователя к примеру atom vs code.


      1. xvilka
        10.05.2016 21:25
        +1

        Мда, «атомным» разработчикам есть куда стремиться в ускорении.


  1. stas404
    10.05.2016 21:42

    Наткнулся не так давно на упоминание, что сейчас гугловцы во главе с тем самым Raph Levien пилят некий «Xi editor» на rust. Обещают, мол, круто и производительно все будет, но до нормального релиза ждать еще долго. Тем не менее, 4K звезд им уже понатыкали на github. В общем, если кому интересно будет:
    https://github.com/google/xi-editor


    1. tgsoft
      10.05.2016 22:59

      Пока что этот редактор не универсален для задач под разные системы. Интересно почему такая цифра — мол все должно быть быстрее 16 мс — любая операция. Откуда такая цифра? Преимущество node.js в асинхронности операций. Rust асинхронный? Умеет работать с callback? Основной ли это его принцип при обработке длительных операций?


      1. j0gurt
        10.05.2016 23:11
        -1

        Интересно, почему ребята их Гугл не взяли golang для этого?


      1. stas404
        10.05.2016 23:27

        Возможно, эта цитата по ссылке что-то прояснит:

        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.


      1. appsforlife
        11.05.2016 01:00
        +1

        все должно быть быстрее 16 мс — любая операция. Откуда такая цифра?

        это дает 60 fps


    1. xvilka
      11.05.2016 07:50

      Пока он слишком сырой, но имеет смысл, так как код писать на Rust приятней намного, и он более лаконичен получается. Имхо, если neovim не взлетит (а он пока ни шатко, ни валко развивается, но сильно далеко от заявленных при краудфандинге планов), то это ему достойная замена.


  1. Kuprijan
    10.05.2016 22:52

    На такой случай я пользуюсь QTranslate — делает ту же фигню, с любым языком, с любым редактором/IDE, и не только yandex'ом — но только windows, до этого устанавливал плагин в Visual Studio, который делал то-же самое, но перевод был только с одного языка…


    1. tgsoft
      10.05.2016 22:54

      Уверен есть удобные решения под любые задачи, тут речь идет о кроссплатформенности — возможность использования под любой системой. Интересно кстати какие еще знаете ресурсы онлайн перевода?


      1. Kuprijan
        10.05.2016 23:30

        Больше не знаю. Но хотелось бы тоже знать альтернативы — если такие существуют, мало ли что… А о предыдущем сабже — автор намекает, — что планов на Linux и другие платформы нет — что жалко(


      1. Kuprijan
        15.05.2016 14:19

        Только что лазил по торренту (те кто будет плеваться на счёт лицензии — freeware) — Dicter. Также, у кого установлен PROMPT, есть агент, который висит в трее, и переводит текст по double control


  1. dzigoro
    11.05.2016 01:28

    Для IntelliJ Idea разработан аналогичный плагин


    1. tgsoft
      11.05.2016 07:38

      Интересно почему он недоступен для AndroidStudio?


    1. tgsoft
      11.05.2016 07:45

      Загрузил этот плагин сначала на диск. Потом через AndroidStudio выбрал Настройки-Плагины-Установить с диска. В итоге мы имеем всего лишь подсветку в выпадающем окне значения слова.

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

      <item>test</item>
      

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


      1. dzigoro
        12.05.2016 12:07

        Я с удовольствием его доработаю.


        1. tgsoft
          12.05.2016 12:12

          Здорово!