/ Статьи / Пользова­тельское / Консольный переводчик в Linux. Перевод текста в консоли. /

Консольный переводчик в Linux. Перевод текста в консоли.

Дата публикации: April 4, 2010, 2:51 p.m.
Теги: переводчик, консоль,
Автор: Brainsburn

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

Несколько минут гугления хватило, чтобы понять - из консольных утилит есть только translate из библиотеки libtranslate. Последняя версия libtranslate была выпущена аж в 2005м году, однако многое от нее не требуется - лишь умение работать с онлайновыми переводчиками. Libtranslate умеет работать со многими переводчиками
$ translate --list-services
babelfish (Babel Fish)
systran (SYSTRAN)
google (Google)
freetranslation (FreeTranslation)
worldlingo (WorldLingo)
1800translate (1-800-Translate)
tsunami (Tsunami)
kataku (Kataku)
papiamentu (Papiamentu)
talkfilters (GNU Talk Filters)
Однако, с тем же Google Translate ее дефолтный конфиг не будет работать - у гугла уже изменилась страничка переводчика и translate не сможет пропарсить результат. В принципе, все что нужно, можно настроить в файле /usr/share/libtranslate/services.xml , даже добавить новые онлайн переводчики.

Я использую только Google Translate, просто потому что привык к нему. Работает libtranslate так:
$ echo "hello my friend" | translate -f en -t ru
Привет, мой друг
Можно указать ей переводить текст через гугл:
$ echo "Здравствуйте, я - Ваша тетя" | translate -f ru -t en -s google
Hello, I'm - your Aunt
Если с опцией -s google вы увидели результат перевода - радуйтесь - ваш /usr/share/libtranslate/services.xml уже обновлен должным образом. Если нет - надо его слегка подредактировать, чтобы libtranslate смог работать с google translate
Откройте файл /usr/share/libtranslate/services.xml , найдите там
  <service nick="Google" name="google">
    <group>
      <language to="*" tag="en"/>
      <language to="en,de" tag="fr"/>
      <language to="en,fr" tag="de"/>
      <language to="en" tag="it"/>
      <language to="en" tag="pt"/>
      <language to="en" tag="es"/>
      <text-translation url="http://www.google.com/translate_t?text=${text:escape}&amp;langpair=${from}|${to}&amp;ie=utf8&amp;oe=utf8">
        <pre-marker text="&lt;textarea"/>
        <pre-marker text="&gt;"/>
        <post-marker text="&lt;/textarea&gt;"/>
      </text-translation>
      <web-page-translation url="http://www.google.com/translate_c?u=${url:escape}&amp;langpair=${from}|${to}"/>
    </group>
  </service>
и замените на
 <service nick="Google" name="google">
    <group>
      <language to="*" tag="en"/>
      <language to="en,de" tag="fr"/>
      <language to="en,fr" tag="de"/>
      <language to="en" tag="it"/>
      <language to="en" tag="pt"/>
      <language to="en" tag="es"/>
      <language to="en" tag="pt"/>
      <language to="en" tag="ru"/>
      <language to="en" tag="zh"/>
      <language to="en" tag="zh-TW"/>
      <language to="en" tag="ja"/>
      <language to="en" tag="ko"/>
      <language to="en" tag="ar"/>
      <text-translation url="http://www.google.com/translate_t?text=${text:escape}&amp;langpair=${from}|${to}&amp;ie=utf8&amp;oe=utf8">
	<pre-marker text="id=result_box"/>
	<pre-marker text="mouseover"/>
	<pre-marker text="&gt;"/>
	<post-marker text="&lt;br&gt;"/>
      </text-translation>
      <web-page-translation url="http://www.google.com/translate_c?u=${url:escape}&amp;langpair=${from}|${to}"/>
    </group>
  </service>
Теперь все должно работать. Однако, такой синтаксис программы довольно утомителен, если вам нужно перевести не файл или веб-страницу, а простой скопированный кусочек текста. Чаще всего у меня возникает необходимость что-то перевести с английского на русский или наоборот; другие языки я почти не использую. Поэтому, я сделал 2 скриптика - для перевода с русского на английский и наоборот. Создайте файл с именем genru (Google from EN to RU) и добавьте в него следующие строки:
#!/bin/bash
echo $@ | translate -f en -t ru -s google | sed 's/<[^>]*>//g'
Этот скрипт будет переводить с англ. на русский. Создайте файл с именем gruen (Google from RU to EN) и добавьте в него следующие строки:
#!/bin/bash
echo $@ | translate -f ru -t en -s google | sed 's/<[^>]*>//g'
Этот скрипт будет переводить с русского на английский. Можно было сделать один скрипт, которому в качестве аргументов передавать, с какого на какой язык переводить, но я специально сделал два скрипта, для сокращения набираемого текста.
Не забудьте дать этим скриптам права на исполнение:
$ chmod +x genru gruen
Теперь, скопируйте их в /usr/
# cp gruen genru /usr/local/bin
Все. Теперь у вас есть достаточно удобный и простой консольный переводчик текста, использующий Google Translate и переводящий с английского на русской и наоборот.
$ gruen Она прекрасна - эта розовая веселящая сингулярность радужных псевдо-плазмоидов
'It's beautiful - this rosy joy-making singularity rainbow pseudo-plasmoids'
$ genru google translate works in console!
Google Translate работает в консоли!

PS: используйте 'одинарные кавычки', если в тексте содержится восклицательный знак, иначе получите ошибку -bash: !: event not found

UPDATE: Скрипт был немного обновлен. Теперь можно вводить текст без кавычек, со знаками препинания. Единственное - в тексте не должно быть "!?", иначе bash вставит команды из хистори (если знаете, как этого избежать, отпишитесь в комментах пжлст).

UPDATE2: В комментах выложен способ перевода без libtranslate:
Файл gruen:
wget -qO- "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=${@}&langpair=ru|en" | sed 's/.*"translatedText":"\([^"]*\)".*}/\1\n/';
Файл genru:
wget -qO- "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=${@}&langpair=en|ru" | sed 's/.*"translatedText":"\([^"]*\)".*}/\1\n/';





Возможно, эти материалы Вас заинтересуют:


Рекомендовать эту страницу:

Комментарии:(19)

# === May 13, 2010, 3:11 p.m.
спасибо

# Алексей June 21, 2010, 10:25 p.m.
Большое спасибо, очень нужно :)

# Алексей June 22, 2010, 11:22 a.m.
Работает отлично, только для убунты команда не translate, а translate-bin


# kapas Dec. 31, 2010, 11:19 p.m.
Замутить конфиг xml для translate.ru

# OdNairy Feb. 19, 2011, 1:18 p.m.
Отличное решение, вот только я бы в скрипте использовал параметр $@ вместо $1 - что позволило бы мне не расставлять кавычки и не загонятся на наличие восклицательного знака

# Brainsburn Feb. 19, 2011, 1:41 p.m.
OdNairy, точно, спасибо за совет!

# Марк April 8, 2011, 12:04 p.m.
Да, если не использовать пунктуацию - то этот способ безусловно хорош. А если, к примеру, необходимо перевести маленький текст, в котором будут "!" "?" "'" "."? У меня Ubuntu, в echo пробовал параметры $@ и $1. При использовании $1 - переводит только первый аргумент, а вот если поментять на $@ - то перевод работает, но на каждый из знаков пунктуации он жутко материться в виде пары строк html кода с тегами <span>. Грубо говоря, мне надо перевести hello! my friend. На что получаю:
"Привет! </span><span title="my friend.'" onmouseover="this.style.backgroundColor='#ebeff9'" onmouseout="this.style.backgroundColor='#fff'">мой друг ".

# Brainsburn April 8, 2011, 8:11 p.m.
Да, это уже сама libtralslate, видимо, устарела:
echo Привет! Пока... | translate -f ru -t en -s google

Hi! </span><span title="Пока..." onmouseover="this.style.backgroundColor='#ebeff9'"

# Марк April 8, 2011, 8:49 p.m.
Brainsburn, а что такое onmouseover. Всмысле, что он делает? Кстати, может есть альтернатива google? Я другие не пробовал, есть ли смысл искать, или гугл лучший

# Brainsburn April 8, 2011, 9:03 p.m.
Марк, я немного обновил скрипты. Теперь из текста удаляются все html-теги, так что можно писать без кавычек и со знаками препинания. Главное, чтобы в тексте не было '!?'.
Onmouseover это из html. Событие, когда наводишь курсор на текст.
translate.ru , кстати, намного лучший переводчик. Гугл иногда полный бред выдает :) Особенно это видно на художественных текстах.

# Brainsburn April 8, 2011, 9:10 p.m.
Собственно, guest дал ссылку на лучший способ (не требуется никаких libtranslate), за что ему большое спасибо.
Например, файл gruen будет выглядеть так:
wget -qO- "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=${@}&langpair=ru|en" | sed 's/.*"translatedText":"\([^"]*\)".*}/\1\n/';

а genru - так:
wget -qO- "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=${@}&langpair=en|ru" | sed 's/.*"translatedText":"\([^"]*\)".*}/\1\n/';

# Марк April 8, 2011, 9:59 p.m.
Спасибо! Щас попробую... Я на ссылку guest не обратил внимания.

Вот мне как раз иногда худ. тексты нужно переводить, ну или что-то из этого жанра, только не большого объема и главное не хочу обойтись без удобства переводить прямо в консоли. Не охото по другому, через лишнии "телодвижения", когда есть такой простой способ. А на счет translate.ru я то же подумываю, ток services.xml надо грамотно оформить))

# jerr May 7, 2011, 11:41 p.m.
хоть и привели универсальные ссылки без libtransate, но все же с знаками там проблемки возникают.
лично я не стал плодить кучи исполняемых файлов, так как подобных "удобняшек" много достаточно и потому реализовал приведенные примеры как функции в .bashrc. Спасибо за статью. Вот мой пример:
function en2rus()
{
if ; then
echo -e "translate from english to russian by Google\n";
echo "$@" | translate -f en -t ru -s google;
else
echo -e "nothing to translate";
fi
}
function rus2en()
{
if ; then
echo -e "translate from russian to english by Google\n";
echo "$@" | translate -f ru -t en -s google;
else
echo -e "nothing to translate";
fi
}

# Гость May 7, 2011, 11:44 p.m.
сори не прочитал про оформления кода

{
if [ ! -z $1 ]; then
echo -e "translate from english to russian by Google\n";
echo "$@" | translate -f en -t ru -s google;
else
echo -e "nothing to translate";
fi
}
function rus2en()
{
if [ ! -z $1 ]; then
echo -e "translate from russian to english by Google\n";
echo "$@" | translate -f ru -t en -s google;
else
echo -e "nothing to translate";
fi
}

# Brainsburn May 8, 2011, 12:34 a.m.
Да ничего, всеравно в модуле, который я использую для подсветки кода, дефолтный стиль оформления отличается только тем, что не убирает пробелы. Надо бы стиль "bash" дефолтным сделать. Кстати, спасибо за пример!

# Кин гол March 25, 2012, 10:16 p.m.
не помогло!!!

# анон July 30, 2012, 11:32 p.m.
http://pastebin.com/kPTYjY6W [pastebin.com]
удобный переводчик, в основном преднозначенный для перевода с английского и для тех кто изучает английский

# Modigs Aug. 1, 2013, 2:19 a.m.
word=“apple”; wget http://ssl.gstatic.com/dictionary/static/sounds/de/0/$word.mp3

http://www.commandlinefu.com/commands/view/12574/download-englishword-pronounciation-as-mp3-file

так перевод в консоли есть, как должно звучать есть…
еще бы транскрипцию… откуда -то таскать?
потом забацал бы словарик на tcl/tk[:-)) anki для изучение языка наверное хорош но хочется практики на tcl/tk.

\\Boot - The Rift//

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

Гость, Вы можете оставить свой комментарий.

Стиль кода:
Имя
Сайт * не обязательное поле
Поставьте галку, если вы - бот
Поставьте галку, если вы - человек

Друзья! Убедительная просьба воздержаться от нецензурной лексики!



Справка:
Если вы хотите использовать в тексте комментария специальные символы, например, [ и ], используйте их внутри тега [code] [/code]
Вы можете использовать теги BBcode. Для оформления кода и подсветки синтаксиса используйте тег [code] или [code=название_языка], например, [code=python]
Ссылки вставляйте так: [url]zenux.ru[/url] или так: http://zenux.ru, но не так: zenux.ru
Текст сообщения должен быть в пределах 3000 символов.




Последние комментарии:

fanyit: Спасибо за обзор. очень полезно и доступно.... >>>
cheech: Спасибо, статья полезная )... >>>
Васёк: Коммент, расскажи про часы на стене капитану в оке... >>>
METAJIJI: Ах да, почему я начал вообще трогать urxvt, потому... >>>
METAJIJI: Вкладки как раз не феншуйные (штатный tabbed), они... >>>