Files
Argenta/translator.py
T
2025-11-04 11:21:35 +03:00

71 lines
2.0 KiB
Python

import polib
import deepl
import getopt
import sys
import re
DEEPL_API_TOKEN = 'ADD YOUR API KEY HERE!'
global argv
global opts
global args
argv = sys.argv[1:]
opts, args = getopt.getopt(argv, "f:l:")
def translate(text, lang):
# Define a dictionary to hold the mappings of tokens to placeholders
placeholders = {}
# Use a regular expression to find all the tokens
tokens = re.findall(r'%\((.*?)\)s', text)
# Replace each token with a unique placeholder
for i, token in enumerate(tokens):
placeholder = f'__PLACEHOLDER_{i}__'
placeholders[placeholder] = f'%({token})s'
text = text.replace(f'%({token})s', placeholder)
# Perform the translation
translator = deepl.Translator(DEEPL_API_TOKEN)
translated_text = str(translator.translate_text(text, target_lang=lang))
# Replace the placeholders back with the original tokens
for placeholder, token in placeholders.items():
translated_text = translated_text.replace(placeholder, token)
return translated_text
def get_filename():
# read arguments from command line
for opt, arg in opts:
if opt in ['-f']:
filename = arg
if not filename:
print('Please enter the filename of the PO file e.g. /directory/django.po:')
filename = input()
return filename
def get_target_language():
# read arguments from command line
for opt, arg in opts:
if opt in ['-l']:
lang = arg
if not lang:
print('Please enter two letter ISO language code e.g. DE:')
lang = input()
return lang
def process_file(filename, lang):
po = polib.pofile(filename)
for entry in po.untranslated_entries():
if not entry.msgstr:
print(entry.msgid)
print('translating...')
entry.msgstr = translate(entry.msgid, lang)
print(entry.msgstr)
print('\n')
po.save(filename)
if __name__ == '__main__':
process_file(get_filename(), get_target_language())