multranslate
Advanced tools
Comparing version 0.4.3 to 0.4.4
@@ -105,5 +105,5 @@ #!/usr/bin/env node | ||
// Панель для отображения перевода от MyMemory | ||
// Панель для отображения перевода от Reverso | ||
const outputBox3 = blessed.textarea({ | ||
label: `MyMemory (Ctrl+E)`, | ||
label: `Reverso (Ctrl+E)`, | ||
top: '60%', | ||
@@ -132,5 +132,5 @@ width: '49.5%', | ||
// Панель для отображения перевода от Reverso | ||
// Панель для отображения перевода от MyMemory | ||
const outputBox4 = blessed.textarea({ | ||
label: `Reverso (Ctrl+R)`, | ||
label: `MyMemory (Ctrl+R)`, | ||
top: '60%', | ||
@@ -160,3 +160,3 @@ left: '50.5%', | ||
let infoContent = ` Ctrl+S: Get help on Hotkeys.` | ||
let infoContent = `Ctrl+S: Get help on Hotkeys.` | ||
@@ -167,3 +167,3 @@ // Информация по навигации внизу формы | ||
bottom: 0, | ||
left: 0, | ||
left: 1, | ||
right: 0, | ||
@@ -183,2 +183,3 @@ align: 'center', | ||
left: 'center', | ||
right: 'center', | ||
width: '70%', | ||
@@ -202,4 +203,4 @@ height: '50%', | ||
{green-fg}Enter{/green-fg}: Translation | ||
{cyan-fg}Ctrl+<Q/W/E/R>{/cyan-fg}: Copy translation results to clipboard | ||
{cyan-fg}Ctrl+V{/cyan-fg}: Pasting text from the clipboard | ||
{cyan-fg}Ctrl+<Q/W/E/R>{/cyan-fg}: Copy translation results to clipboard | ||
{cyan-fg}Ctrl+Z{/cyan-fg}: Navigation of the translations history from the end | ||
@@ -271,2 +272,3 @@ {cyan-fg}Ctrl+X{/cyan-fg}: Navigation of the translations history in reverse order | ||
let curID = 0 | ||
const clearHistory = 500 // Количество объектов истории для хранения в базе данных | ||
@@ -294,11 +296,2 @@ import path from 'path' | ||
function readHistory(id) { | ||
const dbPath = path.join(__dirname, 'translation-history.db') | ||
const db = new Database(dbPath) | ||
const query = 'SELECT inputText,created_at FROM translationTable WHERE id = ?' | ||
const get = db.prepare(query) | ||
const data = get.get(id) | ||
db.close() | ||
return data | ||
} | ||
function getAllId() { | ||
@@ -308,3 +301,2 @@ const dbPath = path.join(__dirname, 'translation-history.db') | ||
let result | ||
// Проверяем, что таблица существует | ||
const tableExists = db.prepare(` | ||
@@ -325,2 +317,12 @@ SELECT name FROM sqlite_master WHERE type='table' AND name='translationTable' | ||
function readHistory(id) { | ||
const dbPath = path.join(__dirname, 'translation-history.db') | ||
const db = new Database(dbPath) | ||
const query = 'SELECT inputText,created_at FROM translationTable WHERE id = ?' | ||
const get = db.prepare(query) | ||
const data = get.get(id) | ||
db.close() | ||
return data | ||
} | ||
function parseData(inputDate) { | ||
@@ -332,2 +334,11 @@ const [datePart, timePart] = inputDate.split(' ') | ||
function deleteHistory(id) { | ||
const dbPath = path.join(__dirname, 'translation-history.db') | ||
const db = new Database(dbPath) | ||
const query = 'DELETE FROM translationTable WHERE id = ?' | ||
const del = db.prepare(query) | ||
del.run(id) | ||
db.close() | ||
} | ||
// ------------------------------------- TextBuffer ------------------------------------- | ||
@@ -770,4 +781,4 @@ | ||
let clipboardText = clipboardy.readSync() | ||
// Обновляем экранирование переноса строки для фиксации при перемещении нативного курсора | ||
clipboardText = clipboardText.replace(/\n/g, '\r') | ||
// Обновляем экранирование переноса строки для фиксации при перемещении нативного курсора и обрезаем пробелы в конце строки | ||
clipboardText = clipboardText.replace(/\n/g, '\r').trim() | ||
let newText = buffer.getText().slice(0, buffer.getCursorPosition()) + clipboardText + buffer.getText().slice(buffer.getCursorPosition()) | ||
@@ -899,22 +910,2 @@ // Добавляем текст из буфера обмена к текущему тексту | ||
// Функция перевода через MyMemory API | ||
// Source: https://mymemory.translated.net/doc/spec.php | ||
async function translateMyMemory(text) { | ||
const fromLang = detectFromLanguage(text) | ||
const toLang = detectToLanguage(fromLang) | ||
const apiUrl = 'https://api.mymemory.translated.net/get' | ||
try { | ||
const response = await axios.get(apiUrl, { | ||
timeout: 3000, | ||
params: { | ||
q: text, | ||
langpair: `${fromLang}|${toLang}` | ||
} | ||
}) | ||
return response.data.responseData.translatedText | ||
} catch (error) { | ||
return error.message | ||
} | ||
} | ||
// Функция перевода через Reverso API (ошибка: Parse Error: Invalid header value char) | ||
@@ -987,2 +978,33 @@ async function translateReverso(text) { | ||
// Функция перевода через MyMemory API | ||
// Source: https://mymemory.translated.net/doc/spec.php | ||
async function translateMyMemory(text) { | ||
const fromLang = detectFromLanguage(text) | ||
const toLang = detectToLanguage(fromLang) | ||
const apiUrl = 'https://api.mymemory.translated.net/get' | ||
try { | ||
const response = await axios.get(apiUrl, { | ||
timeout: 3000, | ||
params: { | ||
q: text, | ||
langpair: `${fromLang}|${toLang}` | ||
} | ||
}) | ||
// Вернуть нескольк ответов | ||
let results = '' | ||
if (response.data.matches) { | ||
response.data.matches.forEach(element => { | ||
results += element.translation + "\n" | ||
}) | ||
return results | ||
} | ||
// Вернуть один результат перевода | ||
else { | ||
return response.data.responseData.translatedText | ||
} | ||
} catch (error) { | ||
return error.message | ||
} | ||
} | ||
// Функция обработки перевода | ||
@@ -995,4 +1017,13 @@ async function handleTranslation() { | ||
writeHistory(textToTranslate) | ||
// Сбрасываем значение счетчика навигации по истории | ||
maxID = 0 | ||
const allId = getAllId() | ||
maxID = allId.length-1 | ||
curID = maxID | ||
const lastText = readHistory(allId[allId.length-1]) | ||
if (curID >= clearHistory) { | ||
deleteHistory(allId[0]) | ||
curID-- | ||
maxID-- | ||
} | ||
infoBox.content = `${infoContent} History: ${curID+1}/${curID+1} (${parseData(lastText.created_at)})` | ||
// Запросы к API на перевод | ||
const [ | ||
@@ -1006,4 +1037,4 @@ translatedText1, | ||
translateDeepLX(textToTranslate), | ||
translateMyMemory(textToTranslate), | ||
translateReversoFetch(textToTranslate) | ||
translateReversoFetch(textToTranslate), | ||
translateMyMemory(textToTranslate) | ||
]) | ||
@@ -1010,0 +1041,0 @@ outputBox1.setContent(translatedText1) |
{ | ||
"name": "multranslate", | ||
"version": "0.4.3", | ||
"version": "0.4.4", | ||
"description": "Cross-platform TUI for translating text in multiple translators simultaneously, with support for translation history and automatic language detection.", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
@@ -15,3 +15,3 @@ <h1 align="center"> | ||
Терминальный пользовательский интерфейс (TUI) на базе библиотеки [Blessed](https://github.com/chjj/blessed) для одновременного перевода текста с использованием нескольких источников перевода. Все источники не требуют токена доступа или каких-либо настроек. Поддерживает **автоматическое определение исходного и целевого языка** на уровне кода между английским и русским и доступ к **истории переводов** через [SQLite](https://github.com/WiseLibs/better-sqlite3). | ||
Терминальный пользовательский интерфейс (TUI) на базе библиотеки [Blessed](https://github.com/chjj/blessed) для одновременного перевода текста с использованием нескольких источников перевода. Все источники не требуют токена доступа или других настроек. Поддерживает **автоматическое определение исходного и целевого языка** на уровне кода между английским и русским (по умолчанию) и доступ к **истории переводов** через [SQLite](https://github.com/WiseLibs/better-sqlite3) (до 500 запросов, после чего применяется автоматическая чистка старых значений из истории). | ||
@@ -22,8 +22,8 @@ ![interface](/image/interface.jpg) | ||
- Google через бесплатный и безлимитный [API](https://github.com/matheuss/google-translate-api) с использованием [serverless](https://github.com/olavoparno/translate-serverless-vercel), размещенный на Vercel. | ||
- [DeepLX](https://github.com/OwO-Network/DeepLX) - бесплатный [DeepL](https://deepl.com) API с использованием [serverless](https://github.com/LegendLeo/deeplx-serverless), размещенный на [Vercel](https://github.com/bropines/Deeplx-vercel). | ||
- [MyMemory](https://mymemory.translated.net/doc/spec.php) - бесплатный и открытый API (использование ограничено 5000 символами в день). | ||
- [Reverso](https://www.reverso.net) - бесплатный API (не содержит официальной документации, запрос был получен с официального сайта через *DevTools*). | ||
- [Google](https://translate.google.com) - бесплатный и безлимитный [API](https://github.com/vitalets/google-translate-api) с использованием [serverless](https://github.com/olavoparno/translate-serverless-vercel) размещенный на Vercel. Доступно для перевода более 5000 символов. | ||
- [DeepL](https://www.deepl.com) - бесплатный API через [DeepLX](https://github.com/OwO-Network/DeepLX) с использованием [serverless](https://github.com/LegendLeo/deeplx-serverless) размещенный на [Vercel](https://github.com/bropines/Deeplx-vercel). Присутствуют ограничения на частое количество запросов перевода, может иметь ограничения при использование большого количества символов (официальное ограничение в 5000 символов на запрос). | ||
- [Reverso](https://www.reverso.net) - самый стабильный, бесплатный и без ограничений на количество символов (версия на сайте ограничена 2000 символам и 900 через приложение, через `API` возможно получить до 8000). Не содержит официальной документации, запрос был получен с официального сайта через *DevTools*. | ||
- [MyMemory](https://mymemory.translated.net/doc/spec.php) - бесплатный и открытый API (ограничение в 500 символов на запрос). Поддверживает до 3 вариантов ответа для коротких запросов. | ||
> ⚠ **Reverso** не поддерживает работу через **Axios** (ошибка: `Invalid header value char`), вместо этого используется **Fetch**. | ||
> ⚠ **Reverso** не поддерживает работу через **Axios** (ошибка: `Invalid header value char`), вместо этого используется **Fetch**. По этой причине не получается упаковать пакет с помощью `pkg` без ошибок при запуске. | ||
@@ -59,11 +59,5 @@ ## 🚀 Установка | ||
Для отладки интерфейса: | ||
```shell | ||
npm run dev | ||
``` | ||
## 💡 Текстовый буфер | ||
Библиотека Blessed является устаревшей (более не поддерживается) и имеет ряд технических ограничений, например, навигация курсора в поле ввода текста. По этой причине был реализован механизм управления содержимым ввода через текстовый буфер, который позволяет использовать кастомный курсор для навигации с помощью стрелочек клавиатуры и автоматический скроллинг для пролистывания. | ||
Библиотека Blessed является устаревшей (более не поддерживается) и имеет ряд технических ограничений, например, отсутствует возможность навигации курсора в поле ввода текста. По этой причине был реализован механизм управления содержимым ввода через текстовый буфер, который позволяет использовать кастомный курсор для навигации с помощью стрелочек клавиатуры и автоматический скроллинг для пролистывания. | ||
@@ -76,6 +70,6 @@ Если вы планируете использовать данную библиотеку для схожих задач где требуется ввод текста, то добавьте в свой код `class TextBuffer` и управление корячими клавишами `keypress` через `inputBox.on()`. | ||
- `Ctrl+<Q/W/E/R>`: копирования результатов перевода из форм вывода в буфер обмена (для каждого переводчика комбинация клавиш указана в скобках), при этом выбранная форма изменит свой цвет на зеленый. | ||
- `Ctrl+V`: вставка текста из буфера обмена (определено на уровне кода). | ||
- `Ctrl+<Q/W/E/R>`: копирования результатов перевода из форм вывода в буфер обмена (для каждого переводчика комбинация клавиш указана в скобках), при этом выбранная форма изменит свой цвет на зеленый. | ||
- `Ctrl+Z`: Навигация по истории запросов на переводы с конца. | ||
@@ -82,0 +76,0 @@ |
@@ -15,3 +15,3 @@ <h1 align="center"> | ||
A terminal user interface (TUI) based on the [Blessed](https://github.com/chjj/blessed) library for simultaneous text translation using multiple translation sources. All sources do not require an access token or any customization. Supports **automatic source and target language detection** at the code level between English and Russian and access to **translation history** via [SQLite](https://github.com/WiseLibs/better-sqlite3). | ||
A terminal user interface (TUI) based on the [Blessed](https://github.com/chjj/blessed) library for simultaneous text translation using multiple translation sources. All sources do not require an access token or other settings. Supports **automatic source and target language detection** at the code level between English and Russian (default) and access to **translation history** via [SQLite](https://github.com/WiseLibs/better-sqlite3) (up to 500 queries, after which an automatic cleaning of old values from the history is applied). | ||
@@ -22,8 +22,7 @@ ![interface](/image/interface.jpg) | ||
- Google via free and unlimited [API](https://github.com/matheuss/google-translate-api) using [serverless](https://github.com/olavoparno/translate-serverless-vercel) hosted on Vercel. | ||
- [DeepLX](https://github.com/OwO-Network/DeepLX) - free [DeepL](https://deepl.com) API using [serverless](https://github.com/LegendLeo/deeplx-serverless) hosted on [Vercel](https://github.com/bropines/Deeplx-vercel). | ||
- [MyMemory](https://mymemory.translated.net/doc/spec.php) - free and open api (usage is limited to 5000 chars/day). | ||
- [Reverso](https://www.reverso.net) - free api (does not contain official documentation, request was received from official site through DevTools). | ||
- [Google](https://translate.google.com) - free and unlimited [API](https://github.com/vitalets/google-translate-api) using [serverless](https://github.com/olavoparno/translate-serverless-vercel) hosted on Vercel. Available for translation more than 5000 characters. | ||
- [DeepL](https://www.deepl.com) - free API via [DeepLX](https://github.com/OwO-Network/DeepLX) using [serverless](https://github.com/LegendLeo/deeplx-serverless) hosted on [Vercel](https://github.com/bropines/Deeplx-vercel). There are limitations on the number of frequent requests for translation, can have limitations when using a large number of - [Reverso](https://www.reverso.net) - the most stable, free and without any limitation on the number of characters (version on the site is limited to 2000 characters and 900 through the application, through the API can get up to 8000). Does not contain official documentation, request was received from official site via *DevTools*.characters (official limit of 5000 characters per request). | ||
- [MyMemory](https://mymemory.translated.net/doc/spec.php) - free and open API (limit of 500 characters per request). Supports up to 3 response options for short queries. | ||
> ⚠ **Reverso** does not support working via **Axios** (error: `Invalid header value char`), **Fetch** is used instead. | ||
> ⚠ **Reverso** does not support working via **Axios** (error: `Invalid header value char`), **Fetch** is used instead. For this reason, the package cannot be packaged with the 'pkg' without errors during startup. | ||
@@ -59,11 +58,5 @@ ## 🚀 Installation | ||
To debug the interface: | ||
```shell | ||
npm run dev | ||
``` | ||
## 💡 Text buffer | ||
The Blessed library is deprecated (no longer supported) and has a number of technical limitations, such as cursor navigation in a text input field. For this reason, a mechanism for managing input text via text buffer has been implemented, which allows using a custom cursor for navigation using keyboard arrows and automatic scrolling for swiping. | ||
The Blessed library is outdated (no longer supported) and has a number of technical limitations, such as not being able to navigate the cursor in the input field. For this reason, a mechanism for managing input text via text buffer has been implemented, which allows using a custom cursor for navigation using keyboard arrows and automatic scrolling for swiping. | ||
@@ -76,6 +69,6 @@ If you plan to use this library for similar tasks where text input is required, then add `class TextBuffer` and control of `keypress` shortcuts to your code via `inputBox.on()`. | ||
- `Ctrl+<Q/W/E/R>` - copying translation results from output forms to the clipboard (for each translator, the key combination is indicated in brackets), and the selected form will change its color to green. | ||
- `Ctrl+V` - paste text from the clipboard (defined at the code level). | ||
- `Ctrl+<Q/W/E/R>` - copying translation results from output forms to the clipboard (for each translator, the key combination is indicated in brackets), and the selected form will change its color to green. | ||
- `Ctrl+Z`: Navigate through the history of translation requests from the end. | ||
@@ -82,0 +75,0 @@ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
1320923
1694
91