Sway мелкие вопросы и твики, Переводчик горячей кнопке

Браузеры, почтовые клиенты, офисные пакеты, файловые менеджеры, редакторы и т.п.
Ответить
lnx
Сообщения: 152
Зарегистрирован: 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 08.07.2025 11:27, всего редактировалось 1 раз.
lnx
Сообщения: 152
Зарегистрирован: 24.08.2022

#

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

#

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

lnx
Сообщения: 152
Зарегистрирован: 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
Сообщения: 152
Зарегистрирован: 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
Аватара пользователя
Администрация
Сообщения: 844
Зарегистрирован: 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
Сообщения: 4
Зарегистрирован: 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
Сообщения: 152
Зарегистрирован: 24.08.2022

#

Arhei: ну и вызов скрипта по кнопке, прописываем в конфиге sway, кнопку естественно ставим свою
У меня в sway скрипт открывает окошко терминала и там ругается на шрифты. Если скрипта корректирую строку про шрифты (на имеющиеся) пишет в окне -е ш -с echo -n. Что-то где-то побилось при публикации скрипта?
lnx
Сообщения: 152
Зарегистрирован: 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
Сообщения: 4
Зарегистрирован: 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 передает не первичый буфер обмена, т.е. требуется контрл_с.
в первом фрагменте показанного вами скрипта использовался вторичный буфер.
но на самом деле тут кому как удобнее, кому первичный, а кому и вторичный
lnx
Сообщения: 152
Зарегистрирован: 24.08.2022

#

Arhei: # вывод перевода через терминал 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\""

Где именно, в какой документации я могу вычитать описание и форматы --override=pad="10x10 center"? ..... гугл меня водит по кругу, а полезного результата не дает. Хочу, чтобы это было справа.
Arhei
Сообщения: 4
Зарегистрирован: 04.07.2025

#

lnx:
Arhei:
# вывод перевода через терминал 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\""
Где именно, в какой документации я могу вычитать описание и форматы --override=pad="10x10 center"? ..... гугл меня водит по кругу, а полезного результата не дает. Хочу, чтобы это было справа.
у большинства правильных программ есть маны, откуда и можно подчеркнуть всю полезную информацию
маны можно смотреть через консоль
man программа
либо для удобства через тот же веб-интерфейс, арч кстати предоставляет такой интерфейс к тем манам программы которых есть в официальном репозитории, поиск манов можно начать отсюда https://man.archlinux.org/
например для терминал foot это будет
https://man.archlinux.org/man/foot.1
основной ман программы и вспомогательный для его конфига
https://man.archlinux.org/man/foot.ini.5.en
связанные маны с текущим обычно можно найти внизу в разделе SEE_ALSO
https://man.archlinux.org/man/foot.1#SEE_ALSO
итак разберёмся что же означает выражение
--override=pad="10x10 center" 
ключ --override относится к самой программе, смотрим его значение
-o,--override=[SECTION.]KEY=VALUE
Override an option set in the configuration file. If SECTION is not given, defaults to main.
то есть с помощью данного ключа мы можем сконфигурировать наш терминал напрямую минуя конфигурационный файл, при этом сами ключ=значение(KEY=VALUE) мы возьмём с описания конфига
pad
Padding between border and glyphs, in pixels (subject to output scaling), in the form XxY.

This will add at least X pixels on both the left and right sides, and Y pixels on the top and bottom sides. The grid content will be anchored in the top left corner. I.e. if the window manager forces an odd window size on foot, the additional pixels will be added to the right and bottom sides.

To instead center the grid content, append center (e.g. pad=5x5 center).

Default: 0x0.
грубо говоря, это центрирует нам информацию внутри терминала делая отступы от краёв на указанную величину.
lnx:Хочу, чтобы это было справа.
я так понимаю вы имеете в виду сам терминал и его позиционирование на экране ? если так то позиционированием окон заведует wayland, а терминал заведует только тем что у него внутри(шрифты, цвета, позиционирование текста ...)
в общем, позиционированием окна будет заниматься наместник богаwayland-а на земле - sway
поэтому смотрим его конфиги на наличие нужных параметров
man -k sway
вот кстати еще один вариант найти связанные маны
и так нам будет нужен конфиг sway
https://man.archlinux.org/man/sway.5.en
Размещение окна это по сути перемещение(move) его в заданную точку, беглый поиск по странице даст нам по сути два варианта:
первый
move position cursor|mouse|pointer
Moves the focused container to be centered on the cursor.
перемещение окна в позицию где находиться курсор
swaymsg for_window [app_id="foot-translate"] move position cursor
второй
move [absolute] position <pos_x> [px|ppt] <pos_y> [px|ppt]
Moves the focused container to the specified position in the workspace. The position can be specified in pixels or percentage points, omitting the unit defaults to pixels. If absolute is used, the position is relative to all outputs. absolute can not be used with percentage points.
можно указать позицию в пикселях(0 0 это верхний левый угол)
swaymsg for_window [app_id="foot-translate"] move position 50 100
или процентах
swaymsg for_window [app_id="foot-translate"] move position 75ppt 15ppt
lnx
Сообщения: 152
Зарегистрирован: 24.08.2022

#

Arhei: swaymsg for_window [app_id="foot-translate"] move position 50 100

или процентах
Превеликое спасибо за трепенье и помощь!

По мере обживания появляются и другие вопросы, которые, с Вашего позволения, здесь и задам.

Уведомления - тот же нетворкманагер висит до тыка. Наверняка где-то можно определить поведения типа "показывать столько-то" и при тыке переходить в программу (та же почта, телеграм и пр)?
vall
Аватара пользователя
Администрация
Сообщения: 844
Зарегистрирован: 09.08.2022

#

lnx:с Вашего позволения, здесь и задам.
Пожалуйста, откройте новую ветку в соответствующем разделе форума. Где Вы совершенно справедливо обсуждаете sway. Здесь можно оставить ссылку на продолжение обсуждения. Предварительно вернув первоначальное название темы.

Мы находимся сейчас в "Прикладные программы". И вроде бы вопрос с "переводчиком" решён. Нельзя всё мешать в одну кучу и без веских на то оснований переименовывать тему. При этом приступив к обсуждению вопросов, выходящих за рамки первоначально открытого. Тем более относящегося к другим разделам форума.

Благодарю за понимание.
Ответить