[Из песочницы] 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;
}
Для чего мне нужна была подобная структура — что бы передать массив выделенных строк в функцию перевода, затем перевести каждую и результатом заменить целевые строки расположенные между тегами
- string to translate
которые расположены в ресурсе строк 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 получим перевод всех строк заключенных между элементами:
- string to translate
На всякий случай реализовал смену Yandex Api Key — вдруг по одному и тому же ключу можно делать ограниченное количество переводов. Тогда можно будет сменить ключ на свой.
Все! Удачного перевода.
Ссылки:
Visual Studio Code
Описание системы расширений для Visual Studio Code
Расширение yandex-translate в маркете
Проект расширения yandex-translate на Github