Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Assumes "auto" as source language if only one lang is passed #11

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
103 changes: 49 additions & 54 deletions plugin/ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,62 +6,57 @@
from flowlauncher import FlowLauncher

from googletrans import Translator
from googletrans.constants import LANGUAGES, SPECIAL_CASES
from plugin.templates import *
from plugin.extensions import _
import locale


class Main(FlowLauncher):
messages_queue = []

def sendNormalMess(self, title: str, subtitle: str):
message = copy.deepcopy(RESULT_TEMPLATE)
message["Title"] = title
message["SubTitle"] = subtitle

self.messages_queue.append(message)

def sendActionMess(self, title: str, subtitle: str, method: str, value: List):
# information
message = copy.deepcopy(RESULT_TEMPLATE)
message["Title"] = title
message["SubTitle"] = subtitle

# action
action = copy.deepcopy(ACTION_TEMPLATE)
action["JsonRPCAction"]["method"] = method
action["JsonRPCAction"]["parameters"] = value
message.update(action)

self.messages_queue.append(message)

def query(self, param: str) -> List[dict]:
query = param.strip()

query_modified = query.strip().lower()
splitted_params = query_modified.split(' ')


if len(splitted_params) < 3:
self.sendNormalMess(
"Direct Translate",
_("<Hotkey> <From Language> <To Language> <Text>")
)
else:
from_lang = splitted_params[0]
to_lang = splitted_params[1]

try:
translator = Translator()
translation = translator.translate(' '.join(splitted_params[2:]), src=from_lang, dest=to_lang)

self.sendNormalMess(
_(str(translation.text)),
query
)
except ValueError as error:
self.sendNormalMess(
_(str(error)),
query
)

return self.messages_queue
items = []

@staticmethod
def system_lang():
lang = locale.getdefaultlocale()
return lang[0][:2] if lang else "en"

def add_item(self, title: str, subtitle: str):
self.items.append({'Title': title, 'SubTitle': subtitle, 'IcoPath': ICON_PATH})

@staticmethod
def valid_lang(lang: str) -> bool:
return lang in LANGUAGES or lang in SPECIAL_CASES

def translate(self, src: str, dest: str, query: str):
try:
translator = Translator()
if src == "auto":
src = translator.detect(query).lang
sources = src if isinstance(src, list) else [src]
else: sources = [src]

for src in sources:
translation = translator.translate(query, src=src, dest=dest)
self.add_item(_(str(translation.text)), f"{src} → {dest} {query}")
except Exception as error:
self.add_item(_(str(error)), f"{src} → {dest} {query}")
return self.items

def help_action(self):
self.add_item("direct translate", _("<hotkey> <from language> <to language> <text>"))
return self.items

def query(self, param: str='') -> List[dict]:
query = param.strip().lower()
params = query.split(" ")

try:
if len(params) < 1 or len(params[0]) < 2 or not params[1]: return self.help_action()
# no lang_code: <auto> -> <system language>
if not self.valid_lang(params[0]): return self.translate("auto", self.system_lang(), query)
# one lang_code: <auto> -> lang_code
if not self.valid_lang(params[1]): return self.translate("auto", params[0], " ".join(params[1:]))
# 2 lang_codes: lang1 -> lang2
return self.translate(params[0], params[1], " ".join(params[2:]))
except IndexError:
return self.help_action()