openlp/openlp/core/utils/languagemanager.py

170 lines
6.9 KiB
Python
Raw Normal View History

2010-04-16 22:06:28 +00:00
# -*- coding: utf-8 -*-
# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
###############################################################################
# OpenLP - Open Source Lyrics Projection #
# --------------------------------------------------------------------------- #
# Copyright (c) 2008-2014 Raoul Snyman #
2014-01-14 19:25:18 +00:00
# Portions copyright (c) 2008-2014 Tim Bentley, Gerald Britton, Jonathan #
# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, #
2012-11-11 21:16:14 +00:00
# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer. #
2012-10-21 13:16:22 +00:00
# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru, #
# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, #
# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock, #
2012-11-07 21:37:01 +00:00
# Frode Woldsund, Martin Zibricky #
2010-04-16 22:06:28 +00:00
# --------------------------------------------------------------------------- #
# This program is free software; you can redistribute it and/or modify it #
# under the terms of the GNU General Public License as published by the Free #
# Software Foundation; version 2 of the License. #
# #
# This program is distributed in the hope that it will be useful, but WITHOUT #
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
# more details. #
# #
# You should have received a copy of the GNU General Public License along #
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
2010-06-29 07:07:03 +00:00
"""
The :mod:`languagemanager` module provides all the translation settings and
language file loading for OpenLP.
"""
2010-04-16 22:06:28 +00:00
import logging
import sys
2010-04-16 22:06:28 +00:00
from PyQt4 import QtCore, QtGui
2010-06-09 17:09:32 +00:00
2010-04-30 19:23:02 +00:00
from openlp.core.utils import AppLocation
2010-04-20 19:09:14 +00:00
from openlp.core.lib import translate
from openlp.core.lib.settings import Settings
2010-04-19 19:12:34 +00:00
log = logging.getLogger(__name__)
2010-04-16 22:06:28 +00:00
class LanguageManager(object):
"""
2010-06-08 15:38:09 +00:00
Helper for Language selection
2010-04-16 22:06:28 +00:00
"""
__qm_list__ = {}
auto_language = False
2010-04-16 22:06:28 +00:00
@staticmethod
2010-04-19 19:12:34 +00:00
def get_translator(language):
2010-06-29 07:07:03 +00:00
"""
Set up a translator to use in this instance of OpenLP
``language``
The language to load into the translator
"""
if LanguageManager.auto_language:
2010-04-16 22:06:28 +00:00
language = QtCore.QLocale.system().name()
lang_path = AppLocation.get_directory(AppLocation.LanguageDir)
2010-06-29 07:07:03 +00:00
app_translator = QtCore.QTranslator()
2011-04-23 15:15:01 +00:00
app_translator.load(language, lang_path)
# A translator for buttons and other default strings provided by Qt.
2011-05-02 18:24:28 +00:00
if sys.platform != u'win32' and sys.platform != u'darwin':
lang_path = QtCore.QLibraryInfo.location(
QtCore.QLibraryInfo.TranslationsPath)
2011-04-23 15:40:07 +00:00
default_translator = QtCore.QTranslator()
default_translator.load(u'qt_%s' % language, lang_path)
return app_translator, default_translator
2010-04-16 22:06:28 +00:00
@staticmethod
2010-04-19 19:12:34 +00:00
def find_qm_files():
2010-06-29 07:07:03 +00:00
"""
Find all available language files in this OpenLP install
"""
log.debug(u'Translation files: %s', AppLocation.get_directory(
AppLocation.LanguageDir))
trans_dir = QtCore.QDir(AppLocation.get_directory(
AppLocation.LanguageDir))
file_names = trans_dir.entryList(QtCore.QStringList(u'*.qm'),
2010-04-16 22:06:28 +00:00
QtCore.QDir.Files, QtCore.QDir.Name)
# Remove qm files from the list which start with "qt_".
file_names = file_names.filter(QtCore.QRegExp("^(?!qt_)"))
2010-06-29 07:07:03 +00:00
for name in file_names:
file_names.replaceInStrings(name, trans_dir.filePath(name))
return file_names
2010-04-16 22:06:28 +00:00
@staticmethod
2010-06-29 07:07:03 +00:00
def language_name(qm_file):
"""
Load the language name from a language file
``qm_file``
The file to obtain the name from
"""
translator = QtCore.QTranslator()
2010-06-29 07:07:03 +00:00
translator.load(qm_file)
return translator.translate('OpenLP.MainWindow', 'English',
2010-09-23 17:13:57 +00:00
'Please add the name of your language here')
2010-04-16 22:06:28 +00:00
@staticmethod
2010-04-19 19:12:34 +00:00
def get_language():
2010-06-29 07:07:03 +00:00
"""
Retrieve a saved language to use from settings
"""
settings = Settings()
2011-03-06 14:15:35 +00:00
language = unicode(settings.value(
2010-04-30 19:23:02 +00:00
u'general/language', QtCore.QVariant(u'[en]')).toString())
2010-04-19 19:12:34 +00:00
log.info(u'Language file: \'%s\' Loaded from conf file' % language)
2010-06-29 07:07:03 +00:00
reg_ex = QtCore.QRegExp("^\[(.*)\]")
if reg_ex.exactMatch(language):
LanguageManager.auto_language = True
2010-06-29 07:07:03 +00:00
language = reg_ex.cap(1)
2010-04-16 22:06:28 +00:00
return language
@staticmethod
2011-02-27 09:53:47 +00:00
def set_language(action, message=True):
2010-06-29 07:07:03 +00:00
"""
Set the language to translate OpenLP into
``action``
The language menu option
2011-02-27 09:53:47 +00:00
``message``
Display the message option
2010-06-29 07:07:03 +00:00
"""
language = u'en'
if action:
action_name = unicode(action.objectName())
2011-05-25 08:32:37 +00:00
if action_name == u'autoLanguageItem':
LanguageManager.auto_language = True
else:
LanguageManager.auto_language = False
qm_list = LanguageManager.get_qm_list()
language = unicode(qm_list[action_name])
if LanguageManager.auto_language:
language = u'[%s]' % language
Settings().setValue(
2010-04-30 19:23:02 +00:00
u'general/language', QtCore.QVariant(language))
2010-04-19 19:12:34 +00:00
log.info(u'Language file: \'%s\' written to conf file' % language)
2011-02-27 09:53:47 +00:00
if message:
QtGui.QMessageBox.information(None,
translate('OpenLP.LanguageManager', 'Language'),
translate('OpenLP.LanguageManager',
'Please restart OpenLP to use your new language setting.'))
2010-04-16 22:06:28 +00:00
@staticmethod
2010-04-19 19:12:34 +00:00
def init_qm_list():
2010-06-29 07:07:03 +00:00
"""
Initialise the list of available translations
"""
LanguageManager.__qm_list__ = {}
2010-06-29 07:07:03 +00:00
qm_files = LanguageManager.find_qm_files()
for counter, qmf in enumerate(qm_files):
reg_ex = QtCore.QRegExp("^.*i18n/(.*).qm")
if reg_ex.exactMatch(qmf):
name = u'%s' % reg_ex.cap(1)
LanguageManager.__qm_list__[u'%#2i %s' % (counter + 1,
LanguageManager.language_name(qmf))] = name
2010-04-16 22:06:28 +00:00
@staticmethod
2010-04-19 19:12:34 +00:00
def get_qm_list():
2010-06-29 07:07:03 +00:00
"""
Return the list of available translations
"""
if not LanguageManager.__qm_list__:
2010-04-19 19:12:34 +00:00
LanguageManager.init_qm_list()
return LanguageManager.__qm_list__