From 7c7a6e6a5992c0bdf5a9e1c25ae17634477ab48d Mon Sep 17 00:00:00 2001 From: Dylan Date: Sat, 18 Apr 2026 23:50:09 +0100 Subject: [PATCH] Finish translation implementation --- .github/workflows/deploy.yml | 3 ++- configHandler.py | 6 ++++-- requirements.txt | 3 ++- serverless.yml | 1 + translation.py | 22 +++++++++++++++++++++- twitfix.py | 2 +- 6 files changed, 31 insertions(+), 6 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 695ac90..f353456 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -70,4 +70,5 @@ jobs: VXTWITTER_GIF_CONVERT_API: ${{ secrets.VXTWITTER_GIF_CONVERT_API }} VXTWITTER_WORKAROUND_TOKENS: ${{ secrets.VXTWITTER_WORKAROUND_TOKENS }} VXTWITTER_PROXIES: ${{ secrets.VXTWITTER_PROXIES }} - SERVERLESS_ACCESS_KEY: ${{ secrets.SERVERLESS_ACCESS_KEY }} \ No newline at end of file + SERVERLESS_ACCESS_KEY: ${{ secrets.SERVERLESS_ACCESS_KEY }} + DEEPL_API_KEY: ${{ secrets.DEEPL_API_KEY }} \ No newline at end of file diff --git a/configHandler.py b/configHandler.py index f8e656b..9d89a7c 100644 --- a/configHandler.py +++ b/configHandler.py @@ -13,7 +13,8 @@ if ('RUNNING_SERVERLESS' in os.environ and os.environ['RUNNING_SERVERLESS'] == ' "url": os.getenv("VXTWITTER_URL","https://vxtwitter.com"), "combination_method": os.getenv("VXTWITTER_COMBINATION_METHOD","local"), # can either be 'local' or a URL to a server handling requests in the same format "gifConvertAPI":os.getenv("VXTWITTER_GIF_CONVERT_API",""), - "workaroundTokens":os.getenv("VXTWITTER_WORKAROUND_TOKENS",None) + "workaroundTokens":os.getenv("VXTWITTER_WORKAROUND_TOKENS",None), + "deeplKey":os.getenv("DEEPL_API_KEY",None), } } else: @@ -31,7 +32,8 @@ else: "url": "https://vxtwitter.com", "combination_method": "local", # can either be 'local' or a URL to a server handling requests in the same format "gifConvertAPI":"", - "workaroundTokens":None + "workaroundTokens":None, + "deeplKey":None } } diff --git a/requirements.txt b/requirements.txt index 209347e..b16d9f1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,4 +8,5 @@ Werkzeug==2.3.7 numerize==0.12 oauthlib==3.2.2 PyRTF3==0.47.5 -XClientTransaction==1.0.2 \ No newline at end of file +XClientTransaction==1.0.2 +deepl==1.3.0 \ No newline at end of file diff --git a/serverless.yml b/serverless.yml index 990545a..b5d8ce1 100644 --- a/serverless.yml +++ b/serverless.yml @@ -29,6 +29,7 @@ provider: VXTWITTER_COMBINATION_METHOD: ${env:VXTWITTER_COMBINATION_METHOD, 'local'} VXTWITTER_GIF_CONVERT_API: ${env:VXTWITTER_GIF_CONVERT_API, ''} VXTWITTER_WORKAROUND_TOKENS: ${env:VXTWITTER_WORKAROUND_TOKENS, ''} + DEEPL_API_KEY: ${env:DEEPL_API_KEY, ''} #VXTWITTER_PROXIES: ${env:VXTWITTER_PROXIES, ''} package: diff --git a/translation.py b/translation.py index 7e74ef4..939c236 100644 --- a/translation.py +++ b/translation.py @@ -1,7 +1,27 @@ +import deepl +from configHandler import config + validLanguages = ['AF', 'AN', 'AR', 'AS', 'AY', 'AZ', 'BA', 'BE', 'BG', 'BN', 'BR', 'BS', 'CA', 'CS', 'CY', 'DA', 'DE', 'DE-DE', 'EL', 'EN', 'EO', 'ES', 'ES-419', 'ET', 'EU', 'FA', 'FI', 'FR', 'FR-FR', 'GA', 'GL', 'GN', 'GU', 'HA', 'HE', 'HI', 'HR', 'HT', 'HU', 'HY', 'ID', 'IG', 'IS', 'IT', 'JA', 'JV', 'KA', 'KK', 'KO', 'KY', 'LA', 'LB', 'LN', 'LT', 'LV', 'MG', 'MI', 'MK', 'ML', 'MN', 'MR', 'MS', 'MT', 'MY', 'NB', 'NE', 'NL', 'OC', 'OM', 'PA', 'PL', 'PS', 'PT-BR', 'PT-PT', 'QU', 'RO', 'RU', 'SA', 'SK', 'SL', 'SQ', 'SR', 'ST', 'SU', 'SV', 'SW', 'TA', 'TE', 'TG', 'TH', 'TK', 'TL', 'TN', 'TR', 'TS', 'TT', 'UK', 'UR', 'UZ', 'VI', 'WO', 'XH', 'YI', 'ZH', 'ZH-HANS', 'ZH-HANT', 'ZU'] languageAliases = { #"EN":"EN-US", "JP":"JA", } -mergedLangs=(validLanguages+list(languageAliases.keys())) \ No newline at end of file +mergedLangs=(validLanguages+list(languageAliases.keys())) + +def getDeeplTranslation(text,target): + target = target.upper() + if target == "EN": + target = "EN-US" + try: + if 'deeplKey' not in config["config"] or config["config"]["deeplKey"] == None: + return None + deepl_client = deepl.Translator(config["config"]["deeplKey"]) + result = deepl_client.translate_text(text, target_lang=target) + return { + "text":result.text, + "source_language":result.detected_source_lang, + "destination_language":target + } + except Exception as e: + return None \ No newline at end of file diff --git a/twitfix.py b/twitfix.py index 13f7a9a..e2b16f4 100644 --- a/twitfix.py +++ b/twitfix.py @@ -290,7 +290,7 @@ def getTweetData(twitter_url,include_txt="false",include_rtf="false",tlLanguage= if tweetData["translation"] is None and tlLanguage is not None and tlLanguage != tweetData["lang"]: # translation probably failed on twitter's end - pass # TODO: implement DeepL api + tweetData["translation"] = translation.getDeeplTranslation(tweetData["text"],tlLanguage) if tweetData["translation"] is not None and tlLanguage is None: tweetData["translation"] = None # didn't ask for TL