Dynamic language switch in the GUI.

This commit is contained in:
Bastian Kleineidam 2014-03-01 12:01:47 +01:00
parent 9d0255e156
commit 900e04ceda
2 changed files with 43 additions and 6 deletions

View file

@ -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)

View file

@ -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)