Source code for maidchan.translate
# -*- coding: utf-8 -*-
import logging
import shlex
import subprocess
from threading import Timer
from maidchan.constant import Constants
[docs]def get_trans_language_prediction(text):
args = [
"trans",
"-id",
text
]
# Execute
output = b""
p = subprocess.Popen(args, stdout=subprocess.PIPE, shell=False)
timer = Timer(10, p.kill) # Wait for 10 seconds
try:
timer.start()
(output, err) = p.communicate()
if err:
logging.error(err)
finally:
timer.cancel()
for key, val in list(Constants.TRANSLATION_DETECT.items()):
if key in output.decode("utf-8"):
return val
return ""
[docs]def get_translation(query):
# Initialize
source_language_str = None
target_language_str = None
# Split
try:
elements = shlex.split(query)
except Exception:
elements = [query]
source_list = []
skip = False
for index, element in enumerate(elements):
if element in Constants.TRANSLATION_KEYWORD or skip:
skip = False
continue
elif element in Constants.TRANSLATION_FROM:
if index < len(elements) - 1:
source_language_str = elements[index + 1]
skip = True
elif element in Constants.TRANSLATION_TO:
if index < len(elements) - 1:
target_language_str = elements[index + 1]
skip = True
else:
source_list.append(element)
source_text = " ".join(source_list)
# Find language mapping
source_language_key = None
target_language_key = None
for key, val in list(Constants.TRANSLATION_LANGUAGE.items()):
if source_language_str in val:
source_language_key = key
if target_language_str in val:
target_language_key = key
# Use trans online language detection
if not source_language_key:
source_language_key = get_trans_language_prediction(source_text)
# Use default mapping
if not target_language_key:
target_language_key = Constants.TRANSLATION_MAP[source_language_key]
args = [
"trans",
"-b",
"{}:{}".format(source_language_key, target_language_key),
source_text
]
# Execute
output = b""
p = subprocess.Popen(args, stdout=subprocess.PIPE, shell=False)
timer = Timer(10, p.kill) # Wait for 10 seconds
try:
timer.start()
(output, err) = p.communicate()
if err:
logging.error(err)
finally:
timer.cancel()
return output.decode("utf-8")