diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 21:38:38 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 21:38:38 +0000 |
commit | 2e2851dc13d73352530dd4495c7e05603b2e520d (patch) | |
tree | 622b9cd8e5d32091c9aa9e4937b533975a40356c /deluge/i18n/util.py | |
parent | Initial commit. (diff) | |
download | deluge-2e2851dc13d73352530dd4495c7e05603b2e520d.tar.xz deluge-2e2851dc13d73352530dd4495c7e05603b2e520d.zip |
Adding upstream version 2.1.2~dev0+20240219.upstream/2.1.2_dev0+20240219upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'deluge/i18n/util.py')
-rw-r--r-- | deluge/i18n/util.py | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/deluge/i18n/util.py b/deluge/i18n/util.py new file mode 100644 index 0000000..f6920fb --- /dev/null +++ b/deluge/i18n/util.py @@ -0,0 +1,153 @@ +# +# Copyright (C) 2007,2008 Andrew Resch <andrewresch@gmail.com> +# +# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with +# the additional special exception to link portions of this program with the OpenSSL library. +# See LICENSE for more details. +# + +import builtins +import ctypes +import gettext +import locale +import logging +import os +import sys +from glob import glob + +import deluge.common + +from .languages import LANGUAGES + +log = logging.getLogger(__name__) + +I18N_DOMAIN = 'deluge' + + +def get_translations_path(): + """Get the absolute path to the directory containing translation files""" + return deluge.common.resource_filename('deluge', 'i18n') + + +def get_languages(): + lang = [] + + translations_path = get_translations_path() + lc_messages_path = os.path.join('LC_MESSAGES', I18N_DOMAIN + '.mo') + for root, dirs, files in os.walk(translations_path): + # Get the dirs + lang_dirs = [ + lang_dir + for lang_dir in dirs + if glob(os.path.join(translations_path, lang_dir, lc_messages_path)) + ] + break + else: + return lang + + for i, lang_code in enumerate(lang_dirs): + name = '%s (Language name missing)' % lang_code + if lang_code in LANGUAGES: + name = LANGUAGES[lang_code] + lang.append([lang_code, _(name)]) + + lang = sorted(lang, key=lambda k: k[1]) + return lang + + +def set_language(lang): + """ + Set the language to use. + + gettext and GtkBuilder will load the translations from the specified + language. + + :param lang: the language, e.g. "en", "de" or "en_GB" + :type lang: str + """ + if not lang: + return + + # Necessary to set these environment variables for GtkBuilder + deluge.common.set_env_variable('LANGUAGE', lang) # Windows/Linux + deluge.common.set_env_variable('LANG', lang) # For OSX + + try: + translation = gettext.translation( + 'deluge', localedir=get_translations_path(), languages=[lang] + ) + except OSError: + log.warning('Unable to find translation (.mo) to set language: %s', lang) + else: + translation.install() + + +def setup_mock_translation(warn_msg=None): + def _func(*txt): + if warn_msg: + log.warning( + '"%s" has been marked for translation, but translation is unavailable.', + txt[0], + ) + return txt[0] + + builtins.__dict__['_'] = _func + builtins.__dict__['ngettext'] = builtins.__dict__['_n'] = _func + + +# Initialize gettext +def setup_translation(): + translations_path = get_translations_path() + log.info('Setting up translations from %s', translations_path) + + try: + if hasattr(locale, 'bindtextdomain'): + locale.bindtextdomain(I18N_DOMAIN, translations_path) + if hasattr(locale, 'textdomain'): + locale.textdomain(I18N_DOMAIN) + + gettext.bindtextdomain(I18N_DOMAIN, translations_path) + gettext.textdomain(I18N_DOMAIN) + + gettext.install(I18N_DOMAIN, translations_path, names=['ngettext']) + builtins.__dict__['_n'] = builtins.__dict__['ngettext'] + + def load_libintl(libintls): + errors = [] + libintl = None + for library in libintls: + try: + libintl = ctypes.cdll.LoadLibrary(library) + except OSError as ex: + errors.append(str(ex)) + else: + break + + if not libintl: + log.debug( + 'Unable to initialize gettext/locale:\n %s', '\n '.join(errors) + ) + setup_mock_translation() + return + + return libintl + + libintl = None + if deluge.common.windows_check(): + libintl = load_libintl(['libintl-8.dll', 'intl.dll']) + elif deluge.common.osx_check(): + libintl = load_libintl(['libintl.8.dylib', 'libintl.dylib']) + + if libintl: + libintl.bindtextdomain( + I18N_DOMAIN, translations_path.encode(sys.getfilesystemencoding()) + ) + libintl.textdomain(I18N_DOMAIN) + libintl.gettext.restype = ctypes.c_char_p + + except Exception as ex: + log.error('Unable to initialize gettext/locale!') + log.exception(ex) + setup_mock_translation() + + deluge.common.translate_size_units() |