Илья Кобзев (vectorlin) wrote,
Илья Кобзев
vectorlin

Categories:

Перевод содержимого буфера обмена по горячей клавише при помощи сервиса google

Наткнулся на статью о работе с буфером обмена в Linux. Скрипт


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/,/%2C/g;s/:/%3A/g;s/;/%3B/g;s/=/%3D/g;s/\?/%3F/g;s/@/%40/g;s/\s/+/g' | awk '{print "translate.google.com/translate_t?hl=ru#en|ru|" $1}' | xargs firefox -new-tab

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


Немного погуглив, я совершенно случайно увидел страницу со скриптом вывода перевода в консоль. Еще одна особенность скрипта заключается в том, что можно выбирать направление перевода. Мне такой такой вариант кажется более гибким.


И вот, что из этого я вынес:

этот скрипт сохраняем под именем gctranslate.sh

#!/bin/bash
# access translate.google.com from terminal

help='translate <text> [[<source language>] <target language>]
if target missing, use DEFAULT_TARGET_LANG
if source missing, use auto'

# adjust to taste
DEFAULT_TARGET_LANG=en

if [[ $1 = -h || $1 = --help ]]
then
echo "$help"
exit
fi

if [[ $3 ]]; then
source="$2"
target="$3"
elif [[ $2 ]]; then
source=auto
target="$2"
else
source=auto
target="$DEFAULT_TARGET_LANG"
fi

result=$(curl -s -i --user-agent "" -d "sl=$source" -d "tl=$target" --data-urlencode "text=$1" http://translate.google.com)
encoding=$(awk '/Content-Type: .* charset=/ {sub(/^.*charset=["'\'']?/,""); sub(/[ "'\''].*$/,""); print}' <<<"$result")
#iconv -f $encoding <<<"$result" | awk 'BEGIN {RS="<div"};/<span[^>]* id=["'\'']?result_box["'\'']?/ {sub(/^.*id=["'\'']?result_box["'\'']?(>| [^>]*>)([ \n\t]*<[^>]*>)*/,"");sub(/<.*$/,"");print}' | html2text -utf8
iconv -f $encoding <<<"$result" | awk 'BEGIN {RS="</div>"};/<span[^>]* id=["'\'']?result_box["'\'']?/' | html2text -utf8
exit


а этот скрипт я вызываю горячей клавишей


#!/bin/bash

TEXT=$(xclip -o)
TRANSLATED_TEXT=$(gctranslate.sh "$TEXT" en ru)
if [ ${#TEXT} -lt 120 ]; then
notify-send "$TRANSLATED_TEXT"
else
echo "$TRANSLATED_TEXT" | zenity --title="Перевод" --text-info
fi


в нем, в зависимости от длины исходного текста отображается нотификационное сообщение, которое быстро читается и исчезает, или отображается в окне zenity, т.к. длинный текст дольше читается.


Для работы скрипта нужны пакеты notify-send, html2text и zenity. Скрипт тестировался на Ubuntu 10.04 LTS в GNOME.


Конечно и этот скрипт не лишен недостатков. И один из них наиболее очевиден: хотя, далеко не всегда приходится переводить с разных языков, в этом скрипте нет возможности интерактивного выбора направления перевода.

Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments