django-rosetta/rosetta/conf/__init__.py
2023-01-01 14:17:08 +01:00

117 lines
4.4 KiB
Python

"""
For a description of each rosetta setting see: docs/settings.rst.
"""
from django.conf import settings as dj_settings
from django.core.signals import setting_changed
__all__ = ["settings"]
class RosettaSettings(object):
"""
Class that holds rosetta settings.
The settings object is an instance of this class and is reloaded when
the ``setting_changed`` signal is dispatched.
"""
SETTINGS = {
"ROSETTA_MESSAGES_PER_PAGE": ("MESSAGES_PER_PAGE", 10),
"ROSETTA_ENABLE_TRANSLATION_SUGGESTIONS": (
"ENABLE_TRANSLATION_SUGGESTIONS",
False,
),
"YANDEX_TRANSLATE_KEY": ("YANDEX_TRANSLATE_KEY", None),
"AZURE_CLIENT_SECRET": ("AZURE_CLIENT_SECRET", None),
"GOOGLE_APPLICATION_CREDENTIALS_PATH": (
"GOOGLE_APPLICATION_CREDENTIALS_PATH",
None,
),
"GOOGLE_PROJECT_ID": ("GOOGLE_PROJECT_ID", None),
"DEEPL_AUTH_KEY": ("DEEPL_AUTH_KEY", None),
"ROSETTA_MAIN_LANGUAGE": ("MAIN_LANGUAGE", None),
"ROSETTA_MESSAGES_SOURCE_LANGUAGE_CODE": (
"MESSAGES_SOURCE_LANGUAGE_CODE",
"en",
),
"ROSETTA_MESSAGES_SOURCE_LANGUAGE_NAME": (
"MESSAGES_SOURCE_LANGUAGE_NAME",
"English",
),
"ROSETTA_ACCESS_CONTROL_FUNCTION": ("ACCESS_CONTROL_FUNCTION", None),
"ROSETTA_WSGI_AUTO_RELOAD": ("WSGI_AUTO_RELOAD", False),
"ROSETTA_UWSGI_AUTO_RELOAD": ("UWSGI_AUTO_RELOAD", False),
"ROSETTA_EXCLUDED_APPLICATIONS": ("EXCLUDED_APPLICATIONS", ()),
"ROSETTA_POFILE_WRAP_WIDTH": ("POFILE_WRAP_WIDTH", 78),
"ROSETTA_STORAGE_CLASS": (
"STORAGE_CLASS",
"rosetta.storage.CacheRosettaStorage",
),
"ROSETTA_ENABLE_REFLANG": ("ENABLE_REFLANG", False),
"ROSETTA_POFILENAMES": ("POFILENAMES", ("django.po", "djangojs.po")),
"ROSETTA_CACHE_NAME": (
"ROSETTA_CACHE_NAME",
"rosetta" if "rosetta" in dj_settings.CACHES else "default",
),
"ROSETTA_REQUIRES_AUTH": ("ROSETTA_REQUIRES_AUTH", True),
"ROSETTA_EXCLUDED_PATHS": ("ROSETTA_EXCLUDED_PATHS", ()),
"ROSETTA_LANGUAGE_GROUPS": ("ROSETTA_LANGUAGE_GROUPS", False),
"ROSETTA_AUTO_COMPILE": ("AUTO_COMPILE", True),
"ROSETTA_SHOW_AT_ADMIN_PANEL": ("SHOW_AT_ADMIN_PANEL", False),
"ROSETTA_LOGIN_URL": ("LOGIN_URL", dj_settings.LOGIN_URL),
"ROSETTA_LANGUAGES": ("ROSETTA_LANGUAGES", dj_settings.LANGUAGES),
"ROSETTA_SHOW_OCCURRENCES": ("SHOW_OCCURRENCES", True),
# Deepl API language codes are different then those of django, so if this is not set according to your desired languages,
# We use the first 2 letters of django language code.
# In which case it would work fine for most of the languages,
# But for 'en' if you want "EN-GB" for example, please set it in this dictionary.
# you can find the supported languages list of DeepL API here: https://www.deepl.com/docs-api/translating-text/request/
# ex: DEEPL_LANGUAGES = {"fr": "FR", "en": "EN-GB", "zh_Hans": "ZH"}
"DEEPL_LANGUAGES": ("DEEPL_LANGUAGES", {}),
}
def __init__(self):
# make sure we don't assign self._settings directly here, to avoid
# recursion in __setattr__, we delegate to the parent instead
super(RosettaSettings, self).__setattr__("_settings", {})
self.load()
def load(self):
for user_setting, (rosetta_setting, default) in self.SETTINGS.items():
self._settings[rosetta_setting] = getattr(
dj_settings, user_setting, default
)
def reload(self):
self.__init__()
def __getattr__(self, attr):
if attr not in self._settings:
raise AttributeError(
"'RosettaSettings' object has not attribute '%s'" % attr
)
return self._settings[attr]
def __setattr__(self, attr, value):
if attr not in self._settings:
raise AttributeError(
"'RosettaSettings' object has not attribute '%s'" % attr
)
self._settings[attr] = value
# This is our global settings object
settings = RosettaSettings()
# Signal handler to reload settings when needed
def reload_settings(*args, **kwargs):
val = kwargs.get("setting")
if val in settings.SETTINGS:
settings.reload()
# Connect the setting_changed signal to our handler
setting_changed.connect(reload_settings)