В процессе возни с 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
    19.04.2015 14:46
    +2

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

    xclip -o | trans en:ru


    1. kloppspb Автор
      19.04.2015 15:55
      +1

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


      1. sperson
        19.04.2015 16:07
        +1

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


    1. buddax2
      19.04.2015 22:18

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


      1. kloppspb Автор
        19.04.2015 23:20

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


    1. BelBES
      20.04.2015 16:39

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


  1. dcc0
    19.04.2015 15:37

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

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


  1. buddax2
    19.04.2015 22:11
    +1

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


  1. AndersonDunai
    20.04.2015 04:31

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

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


    1. kloppspb Автор
      20.04.2015 13:37
      +1

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


  1. Angel2S2
    21.04.2015 17:46

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

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

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


    1. kloppspb Автор
      21.04.2015 18:11

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


      1. Angel2S2
        23.04.2015 22:22

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


        1. kloppspb Автор
          25.04.2015 13:29

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


  1. dvapelnik
    07.05.2015 16:06

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