Переводим английский без Google

31 Янв
2012

После прочтения статьи о переводе выделенного текста мне захотелось предложить несколько модификаций скрипта.

Мне не понравилась зависимость возможности перевода от наличия доступа в сеть. К тому же, google translate порой предлагает довольно глупые варианты перевода. Как и автор, я попытаюсь использовать UNIX-way, связывая консольные утилиты командным интерпретатором. Переводить будем только с английского.

Преднастройка

Итак, нам понадобится словарь. Возьмём к примеру англо-русский словарь Мюллера. В Debian его можно установить командой:

sudo apt-get install mueller7-dict

Для перевода выделения нам понадобится xsel, для вывода на экран libnotify или zenity:

sudo apt-get install libnotify-bin xsel

Сразу скажу, что трюк взят из Викиучебника, поэтому часть скрипта переехала из него (возможно, при наличии консольной версии mueller скрипт был бы проще, но её я не нашёл).

Настройка

#!/bin/bash
totallines=20;
dict="/usr/share/opendict/dictionaries/plain/mueller7.dict.dz/file/mueller7.dict.dz";
string=$( xsel -o)
words=$( string )
len=$(echo "scale=0; $lines / ${#words[@]}" | bc -l)
txt=""

Строку с адресом словаря естественно нужно будет адаптировать под конкретную систему. В нашем уведомлении будет выводится перевод каждого выделенного слова максимальной общей «высотой» 20 строк.

Перевод

for word in "${words[@]}"; do
	word=`echo $word | sed -e 's/[A-Z]*/\L&/g;s/[,.;:]//g'`;
	txt="$txt$(zgrep -aA$len '^'$word'$' $dict | sed -e '/^$/d; 1s/^/ &/;/^[^ ]/,$d')"
done

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

Вывод на экран

Для вывода уведомления можно использовать libnotify или zenity:
if [ -z $txt ]; then exit; fi;
#zenity --notification --text="$txt"
notify-send "$txt"


Теперь можно перенести скрипт в директорию, содержащуюся в $PATH и назначить горячую клавишу любым удобным способом:
sudo chmod 777 ./mueller.sh && sudo mv ./mueller.sh /usr/bin/mue

-- for awesome, paste into awful.util.table.join:
awful.key({ modkey, }, "t", function () awful.util.spawn("mue") end)


Спасибо за внимание. С радостью приму замечания по улучшению скрипта.
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх