Перевод выделенного текста в Awesome с помощью Google Translate

Сейчас перехожу c Windows на AchLinux с Awesome и при поиске нужных инструментов наткнулся на следующую статью на Вики Awesome http://awesome.naquadah.org/wiki/TranslateIt/ru. Нужно выделить в любом окне мышкой текст, нажать горячие клавиши, и текст появляется в окне нотификации Awesome. Исходный текст можно вставить в нужное место средней клавишей мышки, а перевод - клавишами Ctrl-V или при помощи контекстного меню. При работе скрипта используются xclip, sed, awk, curl, iconv и html2text.

Попробовал использовать, но скрипт не работал. При вызове html2text происходила ошибка. Поправил этот вызов, но если переводимый текст был одной строкой, нотификация отображалась тоже одной строкой, а очень длинный текст обрывался. А если текст был много строчным или содержал кавычки или обратную косую черту, окно нотификации вообще не отображалось.
После исправления всех этих вещей получился такой скрипт

#!/bin/bash

text=$(xclip -o)
l_ source="auto"
   if [[ "$text" =~ ^[а-яА-ЯёЁ].* ]]
   then
     l_target="en"
    else
     l_target="ru"
    fi
result=$(curl --connect-timeout 10 -s -i --user-agent "" -d "sl=$l_source" -d "tl=$l_target" --data-urlencode "text=$text" https://translate.google.ru)
encoding=$(awk '/Content-Type: .* charset=/ {sub(/^.*charset=["'\'']?/,""); sub(/[ "'\''].*$/,""); print}' <<<"$result")
result=$(iconv -f $encoding <<<"$result" | awk 'BEGIN {RS="</div>"};/<span[^>]* id=["'\'']?result_box["'\'']?/' | html2text --unicode-snob )
echo "$result" | xclip -in -selection clipboard     #копируем перевод в буфер
result=$( echo "$result" | sed '/^$/d' | sed 's/\\/\\\\/g' | sed 's/\(.\{,100\}\b\)/&\\n/g' | awk '{printf "%s ", $0}' | sed 's/"/\\\"/g' )
echo "naughty.notify({title=\"Перевод: \", text=\" $result\", timeout = 40})" | awesome-client
exit

В rc.lua в назначение клавиш в секцию -- Standard program , нужно добавить следущее:

awful.key ({modkey, "Control"}, key_T, function ()  awful.util.spawn("Путь к  скрипту") end),

Я немного изменил способ вызова скрипта по сравнению с оригиналом (не вижу смысла передавать переводимый текст как параметр, когда его можно взять из буфера обмена), увеличил до 10 секунд время ожидания соединения с google (у меня во время отладки скрипта барахлил интернет), и увеличил время отображения перевода до 40 секунд. Длинный текст разбиваю на строки не более 100 символов.
.
.
.
Пересохранил для исправления форматирования. lampslave
xclip -o > /tmp/trans-ru
trans_text=`cat /tmp/trans-ru | sed -e 's/\r/ /g' | sed -e 's/&/ /g' | sed -e 's/;/ /g'`
trans_api=`wget -qO- https://translate.yandex.net/api/v1.5/tr.json/translate --post-data="key=$key_api_yandex&srv=tr-text&text=$trans_text&lang=ru&options=1" | cut -c 62- | sed -e 's/"]}/ /g'`

не панацея конечно, но вроде попроще...
Ошибки в тексте-неповторимый стиль автора©
Переводим с помощью Яндекс
gentux
Переводим с помощью Яндекс
Почитал я это и в итоге сварганил такое:
~/.bin/translate-en-ru
#!/bin/sh

text1="$(xclip -o | sed "s/[\"\'<>]//g")"
text2="en > ru:"

translate="$(xclip -o | trans \
-show-translation-phonetics n \
-show-original n \
-show-languages n \
-show-prompt-message n \
-show-dictionary n \
-show-alternatives n \
-no-ansi \
en:ru)"

notify-send -u low "$text2" "$translate"
PS. Чтобы не угарать каждый раз над опциями trans (aur/translate-shell), имеет смысл накрутить ей alias'ов в ~/.bashrc
Собственно нотификации работают через dunst (aur/dunst-git)

На хабре-то там поизгалялись, конечно, но как-то получается, что чем короче скрипт, тем длинее выхлоп ;)


- "...чтобы получить ваши ноги мокрые." ;)
Спасибо всем за советы, я немножко продвинулся в освоении linux и bash. Пока решил использовать trans (там можно использовать сервисы yandex, google или bing), а будет время, немного упрощу и доделаю первый скрипт и попробую использовать api перевода yandex (если получится, может сделаю виджет для переключения сервисов перевода), так как trans имеет недостатки. Получился такой скрипт:
!/bin/bash
   if [[ "$(xclip -o)" =~ ^.+?[а-яА-ЯёЁ]{5,}.*[а-яА-ЯёЁ]{5}.+ ]]
   then
     l_target="en"
    else
     l_target="ru"
    fi
case  $1 in
google|bing) service="$1";;
 *) service="yandex";;
esac
translate=`(xclip -o  | awk '{printf("%s " ,$0)}' | trans -b -e "$service" \
 :$l_target | sed 's/\(.\{,100\}\)\b/&\n/g')`
echo "$translate" | xclip -in -sel clip
notify-send -t 40000 "Перевод $service" "$translate"
В rc.lua в секцию определения переменных нужно добавить такую строку

translate_service="yandex"
а в определение клавиш - запуск скрипта, например:
    awful.key ({modkey, "Control"}, key_T, function () awful.util.spawn("/home/andrey/scripts/onlinetrans \"".. translate_service.. "\"",false) end),
и где-то раньше определить значение, если у вас не определено
key_T = "#28"

Если нужно переключить сервис перевода, введите такую команду
echo "translate_service='google'" |awesome-client
или translate_service='bing'
при любом другом значении, скрипт будет использовать yandex

Но я заметил, что для много- строчного текста trans выполняет обращение к сервису перевода для каждой строки, что очень существенно увеличивает время перевода, когда убрал переводы строки, оно уменьшилсь в разы (установил для проверки этого wireshark, но при запуске он не обнаружил ни lo ни enp2s0, а разбираться с его настройками пока нет времени)
Пока смотрю перевод слитным текстом, пока это устраивает, если не нравится, можно убрать команду awk, но перевод многострочного текста очень замедлится. Пробовал переводить файл, делал все по справке, но почему-то переводилось имя файла, а потом выводилась ошибка, что файл не найден.
может поможет, вот такой файлик на горячих кнопках для перевода текста выделенного (буфер)

#!/bin/sh
xclip -o | sed -r '2~1d;s/(^\s+|\s+$)//g;s/%/%25/g;s/#/%23/g;s/\$/%24/g;s/&/%26/g;s/\+/%2B/;s/$
awk '{print "translate.google.com/translate_t?hl=ru#en|ru|" $1}' | \
xargs firefox -new-tab
вот такой файлик для поиска в гугле текста выделенного (буфер)
#!/bin/sh
xclip -o | sed -r '2~1d;s/(^\s+|\s+$)//g;s/%/%25/g;s/#/%23/g;s/\$/%24/g;s/&/%26/g;s/\+/%2B/;s/$
 
Зарегистрироваться или войдите чтобы оставить сообщение.