diff --git a/README.md b/README.md index d0fc55b..1c38322 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ Translate selected text instantly using google translate. * instantly translate selected text without opening dictionary app or browser. * lovely powered by google translate and support up to 81 languages by now. * using google tts service to convert text to speech. +* Add option to set Google Translate IP address instead of its domain name due to GFW in Mainland China. If this option is empty, use Google Translate domain to query the result: 由于GFW的原因,Google服务访问不了。可以使用[gogo-tester](https://code.google.com/p/gogo-tester/)搜索可用IP地址填入即可。如果此项为空则使用域名`translate.google.com`进行查询 ![screenshot](docs/screen_bettertranslate1.png) ![screenshot](docs/screen_bettertranslate2.png) diff --git a/docs/screen_bettertranslate3.png b/docs/screen_bettertranslate3.png index d46b591..20bcc3a 100644 Binary files a/docs/screen_bettertranslate3.png and b/docs/screen_bettertranslate3.png differ diff --git a/extensions/BetterTranslate.popclipextz b/extensions/BetterTranslate.popclipextz index a27f0d9..c4efff9 100644 Binary files a/extensions/BetterTranslate.popclipextz and b/extensions/BetterTranslate.popclipextz differ diff --git a/source/BetterTranslate/Config.plist b/source/BetterTranslate/Config.plist index e3ee4bb..e2d19fa 100644 --- a/source/BetterTranslate/Config.plist +++ b/source/BetterTranslate/Config.plist @@ -23,15 +23,15 @@ Link - http://harmy.github.io + http://github.com/truebit Name - harmy + seganw Extension Description Translate selected text instantly using google translate. Extension Identifier - com.popclip.extension.bettertranslate + com.popclip.extension.Proxytranslate Extension Name Better Translate Options @@ -51,89 +51,89 @@ Option Type multiple Option Values - - Afrikaans - Albanian - Arabic - Armenian - Azerbaijani - Basque - Belarusian - Bengali - Bosnian - Bulgarian - Catalan - Cebuano - Chinese (Simplified) - Chinese (Traditional) - Croatian - Czech - Danish - Dutch - English - Esperanto - Estonian - Filipino - Finnish - French - Galician - Georgian - German - Greek - Gujarati - Haitian Creole - Hausa - Hebrew - Hindi - Hmong - Hungarian - Icelandic - Igbo - Indonesian - Irish - Italian - Japanese - Javanese - Kannada - Khmer - Korean - Lao - Latin - Latvian - Lithuanian - Macedonian - Malay - Maltese - Maori - Marathi - Mongolian - Nepali - Norwegian - Persian - Polish - Portuguese - Punjabi - Romanian - Russian - Serbian - Slovak - Slovenian - Somali - Spanish - Swahili - Swedish - Tamil - Telugu - Thai - Turkish - Ukrainian - Urdu - Vietnamese - Welsh - Yiddish - Yoruba - Zulu - + + Afrikaans + Albanian + Arabic + Armenian + Azerbaijani + Basque + Belarusian + Bengali + Bosnian + Bulgarian + Catalan + Cebuano + Chinese (Simplified) + Chinese (Traditional) + Croatian + Czech + Danish + Dutch + English + Esperanto + Estonian + Filipino + Finnish + French + Galician + Georgian + German + Greek + Gujarati + Haitian Creole + Hausa + Hebrew + Hindi + Hmong + Hungarian + Icelandic + Igbo + Indonesian + Irish + Italian + Japanese + Javanese + Kannada + Khmer + Korean + Lao + Latin + Latvian + Lithuanian + Macedonian + Malay + Maltese + Maori + Marathi + Mongolian + Nepali + Norwegian + Persian + Polish + Portuguese + Punjabi + Romanian + Russian + Serbian + Slovak + Slovenian + Somali + Spanish + Swahili + Swedish + Tamil + Telugu + Thai + Turkish + Ukrainian + Urdu + Vietnamese + Welsh + Yiddish + Yoruba + Zulu + Option Default Value Chinese (Simplified) @@ -152,95 +152,113 @@ Option Type multiple Option Values - - Disabled - Afrikaans - Albanian - Arabic - Armenian - Azerbaijani - Basque - Belarusian - Bengali - Bosnian - Bulgarian - Catalan - Cebuano - Chinese (Simplified) - Chinese (Traditional) - Croatian - Czech - Danish - Dutch - English - Esperanto - Estonian - Filipino - Finnish - French - Galician - Georgian - German - Greek - Gujarati - Haitian Creole - Hausa - Hebrew - Hindi - Hmong - Hungarian - Icelandic - Igbo - Indonesian - Irish - Italian - Japanese - Javanese - Kannada - Khmer - Korean - Lao - Latin - Latvian - Lithuanian - Macedonian - Malay - Maltese - Maori - Marathi - Mongolian - Nepali - Norwegian - Persian - Polish - Portuguese - Punjabi - Romanian - Russian - Serbian - Slovak - Slovenian - Somali - Spanish - Swahili - Swedish - Tamil - Telugu - Thai - Turkish - Ukrainian - Urdu - Vietnamese - Welsh - Yiddish - Yoruba - Zulu - + + Disabled + Afrikaans + Albanian + Arabic + Armenian + Azerbaijani + Basque + Belarusian + Bengali + Bosnian + Bulgarian + Catalan + Cebuano + Chinese (Simplified) + Chinese (Traditional) + Croatian + Czech + Danish + Dutch + English + Esperanto + Estonian + Filipino + Finnish + French + Galician + Georgian + German + Greek + Gujarati + Haitian Creole + Hausa + Hebrew + Hindi + Hmong + Hungarian + Icelandic + Igbo + Indonesian + Irish + Italian + Japanese + Javanese + Kannada + Khmer + Korean + Lao + Latin + Latvian + Lithuanian + Macedonian + Malay + Maltese + Maori + Marathi + Mongolian + Nepali + Norwegian + Persian + Polish + Portuguese + Punjabi + Romanian + Russian + Serbian + Slovak + Slovenian + Somali + Spanish + Swahili + Swedish + Tamil + Telugu + Thai + Turkish + Ukrainian + Urdu + Vietnamese + Welsh + Yiddish + Yoruba + Zulu + Option Default Value Disabled + + + + + Option Identifier + gtransip + Option Label + + en + IPAddr.(domain) + zh-Hans + 谷歌翻译IP(留空使用域名) + zh-Hant + 谷歌翻譯IP(留空使用域名) + + Option Type + string + Version - 1 + 2 diff --git a/source/BetterTranslate/bettertranslate.py b/source/BetterTranslate/bettertranslate.py index 056e095..da14319 100644 --- a/source/BetterTranslate/bettertranslate.py +++ b/source/BetterTranslate/bettertranslate.py @@ -1,8 +1,9 @@ #coding=utf-8 -import os -import re +from os import environ, system, unlink +from re import (split as re_split, compile as re_compile) import time -import urllib, urllib2 +from urllib import quote +from urllib2 import Request, urlopen, HTTPError from tempfile import NamedTemporaryFile from translate import Translator @@ -90,13 +91,18 @@ "Zulu":"zu" } -def google_tts(text, tl='en'): +SELECTEDTEXT= environ['POPCLIP_TEXT'] +DESTLANG = environ['POPCLIP_OPTION_DESTLANG'] +TTSLANG = environ['POPCLIP_OPTION_TTSLANG'] +GTRANSLATEIP = environ['POPCLIP_OPTION_GTRANSIP'].strip() + +def google_tts(text, tl='en', ip_addr=None): """ this function is adapted from https://github.com/hungtruong/Google-Translate-TTS, thanks @hungtruong. """ #process text into chunks text = text.replace('\n','') - text_list = re.split('(\,|\.)', text) + text_list = re_split('(\,|\.)', text) combined_text = [] for idx, val in enumerate(text_list): if idx % 2 == 0: @@ -106,7 +112,7 @@ def google_tts(text, tl='en'): if len(joined_text) < 100: combined_text.append(joined_text) else: - subparts = re.split('( )', joined_text) + subparts = re_split('( )', joined_text) temp_string = "" temp_array = [] for part in subparts: @@ -119,35 +125,33 @@ def google_tts(text, tl='en'): combined_text.extend(temp_array) #download chunks and write them to the output file f = NamedTemporaryFile(delete=False) + host = ip_addr if ip_addr else "translate.google.com" + headers = {"Host":"translate.google.com", + "Referer":"http://www.gstatic.com/translate/sound_player2.swf", + "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36"} for idx, val in enumerate(combined_text): - mp3url = "http://translate.google.com/translate_tts?tl=%s&q=%s&total=%s&idx=%s" % (tl, urllib.quote(val), len(combined_text), idx) - headers = {"Host":"translate.google.com", - "Referer":"http://www.gstatic.com/translate/sound_player2.swf", - "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.163 Safari/535.19"} - req = urllib2.Request(mp3url, '', headers) + mp3url = "http://%s/translate_tts?tl=%s&q=%s&total=%s&idx=%s" % (host, tl, quote(val), len(combined_text), idx) + req = Request(mp3url, headers=headers) if len(val) > 0: try: - response = urllib2.urlopen(req) + response = urlopen(req) f.write(response.read()) - time.sleep(.5) - except urllib2.HTTPError as e: - print ('%s' % e) + except HTTPError as e: + pass f.close() - os.system('afplay {0}'.format(f.name)) - os.unlink(f.name) - - -selectedText= os.environ['POPCLIP_TEXT'] -destLang = os.environ['POPCLIP_OPTION_DESTLANG'] -ttsLang = os.environ['POPCLIP_OPTION_TTSLANG'] - -from translate import Translator -translator= Translator(to_lang=LANG_CODES[destLang]) -translation = translator.translate(selectedText) - -if ttsLang != 'Disabled': - google_tts(selectedText, LANG_CODES[ttsLang]) + system('afplay {0}'.format(f.name)) + unlink(f.name) -result = translation.encode('utf-8') -print result \ No newline at end of file +if __name__ == '__main__': + ip_addr = GTRANSLATEIP + ip_pattern = re_compile('^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$') + ip_match = ip_pattern.search(GTRANSLATEIP) + if not ip_match: + ip_addr = 'translate.google.com' + if TTSLANG != 'Disabled': + google_tts(SELECTEDTEXT, LANG_CODES[TTSLANG], ip_addr) + translator = Translator(to_lang=LANG_CODES[DESTLANG]) + translation = translator.translate(SELECTEDTEXT, ip_addr) + result = translation.encode('utf-8') + print result diff --git a/source/BetterTranslate/translate.py b/source/BetterTranslate/translate.py index d8f96df..132c8c4 100644 --- a/source/BetterTranslate/translate.py +++ b/source/BetterTranslate/translate.py @@ -14,7 +14,7 @@ This is a simple, yet powerful command line translator with google translate behind it. You can also use it as a Python module in your code. ''' -import re +from re import (compile as re_compile, sub as re_sub) try: import urllib2 as request from urllib import quote @@ -22,9 +22,10 @@ from urllib import request from urllib.parse import quote + class Translator: string_pattern = r"\"(([^\"\\]|\\.)*)\"" - match_string =re.compile( + match_string =re_compile( r"\,?\[" + string_pattern + r"\," + string_pattern + r"\," @@ -36,8 +37,8 @@ def __init__(self, to_lang, from_lang='auto'): self.from_lang = from_lang self.to_lang = to_lang - def translate(self, source): - json5 = self._get_json5_from_google(source) + def translate(self, source, ip_addr=None): + json5 = self._get_json5_from_google(source, ip_addr) return self._unescape(self._get_translation_from_json5(json5)) def _get_translation_from_json5(self, content): @@ -51,18 +52,18 @@ def _get_translation_from_json5(self, content): pos = m.end() return result - def _get_json5_from_google(self, source): + def _get_json5_from_google(self, source, ip_addr=None): escaped_source = quote(source, '') - headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19'} + host = str(ip_addr) if ip_addr else "translate.google.com" + headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36'} req = request.Request( - url="http://translate.google.com/translate_a/t?client=t&ie=UTF-8&oe=UTF-8" - +"&sl=%s&tl=%s&text=%s" % (self.from_lang, self.to_lang, escaped_source) + url="http://%s/translate_a/t?client=t&ie=UTF-8&oe=UTF-8&sl=%s&tl=%s&text=%s" % (host, self.from_lang, self.to_lang, escaped_source) , headers = headers) r = request.urlopen(req) return r.read().decode('utf-8') def _unescape(self, text): - return re.sub(r"\\.?", lambda x:eval('"%s"'%x.group(0)), text) + return re_sub(r"\\.?", lambda x:eval('"%s"'%x.group(0)), text) def main(): import argparse