Pull to refresh

Comments 89

Исправил.
Засиделся я вчера допоздна просто)
Так вот чего мне не хватало! Спасибо, очень удобная вещь!
А как оно с гуглопереводчиком связывается? Translate API вроде платный же сейчас?
В скрипте не видно? Тупо представляется браузером.
Еще можно воспользоваться альтернативными переводчиками. Все равно высокого качества не достичь.
Microsoft с ее колоссальными прибылями не скоро апи прикроет.
… wget -U «Mozilla/5.0»…
Автор хачерит.
Ещё два минуса (вторая вообще ко всем таким программам, что перепробовал):
— нет возможности (не описана?) забиндить просто на события выделения мышью только в некоторых прогах
— нет возможности настроить размер шрифта.

Объясню юз-кейс: часто читаю книги и статьи с экрана, лёжа на диване и пользуясь беспроводной мышью для листания и т. п. Естественно шрифт/масштаб ставлю покрупнее чем когда сижу за компом, но вот большинство переводчиков/словарей выводят фиксированным шрифтом и их всплывающие окна с переводом даже не реагируют на увеличение шрифта их основного окна.
Чаще всего переводить приходится текст в браузере, для браузера есть уже специальные расширения, где можно переведенный текст выделить и пр. Ну если вне браузера что-то нужно что-то глянуть, то такой скриптик может и понадобится конечно.
Ну мне, например, чаще PDF приходится читать. С английским нет проблем, а вот остальные…
Вот так, тупо в лоб, должно работать:
echo >> ~/notes.txt && echo >> ~/notes.txt && date >> ~/notes.txt && xsel -o >> ~/notes.txt && echo >> ~/notes.txt && notify-send "Эаметка добавлена" "$(xsel -o)"
UFO landed and left these words here
UFO landed and left these words here
Не исполнил, а не заэкранировал :) Используйте &lt; вместо <
UFO landed and left these words here
Кнопка code это обычный html тег, специального поведение у него не предусмотрено.
Очередное «спасибо» автору, а я сижу теперь и пилю скрипт для использования в качестве общесистемных заметок. Чтобы по хоткею выделенный текст добавлялся в специальный файлик, по типу «добавить в заметки» в Опере.
О! Меня такая же мысль посетила.
Дату, время, да текст. Скрипт простой выйдет. Доберусь до дома — сделаю.
У меня в Debian testing c Xfce4 notify-send не заработал :-( ничего не показывает. Покопаюсь в логах…
Странно, именно Xfce я проверял на дебиане.
не было. Установил xfce4-notifyd — он такой минималистический, что даже затухать по таймауту не умеет. Думаю, менять-ли его на notification-daemon или ну его :-)
Google Translator для краснопанды как-то привычнее. Не особо люблю, когда в уведомлениях что-то всплывает лишнее.
Для возможности копирования перевода можно использовать:

zenity --info --title=«Титл» --text=«текст»
или загонять перевод сразу в буфер
использовать например для работы с буфером xclip
Это понятно, но просто не хочется всякий раз при переводе слова затирать буфер, ведь там может лежать что-то нужное. Если бы это было критически необходимо, я бы лучше сделал 2 команды на разные shortcut-ы:
1 — без записи в буфер.
2 — с записью.
можно и так, а можно и первый вариант мною предложенный (изменить тип оповещения)
можно так же вести лог переводов…
Кстати, у меня были идеи по этому поводу, даже хотел мониторить этот «лог» через conky.
ну записать не проблема:
echo «text» >> filename
потом парсить файл и выводить в коньки
сделать в скрипте вывод и в коньках примерно следующее:
${execi 3600 /путь/до/скрипта/наш_скрипт.sh}
Ну, всё дело в том, что я понял, что мне это не нужно)
Хорошо что поняли до того как сделали))) не потеряли время)
Версия с копированием в буфер перевода:
#!/usr/bin/env bashtext="$(xsel -o)"
translate="$(wget -U "Mozilla/5.0" -qO - "http://translate.google.com/translate_a/t?client=t&text=$(xsel -o | sed "s/[\"'<>]//g")&sl=auto&tl=ru" | sed 's/\[\[\[\"//' | cut -d \" -f 1)"
echo $translate | xclip -selection clipboard # Копировать перевод в буфер
notify-send -u critical $text $translate
Съело энтер:
#!/usr/bin/env bash
text="$(xsel -o)"
...
оффтоп, но может кто знает утилиту, аналогичную xsel, но способную достать не только текст, но и картинки/ссылки/другие объекты из выделения?
Было бы еще хорошо направление перевода определять по текущей раскладке. Например при английской раскладке — переводить текст на английский, при русской — на русский соответственно и т.д.
вдохновившись идеей (мерси за оную кстати, крайне полезная) и необходимостью поисследовать Питон (пардон если код, эмм, неоптимален и излишен), сваял быстрое дополнение для вывода более подробного перевода.

Запуск выглядит так:

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


a сам скрипт /path/to/tran.py вот так:

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 "{}{}\n".format("\t" * depth, item)
    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: {} > ru\n\n{}".format(item, result)
            break
        result += parse_item(item, -1)
    print result
except RuntimeError as ex:
    print "Something went wrong ({}): {}".format(response, ex)


результат примерно таков:

image
Я до питона еще не добрался, так что подсказывайте :)
ImportError: No module named argparse
argparse, похоже, довольно новый класс — но он там «чисто для понта» — начало можно переписать через простые аргуметны комстроки, как

import httplib, urllib, re, sys

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

def retrieve(host, path):
    request = httplib.HTTPConnection(host)
...

Сделал так (что было закомментил):

Traceback (most recent call last):
File "/home/ploop/tran.py", line 23, in response = re.sub(',{2,}', ',', retrieve(host, "/" + URL))
File "/usr/lib/python2.6/re.py", line 151, in sub
return _compile(pattern, 0).sub(repl, string, count)
TypeError: expected string or buffer
No summary specified.
в 2.6 как-то format не так работает — переписал с конкатенацией, запустилось на Питоне 2.6.6 (и даже, если переделать ловлю ексепшна в конце как
except RuntimeError:
    print "Something went wrong ({})".format(response)

на 2.4

попробуйте плиз:

import httplib, urllib, re, sys

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 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)
Во, это нормально! Спасибо!

image
запуск слизнуло — там всё как в оригинальном решении, notify-send -u critical "$(xsel -o)" "$(python /home/halien/devel/my/python/tran.py "$(xsel -o | sed «s/[\»'<>]//g")")"
Для консольного перевода в Linux есть программа dict.
плюс гуглоперевода в том что он переводит и фразы (как — это другой вопрос =)
Да как бы не переводил, но смысл понять можно, особенно когда с китайского переводишь :)
Stardict отлично переводит выделенные слова по нажатию клавиши Win, давно пользуюсь — всё работает
Идея не плоха, и реализовать не сложно, но, может быть, Вы не пробовали GoldenDict? (не рекламы ради)
Сам пробовал разные подобные словари, но у многих есть свои «особенности», остановился на этом варианте, так как работает нормально, словари неплохи (поддерживает много форматов), по нажатию нужной клавиши показывает перевод.
> sudo chmod 777 ./seltr
Страсти какие а
> sudo chmod +x ./seltr
не судьба?
> sudo chmod +x ./seltr

Не на всех системах отработает одинаково ;)
Лучше написать chmod a+x ./seltr
В качестве альтернативы описанному методу — GoldenDict по хоткею выдает всплывающее окно с переводом. В нем отсутствуют указанные минусы.
Правда, его нужно предварительно настроить (как минимум, добавить необходимые словари). Зато к нему можно подключать множество форматов словарей (в том числе от Lingvo, и в том числе многие онлайновые). Имхо, лучший словарь из существующих под Linux — удобный, функциональный и стабильный.
Сорри, вкладка со статьей долгое время была открыта и комментария выше (через один от моего) не видел.
Шрифт у этого всплывающего окна дюже мелкий :(
В основном окне «Ctrl»+«+» несколько раз (либо в меню «View — Zoom — Zoom in», либо соответствующие значки на панели) — и проблемы больше нет ;)
Хм, пробовал буквально неделю назад, когда в очередной раз выбирал переводчик — не работало. И сейчас как-то не сразу сработало. Только когда последний раз решил проверить, чтобы точно написать, что это было ожидаемым поведением, но оно не реализовано.
Подскажите, какой шрифт используется в оповещениях, внезапно очень нравится.
Текст можно скопировать из уведомления?
В ubuntu — нет. При наведении мышью уведомление размазывается и становится прозрачным, чтобы за ним был доступен интерфейс.
Обратите внимание на мой скриншот на несколько постов выше — приходится намеренно выделять область больше, чтобы не размазалось, ближе мышь не подведёшь, а делать полный скриншот экрана и редактировать лень.
UFO landed and left these words here
UFO landed and left these words here
"… возможность перевода целого предложения.." — в этом-то и преимущество.
Если сделать два подряд перевода, то вторая нотификация ждет пока закроется первая. Как то можно сделать, что бы они не ждали а выводились подряд, несколькими штуками?
Прикрутил, спасибо! Вот только интересно: если излишне часто пользоваться, Гугл не забанит? :)
В LibreOffice не удается получить выделенную фразу.
text="$(xsel -o)"
Xsel возвращает только первое слово или обрывки фраз. Кто-то знает как решить проблему?
Здравствуйте друзья, вашему вниманию представляю код на руби, формирующий файл словаря, чтобы повторять переводимые слова перед сном. Код также кеширует все запросы в гугл (это к вопросу а не забанит ли гугл). Также имеется установщик.
github.com/newmen/gnome_google_translator
Может быть, кому-нибудь ещё понадобятся эти «навороты»… ;)
Задумка интересная с повторением :) А насчёт самой программы — в сторону gconftool-2 не смотрели? по-моему проще и логичнее через неё работать, чем xml писать и gnome перезапускать :)

Признаться, к сожалению так и не нашёл порядочной документации, в которой рассказывалось бы о том, как таки правильно создавать все эти директории и файлы. В официальной документации говорится (http://projects.gnome.org/gconf/), что всё должно быть так то и так-то, но с Gnome3, оно как-то не совсем так. Поэтому я пошёл по пути наименьшего сопротивления.
Но вообще, спасибо за проявленный интерес. Может быть когда-нибудь я дорасту до gconftool-2. (=
Криво постанул, немного не туда. Прошу прощения.
Модифицировал скрипт, теперь он умеет:
— конвертировать не только выделенный текст но и последнее набранное слово (по триггеру Ctrl+Shift_Left);
— при переключении раскладки автоматом переключает язык ввода (укажите свою комбинацию клавиш в последней строке);
Тригеры клавиш переписал на xdotool — работает более шустро и стабильно.
Сам скрипт.
И еще — криво работает со скайпом, как исправить не знаю.
UFO landed and left these words here
работает тока URL изменился

#!/usr/bin/env bash
notify-send -u critical "$(xsel -o)" "$(wget -U "Mozilla/5.0" -qO - "https://translate.google.com/translate_a/single?client=t&sl=auto&tl=ru&hl=ru&dt=bd&dt=ex&dt=ld&dt=md&dt=qc&dt=rw&dt=rm&dt=ss&dt=t&dt=at&ie=UTF-8&oe=UTF-8&otf=2&srcrom=1&ssel=0&tsel=0&kc=3&tk=519592|450115&q=$(xsel -o | sed "s/[\"'<>]//g")&sl=auto&tl=ru" | sed 's/\[\[\[\"//' | cut -d \" -f 1)"
UFO landed and left these words here
на python код выглядит следующим образом:
# This script auto translate mark text on ubuntu in toolbar
# For work you need install with your env 'pip install googletrans'


import subprocess
from googletrans import Translator


def sendmessage():
    translate = Translator()
    text = subprocess.check_output(['xsel', '-o'])
    rus_lang = translate.translate(text.decode('utf8'), dest='ru')
    subprocess.Popen(['notify-send', text, rus_lang.text])


if __name__ == '__main__':
    sendmessage()

Версия 2.0 определяет язык русский или английский. Потом делает перевод на противоположный
# This script auto translate mark text on ubuntu in toolbar
# For work you need with your env 'pip install googletrans'


#!/home/rus/Envs/translate/bin/python3
import subprocess
from googletrans import Translator


def sendmessage():
    translate = Translator()
    text = subprocess.check_output(['xsel', '-o'])
    text = text.decode('utf-8')
    lang = translate.detect(text).lang
    dest_lang = 'enru'.replace(lang, '')
    if dest_lang not in 'enru':
        dest_lang = 'en'
    rus_lang = translate.translate(text, dest=dest_lang)
    subprocess.Popen(['notify-send', text, rus_lang.text])


if __name__ == '__main__':
    sendmessage()
Sign up to leave a comment.

Articles