Module: check_mk
Branch: master
Commit: ce3d897b866d6b11879c1c090ebff07bc27c576b
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=ce3d897b866d6b…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Fri Feb 15 14:52:14 2019 +0100
7086 Localizations now extend shipped localizations
Locally installed localization files (local/share/check_mk/locale) may
now extend the builtin localizations instead of overriding them.
In previous versions the local locale file had to contain all texts that
we ship with our standard localizations, for example the german localization
in case one wanted to extend / change a single text.
Now both, the builtin and local localization files are loaded. All texts
are searched in the local file and looked up in the builtin file as fallback
in case the text can not be found in the local file.
Change-Id: I7941ed5a489f83c53246157febb1f3a89f6356a6
---
.werks/7086 | 19 +++++++++++++++++++
cmk/gui/i18n.py | 39 +++++++++++++++++++++++----------------
tests/unit/cmk/gui/test_i18n.py | 36 +++++++++++++++---------------------
3 files changed, 57 insertions(+), 37 deletions(-)
diff --git a/.werks/7086 b/.werks/7086
new file mode 100644
index 0000000..6da4b90
--- /dev/null
+++ b/.werks/7086
@@ -0,0 +1,19 @@
+Title: Localizations now extend shipped localizations
+Level: 1
+Component: multisite
+Compatible: compat
+Edition: cre
+Version: 1.6.0i1
+Date: 1550238596
+Class: feature
+
+Locally installed localization files (local/share/check_mk/locale) may
+now extend the builtin localizations instead of overriding them.
+
+In previous versions the local locale file had to contain all texts that
+we ship with our standard localizations, for example the german localization
+in case one wanted to extend / change a single text.
+
+Now both, the builtin and local localization files are loaded. All texts
+are searched in the local file and looked up in the builtin file as fallback
+in case the text can not be found in the local file.
diff --git a/cmk/gui/i18n.py b/cmk/gui/i18n.py
index 48fbb87..5ac4a2d 100644
--- a/cmk/gui/i18n.py
+++ b/cmk/gui/i18n.py
@@ -130,22 +130,29 @@ def localize(lang):
def _init_language(lang):
# type: (str) -> Optional[gettext_module.NullTranslations]
- try:
- translation = gettext_module.translation(
- "multisite", _get_cmk_locale_path(lang), languages=[lang],
- codeset='UTF-8') # type: Optional[gettext_module.NullTranslations]
- except IOError:
- translation = None
-
- return translation
-
-
-def _get_cmk_locale_path(lang):
- # type: (str) -> str
- po_path = '/%s/LC_MESSAGES/multisite.mo' % lang
- if os.path.exists(cmk.utils.paths.local_locale_dir + po_path):
- return cmk.utils.paths.local_locale_dir
- return cmk.utils.paths.locale_dir
+ """Load all available "multisite" translation files. All are
loaded first.
+ The builtin ones are used as "fallback" for the local files which means
that
+ the texts in the local files have precedence.
+ """
+ translations = [] # type: List[gettext_module.NullTranslations]
+ 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
+
+ except IOError:
+ continue
+
+ # Create a chain of fallback translations
+ if translations:
+ translation.add_fallback(translations[-1])
+ translations.append(translation)
+
+ if not translations:
+ return None
+
+ return translations[-1]
def initialize():
diff --git a/tests/unit/cmk/gui/test_i18n.py b/tests/unit/cmk/gui/test_i18n.py
index 8504cd6..10bae17 100644
--- a/tests/unit/cmk/gui/test_i18n.py
+++ b/tests/unit/cmk/gui/test_i18n.py
@@ -75,15 +75,6 @@ def test_underscore_localization():
assert i18n.get_current_language() is None
-def test_get_locale_path():
- assert i18n._get_cmk_locale_path("de") == "%s/enterprise/locale"
% cmk_path()
- assert i18n._get_cmk_locale_path("xz") == "%s/enterprise/locale"
% cmk_path()
-
-
-def test_get_locale_path_with_local_modification(local_translation):
- assert i18n._get_cmk_locale_path("de") == cmk.utils.paths.local_locale_dir
-
-
def test_init_language_not_existing():
assert i18n._init_language("xz") is None
@@ -110,18 +101,21 @@ def test_init_language_with_local_modification(local_translation):
assert translated == "blub"
-# Will be enabled soon
-#def test_init_language_with_local_modification_fallback(local_translation):
-# trans = i18n._init_language("de")
-# assert isinstance(trans, gettext.GNUTranslations)
-# assert trans.info()["language"] == "de"
-# assert trans.info()["project-id-version"] == "Locally modified
Check_MK translation"
-#
-# # This string is localized in the standard file, not in the locally
-# # overridden file
-# translated = trans.ugettext("Age")
-# assert isinstance(translated, unicode)
-# assert translated == "Alter"
+def test_init_language_with_local_modification_fallback(local_translation):
+ trans = i18n._init_language("de")
+ assert isinstance(trans, gettext.GNUTranslations)
+ assert trans.info()["language"] == "de"
+ assert trans.info()["project-id-version"] == "Locally modified
Check_MK translation"
+
+ translated = trans.ugettext("bla")
+ assert isinstance(translated, unicode)
+ assert translated == "blub"
+
+ # This string is localized in the standard file, not in the locally
+ # overridden file
+ translated = trans.ugettext("Age")
+ assert isinstance(translated, unicode)
+ assert translated == "Alter"
def test_get_language_alias():