- PVSM.RU - https://www.pvsm.ru -
Начну с того, что использую vim в качестве редактора файлов. Все удобно и быстро, но есть некоторые проблемы которые выделил при длительном пользовании:
Пользуюсь так же по основному своему хобби — Android Studio. Очень прожорлив этот IDE к ресурсам системы, процессор иногда сходит с ума обрабатывая очередной цикл gradle assembleDebug.
Visual Studio Code [1] испытывал скептически. Первое что удивило скорость запуска вместе с большой структурой проекта. Моментальный поиск по файлам и множество плагинов, отличный менеджер плагинов похожий на Sublime. Минимальная загрузка процессора.
Давно в Android Studio не хватало одной полезной штуки — перевод ресурсов strings.xml под другие языки. Делать раньше это было весьма неудобно:
Чего хотелось — одной комбинацией клавиш получить моментальный результат.
Честно говоря искал сразу похожий плагин под vim, он нашелся достаточно быстро, но его реализация похоже устарела и была актуальна на то время, когда google-translate online был бесплатным для использования в режиме «запрос — ответ».
Visual Studio Code обладает своим маркетом [2]. Поиск плагина для переводов дал один результат, но это был не тот переводчик который я себе представлял — перевод с традиционного китайского на упрощенный китайский как то не особо устраивал мои запросы.
Поэтому я приступил к реализации собственного плагина. Начал с того, что искал сервис, который поможет решить основную задачу — перевести текст. Таким сервисом, к счастью, оказался translate.yandex.ru [3].
Плюсом оказалось так же тот факт, что пакетный менеджер для node.js быстро нашел уже реализованный модуль [4] для сервиса Yandex Translate.
Ну что же — осталось написать сам плагин для Visual Studio Code.
Базовая структура и описание хорошо документированы [5] и не представляли сложности подготовки к реализации.
TypeScript был для меня нечто новым, до этого использовал чистый node.js для достаточно большого проекта учета статистических данных.
Остановлюсь на моментах которые представляли сложность. В node.js для того что бы обработать асинхронно какой то процесс удобно использовать библиотеку async [6]. Очень удобен особенно метод 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 [7]:
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
В процессе реализации плагина наткнулся на проблему — в режиме отладки всё работало идеально. Когда собрал плагин — поспешил его выложить в маркет студии. Как это сделать не спеша описано в инструкции [8].
К чему привело — ошибка при запуске любой команды расширения: «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 [1]
Описание системы расширений для Visual Studio Code [9]
Расширение yandex-translate в маркете [10]
Проект расширения yandex-translate на Github [11]
Автор: tgsoft
Источник [12]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/120246
Ссылки в тексте:
[1] Visual Studio Code: https://www.visualstudio.com/en-us/products/code-vs.aspx
[2] маркетом: https://marketplace.visualstudio.com/VSCode
[3] translate.yandex.ru: http://translate.yandex.ru
[4] реализованный модуль: https://www.npmjs.com/package/yandex-translate
[5] документированы: https://vscode-westeu.azurewebsites.net/docs/extensions/example-hello-world
[6] async: https://www.npmjs.com/package/async
[7] Promise: http://stackoverflow.com/a/34935870
[8] инструкции: https://vscode-westeu.azurewebsites.net/docs/tools/vscecli
[9] Описание системы расширений для Visual Studio Code: https://vscode-westeu.azurewebsites.net/docs/extensions/overview
[10] Расширение yandex-translate в маркете: https://marketplace.visualstudio.com/items?itemName=airstep.yandex-translate
[11] Проект расширения yandex-translate на Github: https://github.com/airstep/vscode-ext-yandex-translate
[12] Источник: https://habrahabr.ru/post/283218/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.