Перевод выделенного текста из любой программы на linux

На прошлой недели я наткнулся на программу для windows, которая использовала для перевода текста гугл транслейт. Достаточно выделить текст в любом окне, нажать комбинацию клавиш и перевод готов (P.S.: эту программу можно найти на dicter.ru). Принцип работы показался очень простым и я решил на выходных написать свой собственный скрипт. Однако меня опередили. В конце недели выложили в сеть скрипт, который умеет сам определять язык исходного текста и переводить его на русский (или любой другой язык), используя переводчик гугла, а результат появляется во всплывающем уведомлении. Так что эта статья будет просто пересказ статьи с хабра (этой) с небольшими дополнениями и изменениями.

В начале установим необходимый софт, что бы всё работало:

sudo apt-get install xclip

Вот и всё. Так же нам понадобится программа для отправки уведомлений… В гном это libnotify-bin (уже установлена по умолчанию… обычно), а в kde — kdialog… и она тоже должна быть изначально.

Затем создаём текстовый документ в любом удобном для себя месте (лично мне удобней в папке ~/bin), и помещаем в него следующий текст…

Данный вариант рассчитан на gnome (unity и всякие xfce тоже подходят) пользователей:

#!/bin/bash
a=`wget -U "Mozilla/5.0" -qO - "http://translate.google.com/translate_a/t?client=t&text=$(xclip -o | sed "s/[\"'<>]//g")&sl=auto&tl=ru" | sed 's/\[\[\[\"//' | cut -d \" -f 1`
notify-send -u critical "$a"
echo $a | xclip -selection clipboard

KDE вариант будет выглядеть так:

#!/bin/bash
a=`wget -U "Mozilla/5.0" -qO - "http://translate.google.com/translate_a/t?client=t&text=$(xclip -o | sed "s/[\"'<>]//g")&sl=auto&tl=ru" | sed 's/\[\[\[\"//' | cut -d \" -f 1`
kdialog --title "Перевод" --passivepopup "$a"
echo $a | xclip -selection clipboard

KDE вариант не тестировал, так что возможно он не совсем точен.

Оригинальный скрипт, который использован в статье на хабре выглядит так:

#!/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&text=$(xsel -o | sed "s/[\"'<>]//g")&sl=auto&tl=ru" | sed 's/\[\[\[\"//' | cut -d \" -f 1)"

Во всех трёх вариантах следует обратить внимание на «sl=auto&tl=ru». Здесь «auto» обозначает, что язык исходного текста гугл будет пытаться определить сам, а «ru» отвечает за язык полученного перевода. Если вам нужен, например, английский, то поставьте «en» за место «ru».

Мой вариант отличается тем, что использует xclip заместо xsel, что позволяет загонять перевод в буфер обмена (т.е. появляется и уведомление и он же будет у вас в буфере обмена… удобно если нужно кому-то его отправить).
Так же первый вариант не показывает оригинальный текст во всплывающем уведомлении. Имхо, это никому не нужно.

Когда вставите понравившийся вам код, то не забудьте сохранить файл и сделать его исполняемым. Это можно сделать в его свойствах или выполнив команду:

chmod +x /путь/к/файлу

Остаётся привязать его к комбинации клавиш. Для этого можно воспользоваться программой xbindkeys (узнал о ней из оригинальной статьи). Или воспользоваться стандартными методами самой системы. в mint и ubuntu — это «клавиатура».


Как видно, я назначил комбинацию — Alt+A.

Теперь достаточно выделить какой-либо фрагмент текста и нажать нужную комбинацию и перевод не заставит себя долго ждать.

Так же перевод поместился и в буфер обмена и его можно достать, нажав ctrl+c. А само уведомление будет висеть, пока по нему не кликнешь. Это происходит благодаря флагу «-u critical». Если не нравится, то можно его стереть.

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

 

 

Поделись статьёй с друзьями

Или просто поиграйся с кнопочками

20 комментариев на «Перевод выделенного текста из любой программы на linux»

  1. Gespenst:

    А на кедах будет работать? Переводчиком пользуюсь оооочень часто.

    • Zegi:

      Код, который воложен для кед, должен работать. Если нет, то можно попробовать открыть терминал, выделить текст мышкой и запустить скрипт, чтобы узнать в чём ошибка

  2. nic11:

    переводчиком обычно не пользуюсь, но из статьи узнал кое-что новое=)

    P.S. зачем Ctrl+D на сви (а что это?)? он же посылает в консольку EOF (на баше вызывает exit).

  3. nub:

    Если в системе нет Мозиллы, а только Хромиум будет ли работать скрипт? Спрашиваю потому, что не получилось запустить в Лубунту.

    • Zegi:

      wget -U "Mozilla/5.0"
      «-U, —user-agent=АГЕНТ идентифицировать себя как АГЕНТ вместо Wget/ВЕРСИЯ»
      Это он просто прикидывается этим браузером. Например, можно заменить вышеописанную строчку на wget -U "Konqueror" и тоже будет работать (только что проверил, а этого брузера у меня нет).
      А что бы понять, что именно скрипту не нравится, можно запустить его из терминала (./имя_скрипта). Только предварительно нужно выделить в самом терминале любой текст мышкой, лучше английский. Для этого можно послать команду: echo "Hello, word" :)

  4. nub:

    :~$ «Hello, word»
    Hello, word: команда не найдена
    :~$ cd .bin
    :~/.bin$ ls
    kuku kukushka.wav translate
    :~/.bin$ translate
    Программа ‘translate’ на данный момент не установлена. Вы можете установить ее, напечатав:
    sudo apt-get install translate
    :~/.bin$ блин
    блин: команда не найдена
    Что я делаю не так?

    • Zegi:

      :)
      Синтаксис командной строки примерно следующий: команда опции ключи
      Например, если просто отправить «Hello, word» или "блин", то терминал будет искать эту команду в папках /bin, /usr/bin и подобных.
      Если после команды идёт пробел, то он подключает опции.
      Например, cd .bin . cd — команда перехода, а .bin — папка (причём скрытая, раз начинается с точки).
      А сочетание символов ./ обозначает, что он попытается запустить файл (аналог двойного клика по exe файлу в windows). значит нужно писать не translate, а ./translate . И ещё, файл нельзя выполнить, если у него нет соответствующих прав. Что бы их дать можно выполнить команду: chmod +x translate
      А в первом случае вы echo забыли.
      Конечно, то что я написал выше не совсем точно и красноглазики могут взбунтоваться, но имхо, для новичков должно быть понятное объяснение :)

  5. nub:

    Заработало!
    Большое человеческое спасиба!

  6. nub:

    Еще не все выяснил. :) Подскажите как путь прописать до скрипта для запуска с комбинации клавиш?
    translate пере назвал в perevodilka. Мой /home/asa/.bin/perevodilka не срабатывает и /home/asa/.bin/./perevodilka тоже.

  7. nub:

    Все работает вопрос снят, сам не туда писал ))
    Спасибо!

  8. Да тут одни спецы походу=) Одно название блога у меня уже мурашки вызывает=)

    • Zegi:

      Ну, именно на «спецов» и был расчёт, когда создавался блог. Кстати, за неделю до появления первой статьи я даже не знал, что такое bash… точнее, думал, что это цитатник :)

  9. Ilya:

    Работает на Unity отлично,спасибо очень хорошая статья.

  10. anon:

    http://pastebin.com/kPTYjY6W
    удобный переводчик, в основном преднозначенный для перевода с английского и для тех кто изучает английский!
    статью не читал.

  11. Oleg:

    Произошла ошибка при запуске программы transya:

    Не удалось выполнить процесс-потомок «transya» (Нет такого файла или каталога)

    В чем тут дело ?

  12. Спасибо за скрипт, использовал больше года без проблем. Правда, в последние пару месяцев он начал работать с переменным успехом (порой перевод появляется только после 3-4 нажатий).

    А на днях переустановил Ubuntu и перевод выделенного текста совсем перестал работать (естественно, сам скрипт я снова положил и клавиши назначил). Видно, что комбинация срабатывает, а уведомление с переводом не появляется. То ли я чего не доставил, то ли у Google Translate поменялись алгоритмы.

    У вас скрипт по-прежнему работает?

Добавить комментарий