Онлайн переводчик
Изучать питон я решил не через форумный проект ибо у меня уже были две идеи для написания программ на нем. Вот вчера взялся за первую.
Глава1. Суть.
Суть проста до безобразия. Программа юзает гугловский сервис для переводов. Вводите слово - получаете перевод. Направление перевода - любое. Вот правда пока что оно "вшито" в скрипт - но легко изменить. Переведенные слова складываются в локальный кэш. В первую очередь поиск ведется по кэшу, потом уже скрипт ломится в гугл. Еще хочу сделать фичу - чтобы программа периодически "заставляла" пользователя заучивать слова из локального кэша. Нужно это лично мне пополнения словарного запаса ради. Скорее всего сделаю опцией. Как оно будет выглядеть - пока не придумал.
Глава2. Что сделано.
Уже сделан простой скрипт, в который вводишь слово на английском, получаешь перевод на русском. Пока еще плохо тестирован, не пробовал запускать при отстутствии интернета - наверняка будет ошибка, которую еще надо обработать. Пробовали запускать на версии питона ниже 2.6 - глюкнуло. Модуль JSon для разбора ответа от гугловского сервера появился только с версии 2.6. Проверку версии тоже надо будет сделать.
Глава3. Что делаю.
Локальный кэш. Не знаю, есть ли смысл пользовать какую то особую БД. Может быть проще организовать его в виде текстового файла. Хотелось бы совет по этой теме.
Эпилог.
Прогой мне поделиться не жалко, поэтому код буду выкладывать здесь. Критика, советы и замечания приветствуются. Авторское право и идея моя (=, но готовая прога однозначно будет OpenSource & Free.
Ибо версия 3 у тебя. А тут 2.6.
Решил добавить перевод с двух языков. Пока сделал криво, по шамански. Не нашел пока, как определить кодировку консоли - потому вынес ее в переменную. Ну и с отправкой русского слова пока применил быдлокодерское решение. Ну, в черновом виде пока так:
# (c) Georgiy Shestayev, and ... 2009
my_console_coding = "cp1251" # "cp866" ....
def parse_json_response(response):
import json
response_dict = json.load(response)
translation = response_dict["responseData"]["translatedText"]
return translation
def crazy_coding(s):
crazystr = ("%D0%B0%D0%B1%D0%B2%D0%B3%D0%B4%D0%B5%D1%91%D0%B6%D0%B7%D0" +
"%B8%D0%BA%D0%BB%D0%BC%D0%BD%D0%BE%D0%BF%D1%80%D1%81%D1%82%D1" +
"%83%D1%84%D1%85%D1%86%D1%87%D1%88%D1%89%D1%8A%D1%8B%D1%8C%D1%8D%D1%8E%D1%8F")
rustr = u"абвгдеёжзиклмнопрстуфхцчшщъыьэюя"
s = s.decode(my_console_coding)
s = s.lower()
out = []
for i in s:
j = rustr.find(i)
if j > -1:
out.append(crazystr[(j * 6) : (j * 6 + 6)])
if len(out):
return "".join(out)
else:
return s
def translate(text, from_lang, to_lang):
import urllib
text = crazy_coding(text)
url = "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=" + text + "&langpair=" + from_lang + "|" + to_lang
server_response = urllib.urlopen(url)
parsed_translation = parse_json_response(server_response)
return parsed_translation.encode(my_console_coding)
def select_lang(s):
ru_lang, eng_lang = "ru", "en"
if len(s) and ord(s[0]) > 128:
return (ru_lang, eng_lang)
else:
return (eng_lang, ru_lang)
def begin():
while True:
source_word = raw_input("Input word or Exit:\n")
if source_word.lower() == "exit": break
from_lang, to_lang = select_lang(source_word)
word = translate(source_word, from_lang, to_lang)
print "(" + to_lang + ") " + word + '\n'
print "Exit..."
if __name__ == "__main__":
begin()
else:
print "use google_off_translator.begin()"
По коду от Washington: как-то неудобно переменные и функции обзываются. Ну и то, что файл не работает отдельно, не как модуль - тоже не здорово.
а насчет работы файла отдельно, как модуля - я просто не знаю, как сделать. если объяснишь - буду благодарен.
по поводу кодировки - Сузи обещал, что строка
должна научить консоль понимать юникод. Странно, что не работает.
а насчет работы файла отдельно, как модуля - я просто не знаю, как сделать. если объяснишь - буду благодарен.
по поводу кодировки - Сузи обещал, что строка
должна научить консоль понимать юникод. Странно, что не работает.
Про нейминг: я привык, что функции пишут с большой буквы, чтоб от переменных отличать. Ну и имена длинноватые.
Я сделал, чтобы работало и как модуль и как главный файл (несколько строк в конце).
Про кодировку: виндовская консоль плевать хотела на Сузи, как и консоль моего IDE. Ну и в Гугловском запросе хитрая кодировка. Я вебом-программированием никогда не занимался - может там такой формат хорошо известен. Но я пока не понял, как с ним бороться по умному.
Сделано:
- Локальный кэш. Работает просто. При запросе перевода сначала поиск осуществляется по кэшу, если в кэше слова нет, тогда запрос на перевод отправляется гуглу. Кэш хранится в БД, сделан с помощью SQLite 3. Если Python не сможет импортировать модуль sqlite3 - кэш работать не будет.
- Скрипт работает и как модуль, и как главный файл
- С нэймингом пока возиться не хочу. Пусть сначала стиль выработается
- Кодировка на моем линуксе пока что работает адекватно. Поэтому еще не разбирался. Думаю, завтра буду тестировать на других ОСях, а также другие направления перевода.
upd, не нравится, что всегда только один вариант перевода. хочу много как в гугле. еще одно усложнение задачи
Traceback (most recent call last):
File "D:\_Dloads\transl.py", line 59, in <module>
begin()
File "D:\_Dloads\transl.py", line 54, in begin
word = translate(source_word, from_lang, to_lang)
File "D:\_Dloads\transl.py", line 35, in translate
parsed_translation = parse_json_response(server_response)
File "D:\_Dloads\transl.py", line 9, in parse_json_response
translation = response_dict["responseData"]["translatedText"]
TypeError: 'NoneType' object is unsubscriptable
Еще вчера в питонское ирк-конференции была мини лекция про кодировки. Руки никак не дойдут до ума довести - все таки этим я занимаюсь на досуге. Потихоньку начал лепить GUI.
после лазания по интернетам решил, что интерфейс будет на qt. потихоньку начинаю тестировать на мобиле - имеются странности. мобильный питон доказывает мне, что не знает ничего о модуле datetime. если кто может попробовать у себя - будьте добры. приведу код в порядок (чтобы не сильно по шамански было) и выложу.
Да и не плохо было бы чтобы хостинг был с багтрекером. У меня например к вам сразу два фичреквеста:
1. (с) в первой строке не дает скрипту запускаться в Debian 5.03, скорее всего потому что находится до объявления кодировки:
SyntaxError: Non-ASCII character '\xc2' in file got.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
2. Сделать import sys и код
raw_input()
exit
заменить на
raw_input()
sys.exit()
иначе лезет
Traceback (most recent call last):
File "got.py", line 164, in <module>
begin()
File "got.py", line 32, in begin
word = translate(source_word, from_lang, to_lang)
File "got.py", line 20, in translate
parsed_translation = parse_json_response(server_response)
File "got.py", line 6, in parse_json_response
response_dict = json.load(response)
NameError: global name 'json' is not defined
а пока не забыл еще вот капелька вредности:
http://docs.python.org/library/stdtypes.html говорит нам, что:
Notes:
1. != can also be written <>, but this is an obsolete usage kept for backwards compatibility only. New code should always use !=