Перевод с помощью translate.google.ru и notify-osd

/www/pages/modesco/ubuntovod

Хочу поделиться с вами своим лайфхаком. В первую очередь он предназначен для людей, которым лень лезть в словарь всякий раз, когда они встречают незнакомое иностранное слово в тексте.

Я хочу рассказать, как получить перевод выделенного текста в виде оповещения рабочего стола. 

У многих десктопных "словарей" есть функция для перевода выделения, которая как раз и предназначена для того, чтобы «не лазить в словарь», но почему-то у меня всегда были с ней проблемы: не переводит, когда нужно; переводит, когда не нужно и так далее.

Наверняка, многие из вас видели различные скрипты для использования google translate из консоли, но я считаю этот способ неудобным в большинстве случаев, не смотря на то, что предпочитаю CLI.

Я подумал, что неплохо было бы иметь возможность быстро переводить выделенный текст или слово и видеть результат, в виде оповещения рабочего стола. Остаётся только совместить google translate cli + selections + notifications.

Решение

Очень простой интерфейс для отправки уведомлений из консоли предоставляет утилита notify-send, которую можно найти в пакете libnotify-bin. Пример:

notify-send `title` `message`

Даст следующий результат:

Для получения текущего выделения в X Window System используется утилита xsel.

xsel -o

Выведет текущий selection в стандартный поток вывода.

Шаг 1

Устанавливаем необходимые пакеты:

sudo apt-get install libnotify-bin xsel

Я уверен, что каждый знает, как устанавливать пакеты в своей системе, поэтому не привожу примеры.

Шаг 2

Создаём файл с именем seltr и копируем в него следующие 2 строки:

1
2
#!/usr/bin/env bash
notify-send -u critical "$(xsel -o)" "$(wget -U "Mozilla/5.0" -qO - "http://translate.google.com/translate_a/t?client=t&amp;text=$(xsel -o | sed "s/["`<>]//g")&amp;sl=auto&amp;tl=ru" | sed `s/[[["//` | cut -d " -f 1)"

Параметр -u critical нужен для того, чтобы оповещение могло перекрывать любые окна.

Параметры запроса google translate:

  • text=$(xsel -o | sed "s/["`]//g") - исходный текст - текущий selection с вырезанными ` и "
  • sl=auto - автоопределение исходного языка
  • tl=ru - язык результата - русский

Шаг 3

Делаем этот файл исполняемым и перемещаем его в /usr/bin/:

sudo chmod 777 ./seltr && sudo mv ./seltr /usr/bin/

Шаг 4

Теперь остаётся назначить комбинацию клавиш на команду seltr (мой выбор - alt+5). Для этого можно воспользоваться стандартными сердствами, которые предоставляет ваша рабочая среда, либо использовать xbindkeys.

Как это работает:

  • Выделяем какой-нибудь иностранный текст(на любом языке), в любом окне
  • Нажимаем alt+5
  • Получаем перевод

Немного скриншотов

Английский

Немецкий

Французский

Украинский

Китайский

Плюсы такого метода:

  • Возможность переводить фрагменты текста
  • Требуется минимальное количество действий для получения перевода
  • Поддержка практически всех языков
  • Отсутствие необходимости в установке отдельных словарей

Минусы:

  • Не работает без подключения к интернету
  • Нет возможности выделить текст перевода

Проверенно в Unity, GNOME2, Xfce4 и KDE4.

Источник: habrahabr.ru.

Так же приведу другой вариант скрипта, который делает всё то же самое, но плюс ещё копирует перевод в буфер обмена.

1
2
3
4
5
#!/usr/bin/env bash
text="$(xsel -o)"
translate="$(wget -U "Mozilla/5.0" -qO - "http://translate.google.com/translate_a/t?client=t&amp;text=$(xsel -o | sed "s/["`<>]//g")&amp;sl=auto&amp;tl=ru" | sed `s/[[["//` | cut -d " -f 1)"
echo "$translate" | xclip -selection clipboard # копировать перевод в буфер
notify-send -u critical "$text" "$translate" # вывести уведомление

Приятного пользования.

Любите кофе? Приобретите себе Кофейные автоматы и наслаждайтесь данным напитком каждый день.

Александр Осадчук
2012-02-03 02:58:00
ты надоел уже создавать копипастовые статьи. сейчас опять плакать будешь, что ссылку на первоисточник опубликовал??? закрой свой блог, он не нужен, только новости в твитере засерает!!!
Sk8er
2012-02-03 04:37:00
гуляй. это ты засераешь мир своим существованием
mozgas
2012-02-03 22:04:00
 "Перевод текста с помощью notify-osd" Я и не знал что нотифи обзавелся фунцией перевода. Жжоте. Переводит гугл транслейт, а нотифи только выводит результат перевода. Поправьте заголовок, уж больно неправильно звучит.
mozgas
2012-02-03 22:04:00
 "Перевод текста с помощью notify-osd" Я и не знал что нотифи обзавелся фунцией перевода. Жжоте. Переводит гугл транслейт, а нотифи только выводит результат перевода. Поправьте заголовок, уж больно неправильно звучит.
Sk8er
2012-02-03 23:38:00
Самому не нравилось. Поправил
Rover
2012-02-04 03:31:00
 Спасибо! Очень полезная статья!
grafin99
2012-02-04 11:39:00
можно сделать так, что б одним скриптом делать разные переводы запуская скрипт seltr ru seltr en и строку перевода модифицировать как &amp;sl=auto&amp;tl=${1}" и у меня в xubuntu сообщение висело постоянно поэтому параметрыnotify-send -u critical заменил наnotify-send -t 500   #висит 5 сек
Dok
2012-02-06 01:26:00
это точно ваша статья? Т.е. http://habrahabr.ru/users/boo1ean/ это Вы?
Sk8er
2012-02-06 22:27:00
Я и не писал, что статья моя. Обратите внимание на источник
Ubuntuuser 11.10
2012-02-09 01:42:00
Прошу всяким троллям заткнуться и помолчать. Автор все путем! не слушай этих говноедов, спасибо за вашу работу предостовлять инфу! Нет не просто инфу а качественную которые реально полезные!!! Спасибо! А тролли пусть идут на "№@Sk8er72:disqus !
Sk8er
2012-02-09 13:48:00
спасибо :)
Anton Z
2013-02-05 20:51:00
#!/usr/bin/env bash text="$(xsel -o)" translate="$(wget -U "Mozilla/5.0" -qO - "http://translate.google.com/translate_a/t?client=t&amp;text=$(xsel -o | sed "s/["']//g")&amp;sl=auto&amp;tl=ru" | sed 's/[[["//' | cut -d " -f 1)" echo "$translate" | xclip -selection clipboard # копировать перевод в буфер notify-send -u critical "$text" "$translate" # вывести уведомление
Гость
2014-08-26 13:54:00
Не работает уже (
Ub Unta
2016-03-08 10:30:00
Необходимо подправить получение перевода, у меня вот так работает: #!/usr/bin/env bash text="$(xsel -o)" translate="$(curl -s -A "Mozilla/5.0" "https://translate.google.ru/" --data-urlencode name=content -d "sl=auto&amp;tl=ru&amp;js=n&amp;ie=UTF-8&amp;text=$text" | xmllint --html --xpath "id('result_box')" - 2&gt;/dev/null | sed -e 's//n/g' -e 's/]+&gt;//g')" notify-send -u critical "$text" "$translate" Вкратце суть: исходный текст берется из выделения через xsel. Затем засылается на страницу перевода через url вместе с параметрами перевода. Потом из полученной страницы ответа с помощью xmllint вычленяется тег с результатом перевода, ошибки парсинга перенаправляем в /dev/null. Но результат содержит вложенные теги, поэтому заменяем на символ новой строки "n", а остальные теги обрезаем с помощью sed.