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



В процессе возни с 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)"


На выходе:


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

Вы можете помочь и перевести немного средств на развитие сайта

Теги:



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

  1. sperson
    /#8382937 / +2

    Без ключей, без регистрации, без смс и гораздо более функциональней:

    xclip -o | trans en:ru

    • kloppspb
      /#8383011 / +1

      Так это же обёртка гуглтранслейта.

      • sperson
        /#8383031 / +1

        Ну да. Я так понял, вы от того скрипта отказались потому что «разбираться было лень». Тут разбираться не нужно — всё работает «out of the box». Каждый день на протяжении полугода использую и никаких проблем пока не было.

    • buddax2
      /#8383353

      а как он борется с капчей?

      • kloppspb
        /#8383411

        Присмотрелся к trans, в нём используется другой гугловский URL. В скрипте boo1ean спрашивается /translate_a/t?, здесь — /translate_a/single? Ну и в любом случае можно указывать прокси, возможно, какой-нибудь TOR поможет.

    • BelBES
      /#8384687

      Ну и чтобы при помощи этой утилиты можно было переводить выделенный текст в 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*")))
      

  2. dcc0
    /#8382999

    OnTranslator
    Каптчу не просит
    ontranslator.com
    Но он под Windows, под wine запускал, но не помню, корректно ли он работает.
    Stardict еще вроде может выделенный текст.

    Но тем не менее, спасибо. Не очень удобный переводчик — одна из причин, почему чаще надо под Win сидеть.

  3. buddax2
    /#8383337 / +1

    Я тоже заюзал апи яндексовые для своей Троги. Работает здорово. Но только китайцы жалуются, что нет поддержки китайского и немцы — им нужно Французский — Немецкий и обратно.

  4. AndersonDunai
    /#8383589

    Пользуюсь самописной утилитой, работающей через гугловский интерфейс, а для обхода большинства защит, в том числе капч и печенек представляюсь как IE 6.0. Работает через mechanize.

    Если кому интересно — вот утилита.

    • kloppspb
      /#8384243 / +1

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

  5. Angel2S2
    /#8386751

    Спасибо за скриптец. Запилил себе. Значительно удобнее стало работать :)

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

    Все прекрасно и без него работает:
    text="$(xsel -o | sed "s/[\"\'<>]//g")"

    • kloppspb
      /#8386843

      А, ну да. Последствия последовательного сокращения многострочника :)

      • Angel2S2
        /#8390845

        Спасибо за идею. Запилил по себя поуниверсальнее. Вот что вышло. Может кому пригодится.

        • kloppspb
          /#8393063

          С Яндексом не всё так просто. Есть ещё сервис для получения словарных статей, аналогичный переводу: tech.yandex.ru/dictionary Но эти два сервиса не могут работать вместе, как в гугле :( А может и :) — кому-то лаконичный перевод нужен в выделение, а кому-то подробная статья в пузыре…

  6. dvapelnik
    /#8408961

    недавно заметил, что у меня не работает переводчик, который указан в посте, и наколбасил что-то подобное на питоне, но с определением языка: если выделен русский текст, то переводит на английский, если другой, то определяет язык и переводит на русский. результат перевода добавляется в буфер обмена (на всякий случай)
    gist.github.com/dvapelnik/6f06e6467de8416867aa