Skip to content

Commit 079a7f2

Browse files
committed
support baidu translator api
1 parent caa4806 commit 079a7f2

File tree

5 files changed

+120
-6
lines changed

5 files changed

+120
-6
lines changed

docs/settings.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Rosetta can be configured via the following parameters, to be defined in your pr
77
* ``ROSETTA_ENABLE_TRANSLATION_SUGGESTIONS``: Enable AJAX translation suggestions. Defaults to ``False``.
88
* ``YANDEX_TRANSLATE_KEY``: Translation suggestions from Yandex `Yandex.Translate API <http://api.yandex.com/translate/>`_. To use this service you must first `obtain an AppID key <http://api.yandex.com/key/form.xml?service=trnsl>`_, then specify the key here. Defaults to ``None``.
99
* ``AZURE_CLIENT_SECRET``: Translation suggestions using the Microsoft Azure Translator API. To use this service, you must first `register for the service <https://docs.microsoft.com/en-us/azure/cognitive-services/Translator/translator-text-how-to-signup>`_, and set ``AZURE_CLIENT_SECRET`` to either of the keys listed for your subscription. Defaults to ``None``.
10+
* ``BAIDU_FANYI_APPID`` and ``BAIDU_FANYI_SECRETKEY``: Translation suggestions from `Baidu Translator API <https://fanyi-api.baidu.com/api/trans/product/prodinfo>`_. Defaults to ``None``.
1011
* ``ROSETTA_MESSAGES_SOURCE_LANGUAGE_CODE`` and ``ROSETTA_MESSAGES_SOURCE_LANGUAGE_NAME``: Change these if the source language in your PO files isn't English. Default to ``'en'`` and ``'English'`` respectively.
1112
* ``ROSETTA_WSGI_AUTO_RELOAD`` and ``ROSETTA_UWSGI_AUTO_RELOAD``: When running WSGI daemon mode, using ``mod_wsgi`` 2.0c5 or later, this setting controls whether the contents of the gettext catalog files should be automatically reloaded by the WSGI processes each time they are modified. For performance reasons, this setting should be disabled in production environments. Default to ``False``.
1213
* ``ROSETTA_EXCLUDED_APPLICATIONS``: Exclude applications defined in this list from being translated. Defaults to ``()``.

rosetta/conf/settings.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
MESSAGES_PER_PAGE = getattr(settings, 'ROSETTA_MESSAGES_PER_PAGE', 10)
55

66

7-
# Enable Google translation suggestions
7+
# Enable translation suggestions by different translation services.
88
ENABLE_TRANSLATION_SUGGESTIONS = getattr(settings, 'ROSETTA_ENABLE_TRANSLATION_SUGGESTIONS', False)
99

1010

@@ -15,6 +15,10 @@
1515
# https://docs.microsoft.com/en-us/azure/cognitive-services/Translator/translator-text-how-to-signup
1616
AZURE_CLIENT_SECRET = getattr(settings, 'AZURE_CLIENT_SECRET', None)
1717

18+
# Can be obtained for free here: https://fanyi-api.baidu.com
19+
BAIDU_FANYI_APPID = getattr(settings, 'BAIDU_FANYI_APPID', None)
20+
BAIDU_FANYI_SECRETKEY = getattr(settings, 'BAIDU_FANYI_SECRETKEY', None)
21+
1822
# Displays this language beside the original MSGID in the admin
1923
MAIN_LANGUAGE = getattr(settings, 'ROSETTA_MAIN_LANGUAGE', None)
2024

rosetta/templates/rosetta/js/rosetta.js

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,35 @@ google.setOnLoadCallback(function() {
2121
orig = unescape(orig).replace(/<br\s?\/?>/g,'\n').replace(/<code>/,'').replace(/<\/code>/g,'').replace(/&gt;/g,'>').replace(/&lt;/g,'<');
2222
a.attr('class','suggesting').html('...');
2323

24-
$.getJSON("{% url 'rosetta.translate_text' %}", {
24+
$.getJSON("{% url 'rosetta.translate_text_azure' %}", {
25+
from: sourceLang,
26+
to: destLang,
27+
text: orig
28+
},
29+
function(data) {
30+
if (data.success){
31+
trans.val(unescape(data.translation).replace(/&#39;/g,'\'').replace(/&quot;/g,'"').replace(/%\s+(\([^\)]+\))\s*s/g,' %$1s '));
32+
a.hide();
33+
} else {
34+
a.text(data.error);
35+
}
36+
}
37+
);
38+
});
39+
{% elif rosetta_settings.BAIDU_FANYI_APPID %}
40+
$('a.suggest').click(function(e){
41+
e.preventDefault();
42+
var a = $(this);
43+
var str = a.html();
44+
var orig = $('.original .message', a.parents('tr')).html();
45+
var trans=$('textarea',a.parent());
46+
var sourceLang = '{{ rosetta_settings.MESSAGES_SOURCE_LANGUAGE_CODE }}';
47+
var destLang = '{{ rosetta_i18n_lang_code }}';
48+
49+
orig = unescape(orig).replace(/<br\s?\/?>/g,'\n').replace(/<code>/,'').replace(/<\/code>/g,'').replace(/&gt;/g,'>').replace(/&lt;/g,'<');
50+
a.attr('class','suggesting').html('...');
51+
52+
$.getJSON("{% url 'rosetta.translate_text_baidu' %}", {
2553
from: sourceLang,
2654
to: destLang,
2755
text: orig

rosetta/urls.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,14 @@
3838
name='rosetta-download-file',
3939
),
4040

41-
url(r'^translate/$',
42-
views.translate_text,
43-
name='rosetta.translate_text',
41+
url(r'^translate/azure/$',
42+
views.translate_text_azure,
43+
name='rosetta.translate_text_azure',
4444
),
45+
46+
url(r'^translate/baidu/$',
47+
views.translate_text_baidu,
48+
name='rosetta.translate_text_baidu',
49+
),
50+
4551
]

rosetta/views.py

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import os
33
import os.path
44
import re
5+
import random
56
try:
67
# Python 3
78
from urllib.parse import urlencode
@@ -658,7 +659,7 @@ def get(self, request, *args, **kwargs):
658659

659660

660661
@user_passes_test(lambda user: can_translate(user), settings.LOGIN_URL)
661-
def translate_text(request):
662+
def translate_text_azure(request):
662663

663664
def translate(text, from_language, to_language, subscription_key):
664665
"""
@@ -749,5 +750,79 @@ def translate(text, from_language, to_language, subscription_key):
749750
return JsonResponse(data)
750751

751752

753+
BAIDU_LANGUAGE_MAP = {
754+
'zh-hans': 'zh',
755+
'zh-hant': 'cht',
756+
'en': 'en',
757+
'ja': 'jp',
758+
'ko': 'kor',
759+
'fr': 'fra',
760+
'es': 'spa',
761+
'ar': 'ara',
762+
'bg': 'bul',
763+
'et': 'est',
764+
'da': 'dan',
765+
'fi': 'fin',
766+
'ro': 'rom',
767+
'sl': 'slo',
768+
'sv': 'swe',
769+
'vi': 'vie',
770+
}
771+
772+
773+
def baidu_translate(appid, secretkey, q, fromlang, tolang):
774+
baseurl = 'http://api.fanyi.baidu.com/api/trans/vip/translate'
775+
salt = random.randint(32768, 65536)
776+
sign = appid+q+str(salt)+secretkey
777+
sign = hashlib.md5(sign.encode('utf-8')).hexdigest()
778+
url = baseurl + '?' + urlencode({
779+
'appid': appid,
780+
'q': q,
781+
'from': BAIDU_LANGUAGE_MAP.get(fromlang, fromlang),
782+
'to': BAIDU_LANGUAGE_MAP.get(tolang, tolang),
783+
'salt': str(salt),
784+
'sign': sign
785+
})
786+
try:
787+
print('url', url)
788+
response = requests.get(url).text
789+
except requests.exceptions.RequestException as err:
790+
data = {
791+
'success': False,
792+
'error': "Error connecting to Baidu Translation Service: {0}".format(err)
793+
}
794+
else:
795+
rsp = json.loads(response)
796+
if 'error_code' in rsp:
797+
data = {
798+
'success': False,
799+
'error': 'Baidu translation service error: {0} {1}'.format(
800+
rsp['error_code'], rsp['error_msg']
801+
)
802+
}
803+
elif not rsp.get('trans_result'):
804+
data = {
805+
'success': False,
806+
'error': 'Baidu translation service don\'t return translation result'
807+
}
808+
else:
809+
data = {
810+
'success': True,
811+
'translation': rsp['trans_result'][0]['dst']
812+
}
813+
814+
return data
815+
816+
817+
@user_passes_test(lambda user: can_translate(user), settings.LOGIN_URL)
818+
def translate_text_baidu(request):
819+
appid = getattr(settings, 'BAIDU_FANYI_APPID', None)
820+
secretkey = getattr(settings, 'BAIDU_FANYI_SECRETKEY', None)
821+
if not appid or not secretkey:
822+
return JsonResponse(data={'success': False, 'error': 'Baidu fanyi service is not configed'})
823+
return JsonResponse(baidu_translate(
824+
appid, secretkey, request.GET['text'], request.GET['from'], request.GET['to']))
825+
826+
752827
def urlencode_safe(query):
753828
return urlencode({k: force_bytes(v) for k, v in query.items()})

0 commit comments

Comments
 (0)