LINUX.ORG.RU

Устанавливаю альтернативу Google Translate Client. Несколько простых вопросов.

 , , ,


0

2

Добрый день, накопал себе червячка по сабжу.
Консольная альтернатива Google Translate

(Впрочем оригинал родился видимо здесь: Хабра )

Вопросы:
1. Вытаюсь запустить python-скрипт товарища «jollheef» из первой ссылки (скрипт там один), но выдается ошибка синтаксиса на строку #15

"if typeimport httplib, urllib, re, sys".
Подсобите плиз.

2. Несовсем понятен солюшин товарища «Megabaks», не понимаю, что должен делать его команданый скрипт (у меня ничего не происходит):

curl -s -A "Mozilla/5.0" -d "ie=UTF8" -d "hl=en" -d "sl=$1" -d "tl=$2" -d "q=$3" http://translate.google.com | xmllint --html --format - 2>&- | grep result_box | elinks -dump | sed -e 's/^ *//'



Последнее исправление: nwbie (всего исправлений: 1)

Я пользуюсь pymultitran, который берём результаты с multitran.ru. Фразы переводит так-сяк конечно, но для слов вполне годится. Может пригодится.

green_turtle
()
Ответ на: комментарий от green_turtle

Благодарю за любые комментарии по теме. Авось что пригодится. А для меня критерии сейчас: перевод фраз и слов во флаконе, плюс возможность сподручного перевода по выделению слова(можно + hotkey).

nwbie
() автор топика

2. Несовсем понятен солюшин товарища «Megabaks», не понимаю, что должен делать его команданый скрипт (у меня ничего не происходит):

$1 - язык с которого переводим

$2 - на который переводим

$3 - собственно запрос т.е. для перевода с русского на английский:

 curl -s -A "Mozilla/5.0" -d "ie=UTF8" -d "hl=en" -d "sl=ru" -d "tl=en" -d "q=привет" http://translate.google.com | xmllint --html --format - 2>&- | grep result_box | elinks -dump | sed -e 's/^ *//'
Оберни его в скрипт с параметрами и можно пользоваться.

cx ★★
()
Ответ на: комментарий от cx

Спасибо, друзья! It works! Буду ждать ответ еще на проблему с python'ом, т.к. в том случае выдается полный перевод слова.

nwbie
() автор топика
Ответ на: комментарий от nwbie

Убери def parse_item(item, depth = 0): if typeimport httplib, urllib, re, sys совсем из кода он там дальше переопределяется

zz ★★★★
()
Ответ на: комментарий от zz

Благодарю за ответ. Попробовал сделать так, но все равно летят ошибки «компиляции». Попробовал упрощенный срипт , но и он не выполняется нормально. Однако, замел, что если испарвить код последнего на следующий, то в некоторых случах перевода одной буквы (например,«h»), перевод проходит. Подскажите, где все-же недоделка. Исправленный код:

# notify-send -u critical "$(xsel -o)" "$(python /path/to/tran.py "$(xsel -o | sed "s/[\"'<>]//g")")"

import httplib, urllib, argparse, re

def argparser():
    parser = argparse.ArgumentParser(description='Instant Translator')
    parser.add_argument('phrase', metavar='p', type=str,
                        help='phrase to translate')
    args = parser.parse_args()
    return args.phrase

def retrieve(host, path):
    request = httplib.HTTPConnection(host)
    request.request("GET", path, "", {'User-Agent' : 'Mozilla/5.0'})
    response = request.getresponse()
    if response.status > 200:
        return '[["{}"],"ERROR"]'.format(response.reason)
    return response.read()

def parse_item(item, depth = 0):
    if type(item) is str:
        if len(item) == 0:
            return ''
        return ("\t" * depth) + item + "\n"
    result = ''
    for sub_item in item:
        result += parse_item(sub_item, depth + 1)
    return result

phrase = argparser()
host = 'translate.google.com'
URL = 'translate_a/t?client=t&sl=auto&tl=ru&' + urllib.urlencode({'text' : phrase})

response = re.sub(',{2,}', ',', retrieve(host, "/" + URL))
try:
    translated = eval(response)
    result = ''
    for item in translated:
        if type(item) is str:
            result = "Translation: " + item + " > ru\n\n" + result
            break
        result += parse_item(item, -1)
    print result
except RuntimeError as ex:
    print "Something went wrong ({}): {}".format(response, ex)
nwbie
() автор топика
Ответ на: комментарий от zz

Заработало! Спасибо тебе, zz! Чтобы перевести не слово, а предложение, нужно взять в кавычки. Обратил внимание, что проблема исчезла добавлением кода

if hasattr(item, '__iter__'):

PS Остался только один вопрос: при переводе третьей строкой предлагается никому не нужный транслит, вот как бы его удалить?

nwbie
() автор топика
Ответ на: комментарий от zz

Благодарю за поддержку и толчок в изучении python. Однако, новый код ничего не изменил (транслит остается). И пользуясь ситуацией, спрошу о доведении скрипта до совершенства, если возможно: хотелось бы также, чтобы при переводе не выводился блок англоязычных синонимов, дабы не раздувать круто output. Например, при переводе «plate» выдается огромный блок синонимов

                       пластинка
				plate
				lamella
				wax
			тарелка
				plate
				dish
				disk
				cap

nwbie
() автор топика
Ответ на: комментарий от zz

Не заметил, что синонимы исчезли. Отл!! Думал, это самое сложное. А транслит не так уж критичен. Думаю, с первым опытом питона сам догадаюсь шаблон смастерить. Спасибо еще раз, zz. Теперь есть достойная linux альтернатива. PS Тему закрывать пока не буду, еще может пригодится.

Ключевые слова: google translate client linux ubuntu abbyy приложение программа альтернатива переводчик перевод словарь

Потомкам финальный скрипт:

# notify-send -u critical "$(xsel -o)" "$(python /path/to/tran.py "$(xsel -o | sed "s/[\"'<>]//g")")"
import httplib, urllib, re, sys

MAX_DEPTH = 2

def argparser():
    return sys.argv[1]

def retrieve(host, path):
    request = httplib.HTTPConnection(host)
    request.request("GET", path, "", {'User-Agent' : 'Mozilla/5.0'})
    response = request.getresponse()
    if response.status > 200:
        return '[["{}"],"ERROR"]'.format(response.reason)
    return response.read()

def parse_item(item, depth = 0):
    if depth > MAX_DEPTH:
        return ''
    if type(item) is str:
        if len(item) == 0:
            return ''
        return ("\t" * depth) + item + "\n"
    result = ''
    if hasattr(item, '__iter__'):
        for sub_item in item:
            result += parse_item(sub_item, depth + 1)
    return result

phrase = argparser()
host = 'translate.google.com'
URL = 'translate_a/t?client=t&sl=auto&tl=ru&' + urllib.urlencode({'text' : phrase})

response = re.sub(',{2,}', ',', retrieve(host, "/" + URL))
try:
    translated = eval(response)
    result = ''
    for item in translated:
        if type(item) is str:
            result = "Translation: " + item + " > ru\n\n" + result
            break
        result += parse_item(item, -1)
    print result
except RuntimeError as ex:
    print "Something went wrong ({}): {}".format(response, ex)

nwbie
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.