Module: check_mk
Branch: master
Commit: 46962449a488d804da54289487a37884617d16cd
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=46962449a488d8…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Fri Feb 15 16:10:41 2019 +0100
7087 Extension packages can now provide individual localizations
Extension packages (MKPs) can now ship their own localization files in addition
to the standard localization file. With this change it is possible to split
different localization parts into separate files.
The GUI now recognizes the following localization file paths:
C+:
share/check_mk/locale/[LANG]/LC_MESSAGES/multisite.mo - Builtin, shipped with Check_MK.
local/share/check_mk/locale/[LANG]/LC_MESSAGES/multisite.mo - Site specific override,
extension of builtin localization
local/share/check_mk/locale/packages/[PKG_NAME]/[LANG]/LC_MESSAGES/multisite.mo -
Extension localization
C-:
The GUI searches these localization files from bottom to top when it searches for
a text to be localized.
Change-Id: I44f1915f83525bcaf41a711de107b4d422c42abd
---
.werks/7087 | 23 +++++++++++++++++++++++
cmk/gui/i18n.py | 30 ++++++++++++++++++++++++++----
tests/unit/cmk/gui/test_i18n.py | 25 +++++++++++++++++++------
3 files changed, 68 insertions(+), 10 deletions(-)
diff --git a/.werks/7087 b/.werks/7087
new file mode 100644
index 0000000..e109eda
--- /dev/null
+++ b/.werks/7087
@@ -0,0 +1,23 @@
+Title: Extension packages can now provide individual localizations
+Level: 1
+Component: multisite
+Compatible: compat
+Edition: cre
+Version: 1.6.0i1
+Date: 1550243073
+Class: feature
+
+Extension packages (MKPs) can now ship their own localization files in addition
+to the standard localization file. With this change it is possible to split
+different localization parts into separate files.
+
+The GUI now recognizes the following localization file paths:
+
+C+:
+share/check_mk/locale/[LANG]/LC_MESSAGES/multisite.mo - Builtin, shipped with Check_MK.
+local/share/check_mk/locale/[LANG]/LC_MESSAGES/multisite.mo - Site specific override,
extension of builtin localization
+local/share/check_mk/locale/packages/[PKG_NAME]/[LANG]/LC_MESSAGES/multisite.mo -
Extension localization
+C-:
+
+The GUI searches these localization files from bottom to top when it searches for
+a text to be localized.
diff --git a/cmk/gui/i18n.py b/cmk/gui/i18n.py
index 5ac4a2d..35392f4 100644
--- a/cmk/gui/i18n.py
+++ b/cmk/gui/i18n.py
@@ -70,16 +70,39 @@ def get_current_language():
def _get_language_dirs():
# type: () -> List[str]
+ return _get_base_language_dirs() + _get_package_language_dirs()
+
+
+def _get_base_language_dirs():
+ # type: () -> List[str]
return [cmk.utils.paths.locale_dir, cmk.utils.paths.local_locale_dir]
+def _get_package_language_dirs():
+ # type: () -> List[str]
+ """Return a list of extension package specific localization
directories
+
+ It's possible for extension packages to provide custom localization files
+ which are meant for localizing extension specific texts. These localizations
+ are then used in addition to the builtin and local localization files.
+ """
+ package_locale_dir = cmk.utils.paths.local_locale_dir + "/packages"
+ if not os.path.exists(package_locale_dir):
+ return []
+
+ dirs = []
+ for package_name in os.listdir(package_locale_dir):
+ dirs.append(package_locale_dir + "/" + package_name)
+ return dirs
+
+
def get_language_alias(lang):
# type: (Optional[str]) -> Text
if lang is None:
return _("English")
alias = lang
- for lang_dir in _get_language_dirs():
+ for lang_dir in _get_base_language_dirs():
try:
alias = open('%s/%s/alias' % (lang_dir, lang),
'r').read().strip()
except (OSError, IOError):
@@ -98,7 +121,7 @@ def get_languages():
try:
languages.update([(val, _("%s") % get_language_alias(val))
for val in os.listdir(lang_dir)
- if not '.' in val and os.path.isdir(lang_dir +
"/" + val)])
+ if val != "packages" and os.path.isdir(lang_dir +
"/" + val)])
except OSError:
# Catch "OSError: [Errno 2] No such file or
# directory:" when directory not exists
@@ -138,8 +161,7 @@ def _init_language(lang):
for locale_base_dir in _get_language_dirs():
try:
translation = gettext_module.translation(
- "multisite", locale_base_dir, languages=[lang],
- codeset='UTF-8') # type: gettext_module.NullTranslations
+ "multisite", locale_base_dir, languages=[lang],
codeset='UTF-8')
except IOError:
continue
diff --git a/tests/unit/cmk/gui/test_i18n.py b/tests/unit/cmk/gui/test_i18n.py
index 10bae17..ce5c9e6 100644
--- a/tests/unit/cmk/gui/test_i18n.py
+++ b/tests/unit/cmk/gui/test_i18n.py
@@ -27,11 +27,13 @@ def compile_builtin_po_files(locale_paths):
@pytest.fixture()
def local_translation():
- _add_local_translation("de", u"Äxtended German")
- _add_local_translation("xz", "Xz")
+ _add_local_translation("de", u"Äxtended German",
texts={"bla": "blub"})
+ _add_local_translation("xz", "Xz", texts={"bla":
"blub"})
+ # Add one package localization
+ _add_local_translation("packages/pkg_name/de", "pkg_name German",
texts={"pkg1": "lala"})
-def _add_local_translation(lang, alias):
+def _add_local_translation(lang, alias, texts):
local_dir = Path(cmk.utils.paths.local_locale_dir) / lang / "LC_MESSAGES"
local_dir.mkdir(parents=True) # pylint: disable=no-member
po_file = local_dir / "multisite.po"
@@ -52,11 +54,14 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\\n"
"Content-Transfer-Encoding: 8bit\\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\\n"
-
-msgid "bla"
-msgstr "blub"
''')
+ for key, val in texts.items():
+ f.write(u"""
+msgid "%s"
+msgstr "%s"
+""" % (key, val))
+
subprocess.call(['msgfmt', str(po_file), '-o', str(mo_file)])
@@ -118,6 +123,14 @@ def
test_init_language_with_local_modification_fallback(local_translation):
assert translated == "Alter"
+def test_init_language_with_package_localization(local_translation):
+ trans = i18n._init_language("de")
+
+ translated = trans.ugettext("pkg1")
+ assert isinstance(translated, unicode)
+ assert translated == "lala"
+
+
def test_get_language_alias():
assert isinstance(i18n.get_language_alias(None), unicode)
assert i18n.get_language_alias(None) == "English"