From 900e04cedab0ddf78d92c85b030d712f4f713819 Mon Sep 17 00:00:00 2001 From: Bastian Kleineidam Date: Sat, 1 Mar 2014 12:01:47 +0100 Subject: [PATCH] Dynamic language switch in the GUI. --- linkcheck/gui/__init__.py | 33 +++++++++++++++++++++++++++++++-- linkcheck/i18n.py | 16 ++++++++++++---- 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/linkcheck/gui/__init__.py b/linkcheck/gui/__init__.py index a9ca2679..0f1f1873 100644 --- a/linkcheck/gui/__init__.py +++ b/linkcheck/gui/__init__.py @@ -37,7 +37,7 @@ from .settings import Settings from .recentdocs import RecentDocumentModel from .projects import openproject, saveproject, loadproject, ProjectExt from .. import configuration, checker, director, get_link_pat, \ - strformat, fileutil, LinkCheckerError + strformat, fileutil, LinkCheckerError, i18n from ..containers import enum from .. import url as urlutil from ..checker import httpheaders @@ -135,6 +135,18 @@ class LinkCheckerMain (QtGui.QMainWindow, Ui_MainWindow): def init_menu (self): """Add menu entries for bookmark file checking.""" self.urlinput.addMenuEntries(self.menuEdit) + self.menuLang = self.menuEdit.addMenu(_('Languages')) + self.menuLang.setTitle(_("&Language")) + # ensure only one action is checked + langActionGroup = QtGui.QActionGroup(self) + langActionGroup.triggered.connect(self.switch_language) + for i, lang in enumerate(sorted(i18n.supported_languages)): + action = self.menuLang.addAction("&%d %s" % (i, lang)) + action.setCheckable(True) + action.setData(lang) + if lang == i18n.default_language: + action.setChecked(True) + langActionGroup.addAction(action) def init_drop(self): """Set and activate drag-and-drop functions.""" @@ -309,7 +321,7 @@ class LinkCheckerMain (QtGui.QMainWindow, Ui_MainWindow): elif status == Status.checking: self.treeView.setSortingEnabled(False) self.debug.reset() - self.set_statusmsg(u"Checking site...") + self.set_statusmsg(_(u"Checking site...")) # disable commands self.menubar.setEnabled(False) self.urlinput.setEnabled(False) @@ -580,3 +592,20 @@ Version 2 or later. loadproject(self, filename) else: self.urlinput.setText(url.toString()) + + def retranslateUi(self, Window): + """Translate menu titles.""" + super(LinkCheckerMain, self).retranslateUi(Window) + # self.menu_lang is created after calling retranslateUi + # the first time, so check for its excistance + if hasattr(self, "menu_lang"): + self.menuLang.setTitle(_("&Language")) + + def switch_language(self, action): + """Change UI language.""" + lang = str(action.data().toString()) + i18n.install_language(lang) + self.retranslateUi(self) + self.options.retranslateUi(self.options) + self.debug.retranslateUi(self.debug) + self.editor.retranslateUi(self.editor) diff --git a/linkcheck/i18n.py b/linkcheck/i18n.py index 65523a60..8e9cd22e 100644 --- a/linkcheck/i18n.py +++ b/linkcheck/i18n.py @@ -28,6 +28,8 @@ import codecs # more supported languages are added in init() supported_languages = set(['en']) default_language = default_encoding = None +default_directory = None +default_domain = None def install_builtin (translator, do_unicode): """Install _() and _n() gettext methods into default namespace.""" @@ -62,7 +64,9 @@ class NullTranslator (gettext.NullTranslations): def init (domain, directory, loc=None): """Initialize this gettext i18n module. Searches for supported languages and installs the gettext translator class.""" - global default_language, default_encoding + global default_language, default_encoding, default_domain, default_directory + default_directory = directory + default_domain = domain if os.path.isdir(directory): # get supported languages for lang in os.listdir(directory): @@ -81,9 +85,13 @@ def init (domain, directory, loc=None): # Even if the default language is not supported, the encoding should # be installed. Otherwise the Python installation is borked. default_encoding = encoding - # install translation service routines into default namespace - translator = get_translator(domain, directory, - languages=[default_language], fallback=True) + install_language(default_language) + + +def install_language(language): + """Install translation service routines into default namespace.""" + translator = get_translator(default_domain, default_directory, + languages=[get_lang(language)], fallback=True) do_unicode = True translator.install(do_unicode)