Переводчик в консоли или по горячей кнопке

Браузеры, почтовые клиенты, офисные пакеты, файловые менеджеры, редакторы и т.п.
Ответить
lnx
Сообщения: 155
Зарегистрирован: 24.08.2022

#

Коллеги, на старом форуме была такая тема. Я сколько-то лет использовал, прошив вызов скрипта по горячей кнопке.
Фрагмент начал скрипта -
### Вводная
langIn=en
langOut=ru
#translator=google # google, edeepl, yandex
#translator=edepel # google, edeepl, yandex
#translator=yandex # google, edeepl, yandex
translator=bing # google, edeepl, yandex

dscp=Xorg      # Wayland, Xorg # display server communications protocols
ui=zenity         # kdialog, zenity, cli
guiW=800
guiH=300
Title="$translator ${langIn}::${langOut}"
TextOutFile="$(mktemp -t translated.XXX)"
DIR=$(dirname $(readlink -e "$0"))

### Сохранение буфера в переменную
case $dscp in
    Wayland ) TextIn="$(wl-paste -n)" ;;
    Xorg    ) TextIn="$(xsel -o)"     ;;
esac

### Обращение к сервису перевода и запись ответа в файл
case $translator in
Не мог бы авто скрипта вылжить здесь его актуальную версию?
Депл с сего дня нас целой страной забанил, накопив с нас же словоформ и пр. статистик. Гугл за последние полгода настолько испоганил свой перевод, что ни в какие ворота не лезет. Мало ли кто прикрутил reverso или bind
lnx
Сообщения: 155
Зарегистрирован: 24.08.2022

#

может кто сумел прикрутить reverso?
indeviral
Аватара пользователя
Сообщения: 237
Зарегистрирован: 15.08.2022

#

Ошибки в тексте-неповторимый стиль автора©

lnx
Сообщения: 155
Зарегистрирован: 24.08.2022

#

В пакмане и ауре по слову искал, там было пусто. За наводку спасибо. Но не ставится, ругается на заивисмости стандартно -
This environment is externally managed
╰─> To install Python packages system-wide, try 'pacman -S
    python-xyz', where xyz is the package you are trying to
    install.

Но меня больше интересовала адаптация к изменившемуся миру автором же его же скрипта - наверняка ведь я проспал массу обновлений, рассчитывая на вечную работу почившего форума.
indeviral
Аватара пользователя
Сообщения: 237
Зарегистрирован: 15.08.2022

#

Скиньте целиком скрипт, посмотрим. Сомневаюсь, что он ещё у кого-то остался.

Ошибки в тексте-неповторимый стиль автора©

lnx
Сообщения: 155
Зарегистрирован: 24.08.2022

#


#!/usr/bin/env bash

# Зависимости
# ---------------------------------------
# xsel          - рaбота с буфером в Xorg
# wl-clipboard  - работа с буфером в Wayland
# jq            - работа с json в консоли
# kdialog       - графический диалог kde   [необязательно]
# zenity        - графический диалог gnome [необязательно]
#pacman -S zenity xsel wl-clipboard  jq

### Вводная
langIn=en
langOut=ru
translator=google # google, edeepl, yandex
#translator=edepel # google, edeepl, yandex
#translator=yandex # google, edeepl, yandex
#translator=bing # google, edeepl, yandex

dscp=Xorg      # Wayland, Xorg # display server communications protocols
ui=zenity         # kdialog, zenity, cli
guiW=800
guiH=300
Title="$translator ${langIn}::${langOut}"
TextOutFile="$(mktemp -t translated.XXX)"
DIR=$(dirname $(readlink -e "$0"))

### Сохранение буфера в переменную
case $dscp in
    Wayland ) TextIn="$(wl-paste -n)" ;;
    Xorg    ) TextIn="$(xsel -o)"     ;;
esac

### Обращение к сервису перевода и запись ответа в файл
case $translator in
    google )
                UrlTranslate="https://translate.googleapis.com/translate_a/single?client=gtx&dt=t&sl=${langIn}&tl=${langOut}"
                TextOutJson="$(curl -s -H "user-agent: Mozilla/5.0" --get "${UrlTranslate}" --data-urlencode "q=${TextIn}")"
                echo -n "${TextOutJson}" | jq -j '.[0] | .[] | .[0]' > "$TextOutFile"
                ;;
    bing )
                UrlTranslate="https://www.reverso.net/${TextIn}"
                echo -n "${TextOutJson}" | jq -j '.[0] | .[] | .[0]' > "$TextOutFile"
                ;;
    edeepl )
                data='{"jsonrpc":"2.0","method": "LMT_handle_jobs","params":{"jobs":[{"kind":"default","raw_en_sentence":"'"${TextIn}"'","raw_en_context_before":[],"raw_en_context_after":[],"quality":"fast"}],"lang":{"user_preferred_langs":["${langIn}","${langOut}"],"source_lang_user_selected":"'${langIn}'","target_lang":"'${langOut}'"},"priority":-1,"timestamp":1557063997314},"id":79120002}'
                HEADER=(
                  --compressed
                  -H 'Origin: https://www.deepl.com'
                  -H 'Referer: https://www.deepl.com/translator'
                  -H 'Accept: */*'
                  -H 'Content-Type: text/plain'
                  -H 'Accept-Language: en-us'
                  -H 'User-Agent: Mozilla/5.0'
                )
                curl -s 'https://www.deepl.com/PHP/backend/clientState.php?request_type=jsonrpc&il=EN' "${HEADER[@]}"--data-binary '{"jsonrpc":"2.0","method":"getClientState","params":{"v":"20180814"},"id":79120001}' >|/dev/null
                TextOutJson=$(curl -s 'https://www2.deepl.com/jsonrpc' "${HEADER[@]}" --data-binary $"$data")
                echo -n "$TextOutJson" | jq -j '.result.translations[0].beams[0].postprocessed_sentence' > "${TextOutFile}"
                 ;;
    yandex )
                ## https://translate.yandex.ru/developers/keys
                # apiKey='*************************************'
                apiKey="$(cat ${DIR}/yandexApiKey.txt)"
                UrlTranslate="https://translate.yandex.net/api/v1.5/tr.json/translate?key=${apiKey}&lang=${langIn}-${langOut}"
                # curl -s "${UrlTranslate}&text=Hello"
                TextOutJson="$(curl -s --get "${UrlTranslate}" --data-urlencode "text=${TextIn}")"
                echo -n "${TextOutJson}" | jq -j -r '.text[]' > "$TextOutFile"
                ;;
esac

### Сохранение перевода В буфер
case $dscp in
    Wayland ) wl-copy < "${TextOutFile}"    ;;
    Xorg    ) xsel -i -b < "${TextOutFile}" ;;
esac

### Вывод перевода через UI
case $ui in
    kdialog ) kdialog --title "${Title}" --geometry ${guiW}x${guiH}+${guiW}+${guiH} --textbox="${TextOutFile}";;
   zenity  ) zenity  --title "${Title}" --width=$guiW --height=$guiH --text-info --filename="${TextOutFile}";;
   # zenity  ) zenity   --width=$guiW --height=$guiH --text-info --filename="${TextOutFile}";;
    cli     ) cat "${TextOutFile}";; # вывод на консоль
esac

rm "${TextOutFile}"
exit 0


indeviral
Аватара пользователя
Сообщения: 237
Зарегистрирован: 15.08.2022

#

Посмотрел.
Bing в теории должен работать но нужно будет получать токен в Azure, а это лень. Далеко не факт что получится.
Reverso бесплатно не будет работать. Посмотрел api на js и python они уже устарели.
Deepl заблокирован.
Yandex требует получение Токена. Бесплатный имеет не адекватно низкое количество запросов в день.
LibreTranslater требует получение Токена. Только платный.
Все ai решения требуют платных токенов.

Так что пользуйтесь google..

Ошибки в тексте-неповторимый стиль автора©

vall
Аватара пользователя
Администрация
Сообщения: 843
Зарегистрирован: 09.08.2022

#

Перевод с помощью translate-shell

Установка пакета (посмотреть зависимости)
sudo pacman -S translate-shell
Пишем свой скрипт на bash, помещаете например /usr/local/bin/ и привязываете его к хоткеям:
sudo vim /usr/local/bin/my_translate2.sh
Для KDE на иксах
#!/usr/bin/env bash
a=`xsel -o | trans :ru -no-ansi -b`
echo -e "$a" > /tmp/kdetrans
kdialog 750 300 --title 'Перевод' --textbox /tmp/kdetrans
indeviral
Аватара пользователя
Сообщения: 237
Зарегистрирован: 15.08.2022

#

vall:translate-shell
На самом деле этот тот же самый скрипт который предоставил автор и если вы попытаетесь переключиться на bing или yandex без получения токен доступа у вас вряд-ли что-то получится. (Хотя такая возможность согласно докумениации есть)

Ошибки в тексте-неповторимый стиль автора©

Arhei
Сообщения: 6
Зарегистрирован: 04.07.2025

#

lnx: может кто сумел прикрутить reverso?
так а что там его прикручивать, через "веб" даже никакой защиты не стоит
вот накидал себе ради интереса такой вариант:
#!/usr/bin/env bash

# описание:     перевод выделенного текста и отображение его через терминал foot в sway
# зависимости:  sway foot wl-clipboard curl jq ttf-jetbrains-mono-nerd

LangDetect=true
LangIn=eng
LangOut=rus
TextIn="$(wl-paste --no-newline)"
TextOut=''

JsonOut="$(
curl -s 'https://api.reverso.net/translate/v1/translation' \
  --compressed \
  -X POST \
  -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0' \
  -H 'Accept: application/json, text/plain, */*' \
  -H 'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3' \
  -H 'Accept-Encoding: gzip, deflate, br, zstd' \
  -H 'Content-Type: application/json' \
  -H 'X-Reverso-Origin: translation.web' \
  -H 'Origin: https://www.reverso.net' \
  -H 'DNT: 1' \
  -H 'Sec-GPC: 1' \
  -H 'Connection: keep-alive' \
  -H 'Referer: https://www.reverso.net/' \
  -H 'Sec-Fetch-Dest: empty' \
  -H 'Sec-Fetch-Mode: cors' \
  -H 'Sec-Fetch-Site: same-site' \
  -H 'TE: trailers' \
  --data-raw "$(
  jq --null-input \
     --arg languageDetection "$LangDetect" \
     --arg from  "$LangIn" \
     --arg to    "$LangOut" \
     --arg input "$TextIn" \
  '{"format":"text","from":$from,"to":$to,"input":$input,"options":{"sentenceSplitter":true,"origin":"translation.web","contextResults":false,"languageDetection":$languageDetection}}')"
)"
TextOut="$(echo "$JsonOut" | jq --raw-output '.translation[]')"


# sway: правило для отображения окна по его app_id
swaymsg for_window [app_id="foot-translate"] floating enable
swaymsg for_window [app_id="foot-translate"] sticky   enable

# закрыть предыдущее окно по его app_id
_PID=$(swaymsg -t get_tree | jq -r '..|objects|select(.app_id == "foot-translate")| .pid')
[[ -n "$_PID" ]] && kill "$_PID"

# вывод перевода через терминал foot
foot \
	--hold \
	--app-id=foot-translate \
	--font="JetBrainsMono:size=16" \
	--window-size-chars=60x10 \
	--override=pad="10x10 center" \
	-e sh -c "echo -n \"$TextOut\""

ну и вызов скрипта по кнопке, прописываем в конфиге sway, кнопку естественно ставим свою
bindsym KP_Add exec путь/к/скрипту
indeviral
Аватара пользователя
Сообщения: 237
Зарегистрирован: 15.08.2022

#

Arhei: так а что там его прикручивать, через "веб" даже никакой защиты не стоит
Прикольно.
Как такого описания официального api не нашёл.
Я посмотрел что api на python стучится сюда https://context.reverso.net/bst-query-service. Потыкался и бросил.
А то что там всё прозрачно даже не подумал :hyster:

Ошибки в тексте-неповторимый стиль автора©

lnx
Сообщения: 155
Зарегистрирован: 24.08.2022

#

Arhei: ну и вызов скрипта по кнопке, прописываем в конфиге sway, кнопку естественно ставим свою
У меня в sway скрипт открывает окошко терминала и там ругается на шрифты. Если скрипта корректирую строку про шрифты (на имеющиеся) пишет в окне -е ш -с echo -n. Что-то где-то побилось при публикации скрипта?
lnx
Сообщения: 155
Зарегистрирован: 24.08.2022

#

Arhei:TextOut=''
Убрал зависимость от шрифта, указав просто Mono (джетбрайнов шрифт просит больше 100 метров на диске). Если двойной апостроф заменить на двойные кавычки - работает. Но wl-paste --no-newline передает не первичый буфер обмена, т.е. требуется контрл_с. Соответственно проправил строку на -
TextIn="$(wl-paste --primary --no-newline)"
БОльшое спасибо за скриптик!
#!/bin/bash

# описание:     перевод выделенного текста и отображение его через терминал foot в sway
# зависимости:  sway foot wl-clipboard curl jq 

LangDetect=true
LangIn=eng
LangOut=rus
TextIn="$(wl-paste --primary --no-newline)"
TextOut=""

JsonOut="$(
curl -s 'https://api.reverso.net/translate/v1/translation' \
  --compressed \
  -X POST \
  -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0' \
  -H 'Accept: application/json, text/plain, */*' \
  -H 'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3' \
  -H 'Accept-Encoding: gzip, deflate, br, zstd' \
  -H 'Content-Type: application/json' \
  -H 'X-Reverso-Origin: translation.web' \
  -H 'Origin: https://www.reverso.net' \
  -H 'DNT: 1' \
  -H 'Sec-GPC: 1' \
  -H 'Connection: keep-alive' \
  -H 'Referer: https://www.reverso.net/' \
  -H 'Sec-Fetch-Dest: empty' \
  -H 'Sec-Fetch-Mode: cors' \
  -H 'Sec-Fetch-Site: same-site' \
  -H 'TE: trailers' \
  --data-raw "$(
  jq --null-input \
     --arg languageDetection "$LangDetect" \
     --arg from  "$LangIn" \
     --arg to    "$LangOut" \
     --arg input "$TextIn" \
  '{"format":"text","from":$from,"to":$to,"input":$input,"options":{"sentenceSplitter":true,"origin":"translation.web","contextResults":false,"languageDetection":$languageDetection}}')"
)"
TextOut="$(echo "$JsonOut" | jq --raw-output '.translation[]')"


# sway: правило для отображения окна по его app_id
swaymsg for_window [app_id="foot-translate"] floating enable
swaymsg for_window [app_id="foot-translate"] sticky   enable

# закрыть предыдущее окно по его app_id
_PID=$(swaymsg -t get_tree | jq -r '..|objects|select(.app_id == "foot-translate")| .pid')
[[ -n "$_PID" ]] && kill "$_PID"

# вывод перевода через терминал foot
foot \
	--hold \
	--app-id=foot-translate \
	--font="Mono:size=12" \
	--window-size-chars=60x10 \
	--override=pad="10x10 center" \
	-e sh -c "echo -n \"$TextOut\""


Arhei
Сообщения: 6
Зарегистрирован: 04.07.2025

#

lnx:
Arhei: TextOut=''
Если двойной апостроф заменить на двойные кавычки - работает.
в данном случае тут вообще без разницы, хоть одинарные, хоть двойные, хоть вообще без кавычек, результат будет один - пустая строка
sh-5.2$ TextOut=''; [[ -z "$TextOut" ]] && echo "Empty string" || echo "Not empty string"
Empty string
sh-5.2$ TextOut=""; [[ -z "$TextOut" ]] && echo "Empty string" || echo "Not empty string"
Empty string
sh-5.2$ TextOut=; [[ -z "$TextOut" ]] && echo "Empty string" || echo "Not empty string"
Empty string
lnx: У меня в sway скрипт открывает окошко терминала и там ругается на шрифты.
...
Убрал зависимость от шрифта, указав просто Mono (джетбрайнов шрифт просит больше 100 метров на диске).
да можно вообще по дефолту использовать шрифт и не париться, но часто имея дело с текстовой информацией хочется чтобы глаз радовался.
Но здесь и в правду перебор, глифы(*-nerd) в переводе не нужны
$ pacman -Qi ttf-jetbrains-mono-nerd | grep размер
Установленный размер : 222,51 MiB
можно обойтись и чистой версией
$ pacman -Qi ttf-jetbrains-mono | grep размер
Установленный размер : 7,44 MiB
lnx: Но wl-paste --no-newline передает не первичый буфер обмена, т.е. требуется контрл_с.
в первом фрагменте показанного вами скрипта использовался вторичный буфер.
но на самом деле тут кому как удобнее, кому первичный, а кому и вторичный
Ответить