Support languages names and RFC 1766 codes (#26)
* Update client.py Accept languages names as dest/src params in the `translate` routine. Move dest/src params check to the `translate` routine. * Update constants.py Add LANGCODES dict * Update __init__.py Import LANGCODES * Update test_client.py Add tests * Update constants.py Fix typo
This commit is contained in:
parent
633fc40a57
commit
04a0e6dfbb
@ -4,4 +4,4 @@ __version__ = '2.1.3'
|
|||||||
|
|
||||||
|
|
||||||
from googletrans.client import Translator
|
from googletrans.client import Translator
|
||||||
from googletrans.constants import LANGUAGES
|
from googletrans.constants import LANGCODES, LANGUAGES
|
||||||
|
@ -10,7 +10,7 @@ import random
|
|||||||
from googletrans import urls, utils
|
from googletrans import urls, utils
|
||||||
from googletrans.compat import PY3
|
from googletrans.compat import PY3
|
||||||
from googletrans.gtoken import TokenAcquirer
|
from googletrans.gtoken import TokenAcquirer
|
||||||
from googletrans.constants import DEFAULT_USER_AGENT, LANGUAGES, SPECIAL_CASES
|
from googletrans.constants import DEFAULT_USER_AGENT, LANGCODES, LANGUAGES, SPECIAL_CASES
|
||||||
from googletrans.models import Translated, Detected
|
from googletrans.models import Translated, Detected
|
||||||
|
|
||||||
|
|
||||||
@ -50,19 +50,7 @@ class Translator(object):
|
|||||||
return self.service_urls[0]
|
return self.service_urls[0]
|
||||||
return random.choice(self.service_urls)
|
return random.choice(self.service_urls)
|
||||||
|
|
||||||
def _translate(self, text, dest='en', src='auto'):
|
def _translate(self, text, dest, src):
|
||||||
if src != 'auto':
|
|
||||||
if src not in LANGUAGES.keys() and src in SPECIAL_CASES.keys():
|
|
||||||
src = SPECIAL_CASES[src]
|
|
||||||
elif src not in LANGUAGES.keys():
|
|
||||||
raise ValueError('invalid source language')
|
|
||||||
|
|
||||||
if dest not in LANGUAGES.keys():
|
|
||||||
if dest in SPECIAL_CASES.keys():
|
|
||||||
dest = SPECIAL_CASES[dest]
|
|
||||||
else:
|
|
||||||
raise ValueError('invalid destination language')
|
|
||||||
|
|
||||||
if not PY3 and isinstance(text, str): # pragma: nocover
|
if not PY3 and isinstance(text, str): # pragma: nocover
|
||||||
text = text.decode('utf-8')
|
text = text.decode('utf-8')
|
||||||
|
|
||||||
@ -82,11 +70,13 @@ class Translator(object):
|
|||||||
:type text: UTF-8 :class:`str`; :class:`unicode`; string sequence (list, tuple, iterator, generator)
|
:type text: UTF-8 :class:`str`; :class:`unicode`; string sequence (list, tuple, iterator, generator)
|
||||||
|
|
||||||
:param dest: The language to translate the source text into.
|
:param dest: The language to translate the source text into.
|
||||||
The value should be one of the language codes listed in :const:`googletrans.LANGUAGES`.
|
The value should be one of the language codes listed in :const:`googletrans.LANGUAGES`
|
||||||
|
or one of the language names listed in :const:`googletrans.LANGCODES`.
|
||||||
:param dest: :class:`str`; :class:`unicode`
|
:param dest: :class:`str`; :class:`unicode`
|
||||||
|
|
||||||
:param src: The language of the source text.
|
:param src: The language of the source text.
|
||||||
The value should be one of the language codes listed in :const:`googletrans.LANGUAGES`.
|
The value should be one of the language codes listed in :const:`googletrans.LANGUAGES`
|
||||||
|
or one of the language names listed in :const:`googletrans.LANGCODES`.
|
||||||
If a language is not specified,
|
If a language is not specified,
|
||||||
the system will attempt to identify the source language automatically.
|
the system will attempt to identify the source language automatically.
|
||||||
:param src: :class:`str`; :class:`unicode`
|
:param src: :class:`str`; :class:`unicode`
|
||||||
@ -112,6 +102,25 @@ class Translator(object):
|
|||||||
jumps over -> 이상 점프
|
jumps over -> 이상 점프
|
||||||
the lazy dog -> 게으른 개
|
the lazy dog -> 게으른 개
|
||||||
"""
|
"""
|
||||||
|
dest = dest.lower().split('_', 1)[0]
|
||||||
|
src = src.lower().split('_', 1)[0]
|
||||||
|
|
||||||
|
if src != 'auto' and src not in LANGUAGES:
|
||||||
|
if src in SPECIAL_CASES:
|
||||||
|
src = SPECIAL_CASES[src]
|
||||||
|
elif src in LANGCODES:
|
||||||
|
src = LANGCODES[src]
|
||||||
|
else:
|
||||||
|
raise ValueError('invalid source language')
|
||||||
|
|
||||||
|
if dest not in LANGUAGES:
|
||||||
|
if dest in SPECIAL_CASES:
|
||||||
|
dest = SPECIAL_CASES[dest]
|
||||||
|
elif dest in LANGCODES:
|
||||||
|
dest = LANGCODES[dest]
|
||||||
|
else:
|
||||||
|
raise ValueError('invalid destination language')
|
||||||
|
|
||||||
if isinstance(text, list):
|
if isinstance(text, list):
|
||||||
result = []
|
result = []
|
||||||
for item in text:
|
for item in text:
|
||||||
|
@ -59,4 +59,6 @@ LANGUAGES = {
|
|||||||
'vi': 'vietnamese',
|
'vi': 'vietnamese',
|
||||||
'cy': 'welsh',
|
'cy': 'welsh',
|
||||||
'yi': 'yiddish',
|
'yi': 'yiddish',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LANGCODES = dict(map(reversed, LANGUAGES.items()))
|
||||||
|
@ -27,6 +27,16 @@ def test_unicode(translator):
|
|||||||
assert result.text == u'こんにちは。'
|
assert result.text == u'こんにちは。'
|
||||||
|
|
||||||
|
|
||||||
|
def test_language_name(translator):
|
||||||
|
result = translator.translate(u'Hello', src='ENGLISH', dest='iRiSh')
|
||||||
|
assert result.text == u'Dia dhuit'
|
||||||
|
|
||||||
|
|
||||||
|
def test_language_rfc1766(translator):
|
||||||
|
result = translator.translate(u'luna', src='it_ch@euro', dest='en')
|
||||||
|
assert result.text == u'moon'
|
||||||
|
|
||||||
|
|
||||||
def test_special_chars(translator):
|
def test_special_chars(translator):
|
||||||
text = u"©×《》"
|
text = u"©×《》"
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user