diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py index af20f0f184..038d07600f 100644 --- a/InvenTree/InvenTree/settings.py +++ b/InvenTree/InvenTree/settings.py @@ -26,6 +26,7 @@ import moneyed import yaml from django.utils.translation import gettext_lazy as _ from django.contrib.messages import constants as messages +import django.conf.locale def _is_true(x): @@ -682,6 +683,25 @@ LANGUAGES = [ ('zh-cn', _('Chinese')), ] +# Testing interface translations +if get_setting('TEST_TRANSLATIONS', False): + # Set default language + LANGUAGE_CODE = 'xx' + + # Add to language catalog + LANGUAGES.append(('xx', 'Test')) + + # Add custom languages not provided by Django + EXTRA_LANG_INFO = { + 'xx': { + 'code': 'xx', + 'name': 'Test', + 'name_local': 'Test' + }, + } + LANG_INFO = dict(django.conf.locale.LANG_INFO, **EXTRA_LANG_INFO) + django.conf.locale.LANG_INFO = LANG_INFO + # Currencies available for use CURRENCIES = CONFIG.get( 'currencies', diff --git a/tasks.py b/tasks.py index b33af84384..21f7616d76 100644 --- a/tasks.py +++ b/tasks.py @@ -3,6 +3,8 @@ import os import json import sys +import pathlib +import re try: from invoke import ctask as task @@ -469,6 +471,75 @@ def server(c, address="127.0.0.1:8000"): manage(c, "runserver {address}".format(address=address), pty=True) +@task(post=[translate_stats, static, server]) +def test_translations(c): + """ + Add a fictional language to test if each component is ready for translations + """ + import django + from django.conf import settings + + # setup django + base_path = os.getcwd() + new_base_path = pathlib.Path('InvenTree').absolute() + sys.path.append(str(new_base_path)) + os.chdir(new_base_path) + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'InvenTree.settings') + django.setup() + + # Add language + print("Add dummy language...") + print("========================================") + manage(c, "makemessages -e py,html,js --no-wrap -l xx") + + # change translation + print("Fill in dummy translations...") + print("========================================") + + file_path = pathlib.Path(settings.LOCALE_PATHS[0], 'xx', 'LC_MESSAGES', 'django.po') + new_file_path = str(file_path) + '_new' + + # complie regex + reg = re.compile( + r"[a-zA-Z0-9]{1}"+ # match any single letter and number + r"(?![^{\(\<]*[}\)\>])"+ # that is not inside curly brackets, brackets or a tag + r"(? replace regex matches with x in the read in (multi)string + file_new.write(f'msgstr "{reg.sub("x", last_string[7:-2])}"\n') + last_string = "" # reset (multi)string + elif line.startswith('msgid "'): + last_string = last_string + line # a new translatable string starts -> start append + file_new.write(line) + else: + if last_string: + last_string = last_string + line # a string is beeing read in -> continue appending + file_new.write(line) + + # change out translation files + os.rename(file_path, str(file_path) + '_old') + os.rename(new_file_path, file_path) + + # compile languages + print("Compile languages ...") + print("========================================") + manage(c, "compilemessages") + + # reset cwd + os.chdir(base_path) + + # set env flag + os.environ['TEST_TRANSLATIONS'] = 'True' + + @task def render_js_files(c): """