diff --git a/rosetta/conf/settings.py b/rosetta/conf/settings.py index 967afaf..8352671 100644 --- a/rosetta/conf/settings.py +++ b/rosetta/conf/settings.py @@ -7,7 +7,8 @@ MESSAGES_PER_PAGE = getattr(settings, 'ROSETTA_MESSAGES_PER_PAGE', 10) # Enable Google translation suggestions ENABLE_TRANSLATION_SUGGESTIONS = getattr(settings, 'ROSETTA_ENABLE_TRANSLATION_SUGGESTIONS', False) # Can be obtained for free here: https://ssl.bing.com/webmaster/Developers/AppIds/ -BING_APP_ID = getattr(settings, 'BING_APP_ID', None) +AZURE_CLIENT_ID = getattr(settings, 'AZURE_CLIENT_ID', None) +AZURE_CLIENT_SECRET = getattr(settings, 'AZURE_CLIENT_SECRET', None) # Displays this language beside the original MSGID in the admin MAIN_LANGUAGE = getattr(settings, 'ROSETTA_MAIN_LANGUAGE', None) diff --git a/rosetta/templates/rosetta/base.html b/rosetta/templates/rosetta/base.html index 19fe7a0..dd5de09 100644 --- a/rosetta/templates/rosetta/base.html +++ b/rosetta/templates/rosetta/base.html @@ -6,7 +6,7 @@ - + diff --git a/rosetta/templates/rosetta/js/rosetta.js b/rosetta/templates/rosetta/js/rosetta.js index 4399177..dcc9e20 100644 --- a/rosetta/templates/rosetta/js/rosetta.js +++ b/rosetta/templates/rosetta/js/rosetta.js @@ -7,7 +7,7 @@ google.setOnLoadCallback(function() { $('.hide', $(this).parent()).hide(); }); -{% if ENABLE_TRANSLATION_SUGGESTIONS and BING_APP_ID %} +{% if ENABLE_TRANSLATION_SUGGESTIONS and AZURE_CLIENT_ID and AZURE_CLIENT_SECRET %} $('a.suggest').click(function(e){ e.preventDefault(); var a = $(this); @@ -16,30 +16,24 @@ google.setOnLoadCallback(function() { var trans=$('textarea',a.parent()); var sourceLang = '{{ MESSAGES_SOURCE_LANGUAGE_CODE }}'; var destLang = '{{ rosetta_i18n_lang_code }}'; - var app_id = '{{ BING_APP_ID }}'; - var apiUrl = "http://api.microsofttranslator.com/V2/Ajax.svc/Translate"; orig = unescape(orig).replace(//g,'\n').replace(//,'').replace(/<\/code>/g,'').replace(/>/g,'>').replace(/</g,'<'); a.attr('class','suggesting').html('...'); - window.onTranslationComplete = function(resp) { - trans.val(unescape(resp).replace(/'/g,'\'').replace(/"/g,'"').replace(/%\s+(\([^\)]+\))\s*s/g,' %$1s ')); - a.hide(); - }; - window.onTranslationError = function(response){ - a.text(response); - }; - var apiData = { - onerror: 'onTranslationError', - appid: app_id, - from: sourceLang, - to: destLang, - oncomplete: "onTranslationComplete", - text: orig - }; - $.ajax({ - url: apiUrl, - data: apiData, - dataType: 'jsonp'}); + + $.getJSON("/rosetta/translate/", { + from: sourceLang, + to: destLang, + text: orig + }, + function(data) { + if (data.success){ + trans.val(unescape(data.translation).replace(/'/g,'\'').replace(/"/g,'"').replace(/%\s+(\([^\)]+\))\s*s/g,' %$1s ')); + a.hide(); + } else { + a.text(data.error); + } + } + ); }); {% endif %} diff --git a/rosetta/urls.py b/rosetta/urls.py index b701b69..181e09a 100644 --- a/rosetta/urls.py +++ b/rosetta/urls.py @@ -5,4 +5,5 @@ urlpatterns = patterns('rosetta.views', url(r'^pick/$', 'list_languages', name='rosetta-pick-file'), url(r'^download/$', 'download_file', name='rosetta-download-file'), url(r'^select/(?P[\w\-]+)/(?P\d+)/$', 'lang_sel', name='rosetta-language-selection'), + url(r'^translate/$', 'translate_text', name='translate_text'), ) diff --git a/rosetta/views.py b/rosetta/views.py index b23238e..30b668b 100644 --- a/rosetta/views.py +++ b/rosetta/views.py @@ -7,6 +7,7 @@ from django.shortcuts import render_to_response from django.template import RequestContext from django.utils.encoding import smart_unicode, iri_to_uri from django.utils.translation import ugettext_lazy as _ +from django.utils import simplejson from django.views.decorators.cache import never_cache from rosetta.conf import settings as rosetta_settings from rosetta.polib import pofile @@ -47,6 +48,7 @@ def home(request): return out_ storage = get_storage(request) + version = rosetta.get_version(True) if storage.has('rosetta_i18n_fn'): rosetta_i18n_fn = storage.get('rosetta_i18n_fn') @@ -57,11 +59,7 @@ def home(request): if rosetta_i18n_write: rosetta_i18n_pofile = pofile(rosetta_i18n_fn, wrapwidth=rosetta_settings.POFILE_WRAP_WIDTH) for entry in rosetta_i18n_pofile: - entry.md5hash = hashlib.md5( - entry.msgid.encode("utf8") + - entry.msgstr.encode("utf8") + - (entry.msgctxt and entry.msgctxt.encode("utf8") or "") - ).hexdigest() + entry.md5hash = hashlib.md5(entry.msgid.encode("utf8") + entry.msgstr.encode("utf8")).hexdigest() else: rosetta_i18n_pofile = storage.get('rosetta_i18n_pofile') @@ -172,11 +170,15 @@ def home(request): storage.set('rosetta_i18n_pofile', rosetta_i18n_pofile) # Retain query arguments - query_arg = '?_next=1' - if 'query' in request.GET or 'query' in request.POST: - query_arg += '&query=%s' % request.REQUEST.get('query') + query_arg = '' + if 'query' in request.REQUEST: + query_arg = '?query=%s' % request.REQUEST.get('query') if 'page' in request.GET: - query_arg += '&page=%d&_next=1' % int(request.GET.get('page')) + if query_arg: + query_arg = query_arg + '&' + else: + query_arg = '?' + query_arg = query_arg + 'page=%d' % int(request.GET.get('page')) return HttpResponseRedirect(reverse('rosetta-home') + iri_to_uri(query_arg)) rosetta_i18n_lang_name = _(storage.get('rosetta_i18n_lang_name')) rosetta_i18n_lang_code = storage.get('rosetta_i18n_lang_code') @@ -199,14 +201,6 @@ def home(request): page = int(request.GET.get('page')) else: page = 1 - - if '_next' in request.GET or '_next' in request.POST: - page += 1 - if page > paginator.num_pages: - page = 1 - query_arg = '?page=%d' % page - return HttpResponseRedirect(reverse('rosetta-home') + iri_to_uri(query_arg)) - rosetta_messages = paginator.page(page).object_list if rosetta_settings.MAIN_LANGUAGE and rosetta_settings.MAIN_LANGUAGE != rosetta_i18n_lang_code: @@ -235,8 +229,9 @@ def home(request): except AttributeError: ADMIN_MEDIA_PREFIX = settings.STATIC_URL + 'admin/' ADMIN_IMAGE_DIR = ADMIN_MEDIA_PREFIX + 'img/' - ENABLE_TRANSLATION_SUGGESTIONS = rosetta_settings.BING_APP_ID and rosetta_settings.ENABLE_TRANSLATION_SUGGESTIONS - BING_APP_ID = rosetta_settings.BING_APP_ID + ENABLE_TRANSLATION_SUGGESTIONS = rosetta_settings.AZURE_CLIENT_ID and rosetta_settings.AZURE_CLIENT_SECRET and rosetta_settings.ENABLE_TRANSLATION_SUGGESTIONS + AZURE_CLIENT_ID = rosetta_settings.AZURE_CLIENT_ID + AZURE_CLIENT_SECRET = rosetta_settings.AZURE_CLIENT_SECRET MESSAGES_SOURCE_LANGUAGE_NAME = rosetta_settings.MESSAGES_SOURCE_LANGUAGE_NAME MESSAGES_SOURCE_LANGUAGE_CODE = rosetta_settings.MESSAGES_SOURCE_LANGUAGE_CODE if storage.has('rosetta_last_save_error'): @@ -339,6 +334,7 @@ def lang_sel(request, langid, idx): """ Selects a file to be translated """ + storage = get_storage(request) if langid not in [l[0] for l in settings.LANGUAGES]: raise Http404 @@ -356,11 +352,7 @@ def lang_sel(request, langid, idx): storage.set('rosetta_i18n_fn', file_) po = pofile(file_) for entry in po: - entry.md5hash = hashlib.md5( - entry.msgid.encode("utf8") + - entry.msgstr.encode("utf8") + - (entry.msgctxt and entry.msgctxt.encode("utf8") or "") - ).hexdigest() + entry.md5hash = hashlib.md5(entry.msgid.encode("utf8") + entry.msgstr.encode("utf8")).hexdigest() storage.set('rosetta_i18n_pofile', po) try: @@ -389,3 +381,30 @@ def can_translate(user): except Group.DoesNotExist: return False +from microsofttranslator import Translator, TranslateApiException + +def translate_text(request): + language_from = request.GET.get('from', None) + language_to = request.GET.get('to', None) + text = request.GET.get('text', None) + + if language_from == language_to: + data = { 'success' : True, 'translation' : text } + else: + # run the translation: + AZURE_CLIENT_ID = getattr(settings, 'AZURE_CLIENT_ID', None) + AZURE_CLIENT_SECRET = getattr(settings, 'AZURE_CLIENT_SECRET', None) + + print AZURE_CLIENT_ID + print AZURE_CLIENT_SECRET + + translator = Translator(AZURE_CLIENT_ID, AZURE_CLIENT_SECRET) + + try: + translated_text = translator.translate(text, language_to) + data = { 'success' : True, 'translation' : translated_text } + except TranslateApiException as e: + data = { 'success' : False, 'error' : "Translation API Exception: {0}".format(e.message) } + + return HttpResponse(simplejson.dumps(data), mimetype='application/json') + \ No newline at end of file