def test_translate(self, Translator): page = create_test_page( title="Test page", slug="test-page", test_charfield="Some translatable content", test_richtextfield="<p>Translatable <b>rich text</b></p>", ) request_page = self.add_page_to_request(page) # Mock response from Google Translate Translator().translate.return_value = [ Translated( "en", "fr", "Some translatable content", "Certains contenus traduisibles", "Certains contenus traduisibles", ), Translated( "en", "fr", "Translatable rich text", "Texte riche traduisible", "Texte riche traduisible", ), ] response = self.client.post( reverse( "wagtail_localize_google_translate:translate", args=[self.translation_request.id], ), {"publish": "on"}, ) self.assertRedirects( response, reverse( "wagtail_localize_workflow_management:detail", args=[self.translation_request.id], ), ) Translator().translate.assert_called_with( ["Some translatable content", "Translatable rich text"], dest="fr", src="en" ) request_page.refresh_from_db() self.assertTrue(request_page.is_completed) translated_page = page.get_translation(Locale.objects.get(language_code="fr")) self.assertTrue(translated_page.live) self.assertEqual( translated_page.test_charfield, "Certains contenus traduisibles" ) self.assertEqual( translated_page.test_richtextfield, "<p>Texte riche traduisible</p>" )
def test_translate_with_nested_snippet(self, Translator): snippet = TestSnippet.objects.create(field="Some test snippet content") page = create_test_page( title="Test page", slug="test-page", test_snippet=snippet ) request_page = self.add_page_to_request(page) # Mock response from Google Translate Translator().translate.return_value = [ Translated( "en", "fr", "Some test snippet content", "Du contenu d'extrait de test", "Du contenu d'extrait de test", ) ] response = self.client.post( reverse( "wagtail_localize_google_translate:translate", args=[self.translation_request.id], ), {"publish": "on"}, ) self.assertRedirects( response, reverse( "wagtail_localize_workflow_management:detail", args=[self.translation_request.id], ), ) Translator().translate.assert_called_with( ["Some test snippet content"], dest="fr", src="en" ) request_page.refresh_from_db() self.assertTrue(request_page.is_completed) translated_page = page.get_translation(Locale.objects.get(language_code="fr")) self.assertEqual( translated_page.test_snippet.field, "Du contenu d'extrait de test" )
def translate(self, text, dest='en', src='auto'): dest = dest.lower().split('_', 1)[0] src = src.lower().split('_', 1)[0] origin = text data = self._translate(text, dest, src, None) # this code will be updated when the format is changed. / Googletrans Author note translated = ''.join([d[0] if d[0] else '' for d in data[0]]) pron = 'No pronunciation' if data[0][1][-1] is not None: pron = data[0][1][-1] return Translated(src=src, dest=dest, origin=origin, text=translated, pronunciation=pron)
def translate(self, text, dest='en', src='auto', **kwargs): """Translate text from source language to destination language :param text: The source text(s) to be translated. Batch translation is supported via sequence input. :type text: UTF-8 :class:`str`; :class:`unicode`; string sequence (list, tuple, iterator, generator) :param dest: The language to translate the source text into. 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 src: The language of the source text. 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, the system will attempt to identify the source language automatically. :param src: :class:`str`; :class:`unicode` :rtype: Translated :rtype: :class:`list` (when a list is passed) Basic usage: >>> from googletrans import Translator >>> translator = Translator() >>> translator.translate('안녕하세요.') <Translated src=ko dest=en text=Good evening. pronunciation=Good evening.> >>> translator.translate('안녕하세요.', dest='ja') <Translated src=ko dest=ja text=こんにちは。 pronunciation=Kon'nichiwa.> >>> translator.translate('veritas lux mea', src='la') <Translated src=la dest=en text=The truth is my light pronunciation=The truth is my light> Advanced usage: >>> translations = translator.translate(['The quick brown fox', 'jumps over', 'the lazy dog'], dest='ko') >>> for translation in translations: ... print(translation.origin, ' -> ', translation.text) The quick brown fox -> 빠른 갈색 여우 jumps over -> 이상 점프 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): result = [] for item in text: translated = self.translate(item, dest=dest, src=src, **kwargs) result.append(translated) return result origin = text data = self._translate(text, dest, src, kwargs) # this code will be updated when the format is changed. translated = ''.join([d[0] if d[0] else '' for d in data[0]]) extra_data = self._parse_extra_data(data) # actual source language that will be recognized by Google Translator when the # src passed is equal to auto. try: src = data[2] except Exception: # pragma: nocover pass pron = origin try: pron = data[0][1][-2] except Exception: # pragma: nocover pass if pron is None: try: pron = data[0][1][2] except: # pragma: nocover pass if dest in EXCLUDES and pron == origin: pron = translated # put final values into a new Translated object result = Translated(src=src, dest=dest, origin=origin, text=translated, pronunciation=pron, extra_data=extra_data) return result
def translate(self, text, dest='en', src='auto'): """Translate text from source language to destination language :param text: The source text(s) to be translated. Batch translation is supported via sequence input. :type text: UTF-8 :class:`str`; :class:`unicode`; string sequence (list, tuple, iterator, generator) :param dest: The language to translate the source text into. The value should be one of the language codes listed in :const:`googletrans.LANGUAGES`. :param dest: :class:`str`; :class:`unicode` :param src: The language of the source text. The value should be one of the language codes listed in :const:`googletrans.LANGUAGES`. If a language is not specified, the system will attempt to identify the source language automatically. :param src: :class:`str`; :class:`unicode` :rtype: Translated :rtype: :class:`list` (when a list is passed) Basic usage: >>> from googletrans import Translator >>> translator = Translator() >>> translator.translate('안녕하세요.') <Translated src=ko dest=en text=Good evening. pronunciation=Good evening.> >>> translator.translate('안녕하세요.', dest='ja') <Translated src=ko dest=ja text=こんにちは。 pronunciation=Kon'nichiwa.> >>> translator.translate('veritas lux mea', src='la') <Translated src=la dest=en text=The truth is my light pronunciation=The truth is my light> Advanced usage: >>> translations = translator.translate(['The quick brown fox', 'jumps over', 'the lazy dog'], dest='ko') >>> for translation in translations: ... print(translation.origin, ' -> ', translation.text) The quick brown fox -> 빠른 갈색 여우 jumps over -> 이상 점프 the lazy dog -> 게으른 개 """ if isinstance(text, list): result = [] for item in text: translated = self.translate(item, dest=dest, src=src) result.append(translated) return result origin = text data = self._translate(text, dest, src) # this code will be updated when the format is changed. translated = ''.join([d[0] if d[0] else '' for d in data[0]]) # actual source language that will be recognized by Google Translator when the # src passed is equal to auto. try: src = data[-1][0][0] except Exception: # pragma: nocover pass pron = origin try: pron = data[0][1][-1] except Exception: # pragma: nocover pass if not PY3 and isinstance(pron, unicode) and isinstance( origin, str): # pragma: nocover origin = origin.decode('utf-8') if dest in EXCLUDES and pron == origin: pron = translated # for python 2.x compatbillity if not PY3: # pragma: nocover if isinstance(src, str): src = src.decode('utf-8') if isinstance(dest, str): dest = dest.decode('utf-8') if isinstance(translated, str): translated = translated.decode('utf-8') # put final values into a new Translated object result = Translated(src=src, dest=dest, origin=origin, text=translated, pronunciation=pron) return result
async def translate(self, text: str, dest='en', src='auto'): 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') origin = text data, response = await self._translate(text, dest, src) token_found = False square_bracket_counts = [0, 0] resp = '' for line in data.split('\n'): token_found = token_found or f'"{RPC_ID}"' in line[:30] if not token_found: continue is_in_string = False for index, char in enumerate(line): if char == '\"' and line[max(0, index - 1)] != '\\': is_in_string = not is_in_string if not is_in_string: if char == '[': square_bracket_counts[0] += 1 elif char == ']': square_bracket_counts[1] += 1 resp += line if square_bracket_counts[0] == square_bracket_counts[1]: break data = json.loads(resp) parsed = json.loads(data[0][2]) # not sure should_spacing = parsed[1][0][0][3] translated_parts = list(map(lambda part: TranslatedPart(part[0], part[1] if len(part) >= 2 else []), parsed[1][0][0][5])) translated = (' ' if should_spacing else '').join(map(lambda part: part.text, translated_parts)) if src == 'auto': try: src = parsed[2] except: pass if src == 'auto': try: src = parsed[0][2] except: pass # currently not available confidence = None origin_pronunciation = None try: origin_pronunciation = parsed[0][0] except: pass pronunciation = None try: pronunciation = parsed[1][0][0][1] except: pass extra_data = { 'confidence': confidence, 'parts': translated_parts, 'origin_pronunciation': origin_pronunciation, 'parsed': parsed, } result = Translated(src=src, dest=dest, origin=origin, text=translated, pronunciation=pronunciation, parts=translated_parts, extra_data=extra_data, response=response) return result
def translate(self, text: str, dest='en', src='auto'): """Translate text from source language to destination language :param text: The source text(s) to be translated. Batch translation is supported via sequence input. :type text: UTF-8 :class:`str`; :class:`unicode`; string sequence (list, tuple, iterator, generator) :param dest: The language to translate the source text into. 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 src: The language of the source text. 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, the system will attempt to identify the source language automatically. :param src: :class:`str`; :class:`unicode` :rtype: Translated :rtype: :class:`list` (when a list is passed) Basic usage: >>> from googletrans import Translator >>> translator = Translator() >>> translator.translate('안녕하세요.') <Translated src=ko dest=en text=Good evening. pronunciation=Good evening.> >>> translator.translate('안녕하세요.', dest='ja') <Translated src=ko dest=ja text=こんにちは。 pronunciation=Kon'nichiwa.> >>> translator.translate('veritas lux mea', src='la') <Translated src=la dest=en text=The truth is my light pronunciation=The truth is my light> Advanced usage: >>> translations = translator.translate(['The quick brown fox', 'jumps over', 'the lazy dog'], dest='ko') >>> for translation in translations: ... print(translation.origin, ' -> ', translation.text) The quick brown fox -> 빠른 갈색 여우 jumps over -> 이상 점프 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') origin = text data, response = self._translate(text, dest, src) token_found = False square_bracket_counts = [0, 0] resp = '' for line in data.split('\n'): token_found = token_found or f'"{RPC_ID}"' in line[:30] if not token_found: continue is_in_string = False for index, char in enumerate(line): if char == '\"' and line[max(0, index - 1)] != '\\': is_in_string = not is_in_string if not is_in_string: if char == '[': square_bracket_counts[0] += 1 elif char == ']': square_bracket_counts[1] += 1 resp += line if square_bracket_counts[0] == square_bracket_counts[1]: break data = json.loads(resp) parsed = json.loads(data[0][2]) # not sure should_spacing = parsed[1][0][0][3] translated_parts = None translated = None try: translated_parts = list( map( lambda part: TranslatedPart( part[0], part[1] if len(part) >= 2 else []), parsed[1][0][0][5])) except TypeError: translated_parts = [ TranslatedPart(parsed[1][0][1][0], [parsed[1][0][0][0], parsed[1][0][1][0]]) ] translated = (' ' if should_spacing else '').join( map(lambda part: part.text, translated_parts)) if src == 'auto': try: src = parsed[2] except TypeError: pass if src == 'auto': try: src = parsed[0][2] except TypeError: pass # currently not available confidence = None origin_pronunciation = None try: origin_pronunciation = parsed[0][0] except TypeError: pass pronunciation = None try: pronunciation = parsed[1][0][0][1] except TypeError: pass mistake = None try: mistake = parsed[0][1][0][0][1] except TypeError: pass extra_data = { 'confidence': confidence, 'parts': translated_parts, 'possible-mistakes': [mistake, utils.strip_html_tags(mistake)], 'src-pronunciation': origin_pronunciation, 'parsed': parsed, } result = Translated(src=src, dest=dest, origin=origin, text=translated, pronunciation=pronunciation, parts=translated_parts, extra_data=extra_data, response=response) return result
def translate(self, text, dest='en', src='auto'): """ Translate the passed text into destination language. Basic usage: >>> from googletrans import Translator >>> translator = Translator() >>> translator.translate('안녕하세요.') <Translated src=ko dest=en text=Good evening. pronunciation=Good evening.> >>> translator.translate('안녕하세요.', dest='ja') <Translated src=ko dest=ja text=こんにちは。 pronunciation=Kon'nichiwa.> >>> translator.translate('veritas lux mea', src='la') <Translated src=la dest=en text=The truth is my light pronunciation=The truth is my light> Advanced usage: >>> translations = translator.translate(['The quick brown fox', 'jumps over', 'the lazy dog'], dest='ko') >>> for translation in translations: ... print(translation.origin, ' -> ', translation.text) The quick brown fox -> 빠른 갈색 여우 jumps over -> 이상 점프 the lazy dog -> 게으른 개 :param text: the text you want to translate. you can pass this parameter as a list object, as shown in the advanced usage above. :param dest: the destination language you want to translate. (default: en) :param src: the source language you want to translate. (default: auto) :rtype: Translated :rtype: list (when list is passed) """ if isinstance(text, list): result = [] for item in text: translated = self.translate(item, dest=dest, src=src) result.append(translated) return result origin = text data = self._translate(text, dest, src) # this code will be updated when the format is changed. translated = data[0][0][0] # actual source language that will be recognized by Google Translator when the # src passed is equal to auto. try: src = data[-1][0][0] except Exception: # pragma: nocover pass pron = origin try: pron = data[0][1][-1] except Exception: # pragma: nocover pass if not PY3 and isinstance(pron, unicode) and isinstance( origin, str): # pragma: nocover origin = origin.decode('utf-8') if dest in EXCLUDES and pron == origin: pron = translated # for python 2.x compatbillity if not PY3: # pragma: nocover if isinstance(src, str): src = src.decode('utf-8') if isinstance(dest, str): dest = dest.decode('utf-8') if isinstance(translated, str): translated = translated.decode('utf-8') # put final values into a new Translated object result = Translated(src=src, dest=dest, origin=origin, text=translated, pronunciation=pron) return result