Переводим с помощью Яндекс

В процессе возни с xfce4-dict набрёл на хабрастатью почти трёхлетней давности: «Перевод выделенного текста с любого языка на русский». Решение оказалось очень простым, но что-то не заладилось у меня с гуглопереводчиком. То ли потому, что очень быстро он начал выдавать капчу, то ли потому, что денег хочет… Разбираться было лень, поэтому просто переписал исходный скрипт с использованием API Яндекс.Перевода.

Для начала нужно залогиниться в Яндекс и получить ключ. Ключ генерируется моментально, никто никаких допросов не устраивает и ничего ждать не надо. Само собой, перед этим надо прочитать и принять пользовательское соглашение.

Ну а дальше всё просто:

#!/bin/sh

key="вставляем сюда свой ключ API"
text="$(echo $(xsel -o) | sed "s/[\"\'<>]//g")"
translate="$(wget -qO - "https://translate.yandex.net/api/v1.5/tr.json/translate?key=$key&text=$text&lang=ru")"
notify-send -u critical "$text" "$(echo $translate | sed 's/.*\[\"\(.*\)\"\].*/\1/')"


Конечно, можно сделать всё куда красивей: и со вставкой перевода в буфер обмена, и с красивым парсером ответа (Яндекс может отдавать как JSON[P], так и XML), и с более вдумчивой предварительной обработкой текста, и с бОльшими фрагментами в POST, и с прочими радостями. Но это уже дело вкуса. А подробное обсуждение юзкейсов и разные реализации есть в исходной статье.

UPD:

sperson подсказывает, что есть trans. По сути это продвинутая обёртка для того же гуглтранслейта, которая и препроцессинг текста делает, и постпроцессинг, и прокси позволяет задавать, и много чего полезного. Так что если устраивает гугл, то всё ещё проще:

#!/bin/sh

notify-send -u critical "$(xsel -o | trans -no-ansi -l ru)"


На выходе:


И статья побольше:

Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 15

    +2
    Без ключей, без регистрации, без смс и гораздо более функциональней:
    xclip -o | trans en:ru
      +1
      Так это же обёртка гуглтранслейта.
        +1
        Ну да. Я так понял, вы от того скрипта отказались потому что «разбираться было лень». Тут разбираться не нужно — всё работает «out of the box». Каждый день на протяжении полугода использую и никаких проблем пока не было.
        0
        а как он борется с капчей?
          0
          Присмотрелся к trans, в нём используется другой гугловский URL. В скрипте boo1ean спрашивается /translate_a/t?, здесь — /translate_a/single? Ну и в любом случае можно указывать прокси, возможно, какой-нибудь TOR поможет.
          0
          Ну и чтобы при помощи этой утилиты можно было переводить выделенный текст в emacs
          (defun translate-google (arg)
            (interactive (list (read-string "language (default en:ru):")))
            (if (equal arg "")
                (setq arg "en:ru"))
            (with-output-to-temp-buffer "*translate*"
              (async-shell-command
               (concat "trans " arg " \"" (buffer-substring (mark) (point)) "\"") "*translate*")))
          
          0
          OnTranslator
          Каптчу не просит
          ontranslator.com
          Но он под Windows, под wine запускал, но не помню, корректно ли он работает.
          Stardict еще вроде может выделенный текст.

          Но тем не менее, спасибо. Не очень удобный переводчик — одна из причин, почему чаще надо под Win сидеть.
            +1
            Я тоже заюзал апи яндексовые для своей Троги. Работает здорово. Но только китайцы жалуются, что нет поддержки китайского и немцы — им нужно Французский — Немецкий и обратно.
              0
              Пользуюсь самописной утилитой, работающей через гугловский интерфейс, а для обхода большинства защит, в том числе капч и печенек представляюсь как IE 6.0. Работает через mechanize.

              Если кому интересно — вот утилита.
                +1
                Судя по PATTERN и url желание заюзать API было :)
                К сожалению, через mechanize в этом случае не вытаскиваются «варианты перевода» (см. скриншот у меня под катом).
                0
                Спасибо за скриптец. Запилил себе. Значительно удобнее стало работать :)

                text="$(echo $(xsel -o) | sed "s/[\"\'<>]//g")"
                echo тут излишен и только усложняет код и создает лишний вызов

                Все прекрасно и без него работает:
                text="$(xsel -o | sed "s/[\"\'<>]//g")"
                  0
                  А, ну да. Последствия последовательного сокращения многострочника :)
                    0
                    Спасибо за идею. Запилил по себя поуниверсальнее. Вот что вышло. Может кому пригодится.
                      0
                      С Яндексом не всё так просто. Есть ещё сервис для получения словарных статей, аналогичный переводу: tech.yandex.ru/dictionary Но эти два сервиса не могут работать вместе, как в гугле :( А может и :) — кому-то лаконичный перевод нужен в выделение, а кому-то подробная статья в пузыре…
                  0
                  недавно заметил, что у меня не работает переводчик, который указан в посте, и наколбасил что-то подобное на питоне, но с определением языка: если выделен русский текст, то переводит на английский, если другой, то определяет язык и переводит на русский. результат перевода добавляется в буфер обмена (на всякий случай)
                  gist.github.com/dvapelnik/6f06e6467de8416867aa

                  Only users with full accounts can post comments. Log in, please.