Как сказать Googletrans игнорировать определенные части? - PullRequest
0 голосов
/ 03 февраля 2019

Я хотел бы использовать googletrans для использования API Google Translate.Тем не менее, есть строки, в которых есть имена переменных:

User "%(first_name)s %(last_name)s (%(email)s)" has been deleted.

Если я использую это через googletrans, я получаю

from googletrans import Translator
translator = Translator()
translator.translate(u'User "%(first_name)s %(last_name)s (%(email)s)" has been assigned.', src='en', dest='fr').text

Я получаю следующее:

L'utilisateur "% (first_name) s% (last_name) s (% (email) s)" a été affecté.

Однако в «% (first_name) s% (last_name) s (% (email) s)» введены некоторые строки.Это можно обойти?Я уже пробовал:

u'User "<span class="notranslate">%(first_name)s %(last_name)s (%(email)s)</span>" has been assigned.'

1 Ответ

0 голосов
/ 10 февраля 2019

Кажется, Googletrans оставляет, например, __1__ нетронутым.Таким образом, вы можете заменить %(first_name)s на __0__, %(last_name)s на __1__ и т. Д. Перед переводом, а затем восстановить переменные.Вот код для этого:

from googletrans import Translator
import re

translator = Translator()
txtorig = u'User "%(first_name)s %(last_name)s (%(email)s)" has been assigned.'

# temporarily replace variables of format "%(example_name)s" with "__n__" to
#  protect them during translate()
VAR, REPL = re.compile(r'%\(\w+\)s'), re.compile(r'__(\d+)__')
varlist = []
def replace(matchobj):
  varlist.append(matchobj.group())
  return "__%d__" %(len(varlist)-1)
def restore(matchobj):
  return varlist[int(matchobj.group(1))]

txtorig = VAR.sub(replace, txtorig)
txttrans = translator.translate(txtorig, src='en', dest='fr').text
txttrans = REPL.sub(restore, txttrans)

print(txttrans)

Вот результат:

L'utilisateur "%(first_name)s %(last_name)s (%(email)s)" a été attribué.
...