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

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.