From 9430c901414811be24441b3b6d3bca5951a07ab4 Mon Sep 17 00:00:00 2001 From: Martin Matejek Date: Fri, 7 Dec 2018 19:02:41 +0100 Subject: [PATCH] Refactoring of gettext translations --- cli2.py | 7 ++++ notifylib/notificationskeleton.py | 55 +++++-------------------------- plugins/simple.yml | 4 +-- 3 files changed, 17 insertions(+), 49 deletions(-) diff --git a/cli2.py b/cli2.py index 3f6ecfa..1a1ea0c 100755 --- a/cli2.py +++ b/cli2.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 import argparse +import gettext import json import logging import os @@ -125,6 +126,11 @@ def setup_logging(): logger.addHandler(handler_stderr) +def setup_gettext(locale): + translation = gettext.translation("notification-system", localedir='/usr/share/locale', languages=[locale]) or gettext.NullTranslations() + _ = translation.gettext + + def process_args(parser, args): """Call module interface based on args""" if args.config: @@ -195,6 +201,7 @@ def process_args(parser, args): def main(): setup_logging() + setup_gettext('cs_CZ') parser = create_argparser() args = parser.parse_args() diff --git a/notifylib/notificationskeleton.py b/notifylib/notificationskeleton.py index 81206c5..bd1a241 100644 --- a/notifylib/notificationskeleton.py +++ b/notifylib/notificationskeleton.py @@ -1,6 +1,7 @@ import gettext import jinja2 +import yaml class NotificationSkeleton: @@ -49,56 +50,15 @@ class NotificationSkeleton: return None def translate_actions(self, lang): + # Work in progress! actions = {} for a in self.actions: - actions[a] = self._translate(self.actions[a]['title'], lang) + parsed = yaml.safe_load(self.jinja_plugin_template.render()) + actions[a] = parsed['actions']['title'] return actions - def _translate(self, message, lang): - """Translate single variable content""" - transl = self._get_translation(lang) - - if transl: - transl.install() - - translated = gettext.gettext(_(message)) - - # reset translation to default - transl = gettext.NullTranslations() - transl.install() - - return translated - - return message - - def _fetch_translation(self, lang): - self.translations[lang] = gettext.translation(self.plugin_name, localedir='locale', languages=[lang]) - - def _get_translation(self, lang): - if lang in self.translations: - return self.translations[lang] - - try: - self._fetch_translation(lang) - return self.translations[lang] - except FileNotFoundError: - return None - - def _set_jinja_translation(self, lang): - """ - Set gettext translation for jinja env - - Try to load translation otherwise use NullTranslations - """ - transl = self._get_translation(lang) - - if transl: - self.jinja_env.install_gettext_translations(transl, newstyle=True) - else: - self.jinja_env.install_null_translations() - def init_jinja_env(self): """ Init jinja environment @@ -109,14 +69,15 @@ class NotificationSkeleton: template_loader = jinja2.FileSystemLoader(self.template_dir) self.jinja_env = jinja2.Environment( loader=template_loader, + autoescape=True, extensions=['jinja2.ext.i18n'] ) - self.jinja_template = self.jinja_env.get_template(self.template['src']) + self.jinja_message_template = self.jinja_env.get_template(self.template['src']) + self.jinja_plugin_template = self.jinja_env.get_template(self.template['plugin_src']) def render(self, data, media_type, lang): """Render using jinja in given language""" - self._set_jinja_translation(lang) - output = self.jinja_template.render(media=media_type, **data) + output = self.jinja_message_template.render(media=media_type, **data) return output diff --git a/plugins/simple.yml b/plugins/simple.yml index 219822f..0dbfe72 100644 --- a/plugins/simple.yml +++ b/plugins/simple.yml @@ -1,9 +1,9 @@ actions: - name: reject - title: Reject current update + title: "{% trans %}Reject current update{% endtrans %}" command: updater --reject-update - name: dummy - title: Dummy action + title: "{% trans %}Dummy action{% endtrans %}" command: /bin/true templates: - type: simple_message -- 2.22.0