From ce1ab6ee5eb5b9ba2cdb236518d61cedf634a624 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 26 Feb 2011 09:26:17 +0000 Subject: [PATCH 01/90] Initial bits --- openlp.pyw | 8 +++++++- openlp/core/utils/languagemanager.py | 3 +-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index 85ba81fba..565d5936f 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -172,6 +172,10 @@ class OpenLP(QtGui.QApplication): self.setApplicationVersion(app_version[u'version']) if os.name == u'nt': self.setStyleSheet(application_stylesheet) + # First time checks in settings + if QtCore.QSettings().value( + u'general/first time', QtCore.QVariant(True)).toBool(): + print "first time" show_splash = QtCore.QSettings().value( u'general/show splash', QtCore.QVariant(True)).toBool() if show_splash: @@ -273,7 +277,9 @@ def main(): qInitResources() # Now create and actually run the application. app = OpenLP(qt_args) - #i18n Set Language + # Define the settings environment + QtCore.QSettings(u'OpenLP', u'OpenLP') + # i18n Set Language language = LanguageManager.get_language() appTranslator = LanguageManager.get_translator(language) app.installTranslator(appTranslator) diff --git a/openlp/core/utils/languagemanager.py b/openlp/core/utils/languagemanager.py index ced2fa843..43d2a8e67 100644 --- a/openlp/core/utils/languagemanager.py +++ b/openlp/core/utils/languagemanager.py @@ -89,8 +89,7 @@ class LanguageManager(object): """ Retrieve a saved language to use from settings """ - settings = QtCore.QSettings(u'OpenLP', u'OpenLP') - language = unicode(settings.value( + language = unicode(QtCore.QSettings().value( u'general/language', QtCore.QVariant(u'[en]')).toString()) log.info(u'Language file: \'%s\' Loaded from conf file' % language) reg_ex = QtCore.QRegExp("^\[(.*)\]") From 69193825a9e6e94c3ce9f942f8bebf07174d487c Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 26 Feb 2011 09:26:49 +0000 Subject: [PATCH 02/90] Form --- resources/forms/firsttimewizard.ui | 373 +++++++++++++++++++++++++++++ 1 file changed, 373 insertions(+) create mode 100644 resources/forms/firsttimewizard.ui diff --git a/resources/forms/firsttimewizard.ui b/resources/forms/firsttimewizard.ui new file mode 100644 index 000000000..b4442e9f0 --- /dev/null +++ b/resources/forms/firsttimewizard.ui @@ -0,0 +1,373 @@ + + + FirstTimeWizard + + + + 0 + 0 + 550 + 386 + + + + First Time Wizard + + + true + + + QWizard::ModernStyle + + + QWizard::IndependentPages|QWizard::NoBackButtonOnStartPage + + + + + + + + + + + 8 + + + 0 + + + + + + 163 + 0 + + + + + 163 + 16777215 + + + + 0 + + + + + + :/wizards/wizard_importbible.bmp + + + 0 + + + + + + + 8 + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt; font-weight:600;">Welcome to the First Time Wizard</span></p></body></html> + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 40 + + + + + + + + This wizard will help you to configure OpenLP for initial use . Click the next button below to start the process of selection your initial options. + + + true + + + 10 + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + Activate required Plugins + + + Select the Plugins you wish to use. + + + + + + + + Songs + + + true + + + + + + + Custom Text + + + true + + + + + + + Bible + + + true + + + + + + + Images + + + true + + + + + + + Presentations + + + true + + + + + + + Media (Audio and Video) + + + true + + + + + + + Remote Control + + + + + + + Monitor Song Usage + + + true + + + + + + + + + + Download Samples from OpenLP.org + + + Select samples to downlaod and install for use. + + + + + 20 + 20 + 416 + 17 + + + + No Internet connection found so unable to download any defaults + + + + + + 30 + 50 + 441 + 191 + + + + Download Samples + + + + + + + + Sample Songs + + + + + + + Bible XXX (Repeat per bible) + + + + + + + Theme XXX (Repeat per theme) + + + + + + + + + + + Configure Settings + + + Configure the initial value for settings + + + + + 20 + 20 + 252 + 58 + + + + + + + Default output display + + + + + + + false + + + QComboBox::NoInsert + + + QComboBox::AdjustToContents + + + + + + + Select the default Theme + + + + + + + QComboBox::AdjustToContents + + + + + + + + + Apply Updates + + + Press Finish to apply requested updates. + + + + 8 + + + 20 + + + + + + + + + + FirstTimeWizard + accepted() + FirstTimeWizard + accept() + + + 455 + 368 + + + 483 + 401 + + + + + From 36534f3496617c775a6b2470cf90c7e27a8f19b3 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 26 Feb 2011 11:16:21 +0000 Subject: [PATCH 03/90] Fix framework --- openlp.pyw | 3 ++- openlp/core/ui/__init__.py | 3 ++- openlp/core/ui/firsttimeform.py | 39 +++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 openlp/core/ui/firsttimeform.py diff --git a/openlp.pyw b/openlp.pyw index 565d5936f..be31651b3 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -37,6 +37,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Receiver, check_directory_exists from openlp.core.resources import qInitResources from openlp.core.ui.mainwindow import MainWindow +from openlp.core.ui.firsttimeform import FirstTimeForm from openlp.core.ui.exceptionform import ExceptionForm from openlp.core.ui import SplashScreen, ScreenList from openlp.core.utils import AppLocation, LanguageManager, VersionThread @@ -175,7 +176,7 @@ class OpenLP(QtGui.QApplication): # First time checks in settings if QtCore.QSettings().value( u'general/first time', QtCore.QVariant(True)).toBool(): - print "first time" + FirstTimeForm() #.exec_() show_splash = QtCore.QSettings().value( u'general/show splash', QtCore.QVariant(True)).toBool() if show_splash: diff --git a/openlp/core/ui/__init__.py b/openlp/core/ui/__init__.py index 158f7f0cd..a9b46ec9f 100644 --- a/openlp/core/ui/__init__.py +++ b/openlp/core/ui/__init__.py @@ -51,6 +51,7 @@ class HideMode(object): Theme = 2 Screen = 3 +from firsttimeform import FirstTimeForm from themeform import ThemeForm from filerenameform import FileRenameForm from starttimeform import StartTimeForm @@ -74,4 +75,4 @@ from thememanager import ThemeManager __all__ = ['SplashScreen', 'AboutForm', 'SettingsForm', 'MainDisplay', 'SlideController', 'ServiceManager', 'ThemeManager', 'MediaDockManager', - 'ServiceItemEditForm'] + 'ServiceItemEditForm', u'FirstTimeForm'] diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py new file mode 100644 index 000000000..f4e5471f8 --- /dev/null +++ b/openlp/core/ui/firsttimeform.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2011 Raoul Snyman # +# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, Armin Köhler, Andreas Preikschat, # +# Christian Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Carsten Tinggaard, Frode Woldsund # +# --------------------------------------------------------------------------- # +# 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 # +############################################################################### + +from PyQt4 import QtGui + +#from filerenamedialog import Ui_FileRenameDialog + +from openlp.core.lib import translate +from openlp.core.utils import get_web_page + +class FirstTimeForm():#QtGui.QDialog, Ui_FileRenameDialog): + + def __init__(self): + # check to see if we have web access + self.WebAccess = get_web_page(u'http://openlp.org1') + print self.WebAccess From d7a56667a4208168564da899def090a2801dcf7e Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 26 Feb 2011 15:19:43 +0000 Subject: [PATCH 04/90] Framework fine --- openlp.pyw | 9 ++++++++- openlp/core/ui/firsttimeform.py | 21 ++++++++++++++++++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index be31651b3..c5568e201 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -173,10 +173,13 @@ class OpenLP(QtGui.QApplication): self.setApplicationVersion(app_version[u'version']) if os.name == u'nt': self.setStyleSheet(application_stylesheet) + print "1" # First time checks in settings if QtCore.QSettings().value( u'general/first time', QtCore.QVariant(True)).toBool(): - FirstTimeForm() #.exec_() + FirstTimeForm().exec_() + # make sure Qt really display the splash screen + self.processEvents() show_splash = QtCore.QSettings().value( u'general/show splash', QtCore.QVariant(True)).toBool() if show_splash: @@ -207,13 +210,17 @@ class OpenLP(QtGui.QApplication): return self.exec_() def hookException(self, exctype, value, traceback): + print "a" if not hasattr(self, u'mainWindow'): log.exception(''.join(format_exception(exctype, value, traceback))) return + print "b" if not hasattr(self, u'exceptionForm'): self.exceptionForm = ExceptionForm(self.mainWindow) + print "c" self.exceptionForm.exceptionTextEdit.setPlainText( ''.join(format_exception(exctype, value, traceback))) + print "d" self.setNormalCursor() self.exceptionForm.exec_() diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index f4e5471f8..44f430a90 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -24,16 +24,31 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +import logging + from PyQt4 import QtGui -#from filerenamedialog import Ui_FileRenameDialog +from firsttimewizard import Ui_FirstTimeWizard from openlp.core.lib import translate from openlp.core.utils import get_web_page -class FirstTimeForm():#QtGui.QDialog, Ui_FileRenameDialog): +log = logging.getLogger(__name__) - def __init__(self): +class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): + """ + This is the Theme Import Wizard, which allows easy creation and editing of + OpenLP themes. + """ + log.info(u'ThemeWizardForm loaded') + + def __init__(self, parent=None): # check to see if we have web access self.WebAccess = get_web_page(u'http://openlp.org1') print self.WebAccess + QtGui.QWizard.__init__(self, parent) + self.setupUi(self) + #self.registerFields() + + def accept(self): + return QtGui.QWizard.accept(self) From 88fefe5582f0edae302422cc55c216b31193da04 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 26 Feb 2011 16:51:00 +0000 Subject: [PATCH 05/90] Plugins work --- openlp/core/ui/firsttimeform.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index 44f430a90..0ca078e66 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -26,11 +26,11 @@ import logging -from PyQt4 import QtGui +from PyQt4 import QtCore, QtGui from firsttimewizard import Ui_FirstTimeWizard -from openlp.core.lib import translate +from openlp.core.lib import translate, PluginStatus from openlp.core.utils import get_web_page log = logging.getLogger(__name__) @@ -51,4 +51,18 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): #self.registerFields() def accept(self): + self.__pluginStatus(self.songsCheckBox, u'songs/status') + self.__pluginStatus(self.bibleCheckBox, u'bibles/status') + self.__pluginStatus(self.presentationCheckBox, u'presentations/status') + self.__pluginStatus(self.imageCheckBox, u'images/status') + self.__pluginStatus(self.mediaCheckBox, u'media/status') + self.__pluginStatus(self.remoteCheckBox, u'remote/status') + self.__pluginStatus(self.customCheckBox, u'custom/status') + self.__pluginStatus(self.songUsageCheckBox, u'songusage/status') + #self.__pluginStatus(self.alertsCheckBox, u'alerts/status') return QtGui.QWizard.accept(self) + + def __pluginStatus(self, field, tag): + status = PluginStatus.Active if field.checkState() \ + == QtCore.Qt.Checked else PluginStatus.Inactive + QtCore.QSettings().setValue(tag, QtCore.QVariant(status)) From 289ce0de5f4f9cc44860afe2fae6c39abf0e6bf3 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 26 Feb 2011 20:52:26 +0000 Subject: [PATCH 06/90] Start of Langauges --- openlp.pyw | 19 ++----- openlp/core/ui/firsttimeform.py | 33 ++++++++++-- resources/forms/firsttimewizard.ui | 80 +++++++++++++++--------------- 3 files changed, 73 insertions(+), 59 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index c5568e201..393a1331b 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -151,10 +151,6 @@ class OpenLP(QtGui.QApplication): log.info(u'Openlp version %s' % app_version[u'version']) return app_version -# def notify(self, obj, evt): -# #TODO needed for presentation exceptions -# return QtGui.QApplication.notify(self, obj, evt) - def run(self): """ Run the OpenLP application. @@ -173,13 +169,6 @@ class OpenLP(QtGui.QApplication): self.setApplicationVersion(app_version[u'version']) if os.name == u'nt': self.setStyleSheet(application_stylesheet) - print "1" - # First time checks in settings - if QtCore.QSettings().value( - u'general/first time', QtCore.QVariant(True)).toBool(): - FirstTimeForm().exec_() - # make sure Qt really display the splash screen - self.processEvents() show_splash = QtCore.QSettings().value( u'general/show splash', QtCore.QVariant(True)).toBool() if show_splash: @@ -210,17 +199,13 @@ class OpenLP(QtGui.QApplication): return self.exec_() def hookException(self, exctype, value, traceback): - print "a" if not hasattr(self, u'mainWindow'): log.exception(''.join(format_exception(exctype, value, traceback))) return - print "b" if not hasattr(self, u'exceptionForm'): self.exceptionForm = ExceptionForm(self.mainWindow) - print "c" self.exceptionForm.exceptionTextEdit.setPlainText( ''.join(format_exception(exctype, value, traceback))) - print "d" self.setNormalCursor() self.exceptionForm.exec_() @@ -287,6 +272,10 @@ def main(): app = OpenLP(qt_args) # Define the settings environment QtCore.QSettings(u'OpenLP', u'OpenLP') + # First time checks in settings + if QtCore.QSettings().value( + u'general/first time', QtCore.QVariant(True)).toBool(): + FirstTimeForm().exec_() # i18n Set Language language = LanguageManager.get_language() appTranslator = LanguageManager.get_translator(language) diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index 0ca078e66..88220ed33 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -31,7 +31,7 @@ from PyQt4 import QtCore, QtGui from firsttimewizard import Ui_FirstTimeWizard from openlp.core.lib import translate, PluginStatus -from openlp.core.utils import get_web_page +from openlp.core.utils import get_web_page, LanguageManager log = logging.getLogger(__name__) @@ -44,12 +44,35 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): def __init__(self, parent=None): # check to see if we have web access - self.WebAccess = get_web_page(u'http://openlp.org1') - print self.WebAccess + self.webAccess = get_web_page(u'http://openlp.org1') + print self.webAccess QtGui.QWizard.__init__(self, parent) self.setupUi(self) #self.registerFields() + def exec_(self, edit=False): + """ + Run the wizard. + """ + self.setDefaults() + return QtGui.QWizard.exec_(self) + + def setDefaults(self): + """ + Set up display at start of theme edit. + """ + self.restart() + # Sort out internet access + if self.webAccess: + self.internetGroupBox.setVisible(True) + self.noInternetLabel.setVisible(False) + else: + self.internetGroupBox.setVisible(False) + self.noInternetLabel.setVisible(True) + self.qmList = LanguageManager.get_qm_list() + for key in sorted(self.qmList.keys()): + self.LanguageComboBox.addItem(key) + def accept(self): self.__pluginStatus(self.songsCheckBox, u'songs/status') self.__pluginStatus(self.bibleCheckBox, u'bibles/status') @@ -59,7 +82,9 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): self.__pluginStatus(self.remoteCheckBox, u'remote/status') self.__pluginStatus(self.customCheckBox, u'custom/status') self.__pluginStatus(self.songUsageCheckBox, u'songusage/status') - #self.__pluginStatus(self.alertsCheckBox, u'alerts/status') + self.__pluginStatus(self.alertCheckBox, u'alerts/status') + + print self.qmList[unicode(self.LanguageComboBox.currentText())] return QtGui.QWizard.accept(self) def __pluginStatus(self, field, tag): diff --git a/resources/forms/firsttimewizard.ui b/resources/forms/firsttimewizard.ui index b4442e9f0..305fd66a0 100644 --- a/resources/forms/firsttimewizard.ui +++ b/resources/forms/firsttimewizard.ui @@ -199,7 +199,7 @@ p, li { white-space: pre-wrap; } - Remote Control + Allow remote access @@ -213,6 +213,16 @@ p, li { white-space: pre-wrap; } + + + + Allow Alerts + + + true + + + @@ -229,12 +239,12 @@ p, li { white-space: pre-wrap; } 20 20 - 416 + 461 17 - No Internet connection found so unable to download any defaults + No Internet connection found so unable to download any default files. @@ -247,7 +257,7 @@ p, li { white-space: pre-wrap; } - Download Samples + Download Example Files @@ -280,18 +290,18 @@ p, li { white-space: pre-wrap; } - Configure Settings + Default Settings - Configure the initial value for settings + Set up default values to be used by OpenLP - + 20 20 252 - 58 + 88 @@ -329,45 +339,35 @@ p, li { white-space: pre-wrap; } + + + + Select default language + + + + + + - - - - Apply Updates - - - Press Finish to apply requested updates. - - - - 8 + + + + 40 + 190 + 471 + 17 + - - 20 + + Press Finish to apply all you changes and start OpenLP - + - - - FirstTimeWizard - accepted() - FirstTimeWizard - accept() - - - 455 - 368 - - - 483 - 401 - - - - + From f295ac54075e083f1ea2a304314e18af1540086d Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 27 Feb 2011 09:53:47 +0000 Subject: [PATCH 07/90] Select Language at startup --- openlp.pyw | 2 ++ openlp/core/ui/firsttimeform.py | 12 ++++++++++-- openlp/core/utils/languagemanager.py | 15 ++++++++++----- resources/forms/firsttimewizard.ui | 24 +++++++++++++++++++----- 4 files changed, 41 insertions(+), 12 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index 393a1331b..c551636b8 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -276,8 +276,10 @@ def main(): if QtCore.QSettings().value( u'general/first time', QtCore.QVariant(True)).toBool(): FirstTimeForm().exec_() + pass # i18n Set Language language = LanguageManager.get_language() + print language appTranslator = LanguageManager.get_translator(language) app.installTranslator(appTranslator) if not options.no_error_form: diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index 88220ed33..2a23350a6 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -69,6 +69,8 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): else: self.internetGroupBox.setVisible(False) self.noInternetLabel.setVisible(True) + if LanguageManager.auto_language: + self.LanguageComboBox.setEnabled(False) self.qmList = LanguageManager.get_qm_list() for key in sorted(self.qmList.keys()): self.LanguageComboBox.addItem(key) @@ -83,8 +85,14 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): self.__pluginStatus(self.customCheckBox, u'custom/status') self.__pluginStatus(self.songUsageCheckBox, u'songusage/status') self.__pluginStatus(self.alertCheckBox, u'alerts/status') - - print self.qmList[unicode(self.LanguageComboBox.currentText())] + if self.autoLanguageCheckBox.checkState() == QtCore.Qt.Checked: + LanguageManager.auto_language = True + LanguageManager.set_language(False, False) + else: + LanguageManager.auto_language = False + action = QtGui.QAction(None) + action.setObjectName(unicode(self.LanguageComboBox.currentText())) + LanguageManager.set_language(action, False) return QtGui.QWizard.accept(self) def __pluginStatus(self, field, tag): diff --git a/openlp/core/utils/languagemanager.py b/openlp/core/utils/languagemanager.py index 43d2a8e67..e90a659ec 100644 --- a/openlp/core/utils/languagemanager.py +++ b/openlp/core/utils/languagemanager.py @@ -99,16 +99,20 @@ class LanguageManager(object): return language @staticmethod - def set_language(action): + def set_language(action, message=True): """ Set the language to translate OpenLP into ``action`` The language menu option + + ``message`` + Display the message option """ language = u'en' if action: action_name = u'%s' % action.objectName() + print action_name qm_list = LanguageManager.get_qm_list() language = u'%s' % qm_list[action_name] if LanguageManager.auto_language: @@ -116,10 +120,11 @@ class LanguageManager(object): QtCore.QSettings().setValue( u'general/language', QtCore.QVariant(language)) log.info(u'Language file: \'%s\' written to conf file' % language) - QtGui.QMessageBox.information(None, - translate('OpenLP.LanguageManager', 'Language'), - translate('OpenLP.LanguageManager', - 'Please restart OpenLP to use your new language setting.')) + if message: + QtGui.QMessageBox.information(None, + translate('OpenLP.LanguageManager', 'Language'), + translate('OpenLP.LanguageManager', + 'Please restart OpenLP to use your new language setting.')) @staticmethod def init_qm_list(): diff --git a/resources/forms/firsttimewizard.ui b/resources/forms/firsttimewizard.ui index 305fd66a0..ec55bcd42 100644 --- a/resources/forms/firsttimewizard.ui +++ b/resources/forms/firsttimewizard.ui @@ -300,8 +300,8 @@ p, li { white-space: pre-wrap; } 20 20 - 252 - 88 + 491 + 113 @@ -339,15 +339,29 @@ p, li { white-space: pre-wrap; } - + Select default language - - + + + + QComboBox::AdjustToContents + + + + + + + Auto Language + + + true + + From b4156c809bb480f246450eb4ae5423274fd7612c Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 27 Feb 2011 14:29:19 +0000 Subject: [PATCH 08/90] You can now set the Language --- openlp.pyw | 2 -- openlp/core/ui/firsttimeform.py | 18 ++++++++++++++---- openlp/core/utils/languagemanager.py | 5 +++-- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index c551636b8..393a1331b 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -276,10 +276,8 @@ def main(): if QtCore.QSettings().value( u'general/first time', QtCore.QVariant(True)).toBool(): FirstTimeForm().exec_() - pass # i18n Set Language language = LanguageManager.get_language() - print language appTranslator = LanguageManager.get_translator(language) app.installTranslator(appTranslator) if not options.no_error_form: diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index 2a23350a6..35cc65b1f 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -48,6 +48,9 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): print self.webAccess QtGui.QWizard.__init__(self, parent) self.setupUi(self) + QtCore.QObject.connect(self.autoLanguageCheckBox, + QtCore.SIGNAL(u'stateChanged(int)'), + self.onAutoLanguageClicked) #self.registerFields() def exec_(self, edit=False): @@ -62,15 +65,16 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): Set up display at start of theme edit. """ self.restart() - # Sort out internet access + # Sort out internet access for downloads if self.webAccess: self.internetGroupBox.setVisible(True) self.noInternetLabel.setVisible(False) else: self.internetGroupBox.setVisible(False) self.noInternetLabel.setVisible(True) - if LanguageManager.auto_language: - self.LanguageComboBox.setEnabled(False) + # Sort out Language settings + self.autoLanguageCheckBox.setChecked(True) + self.LanguageComboBox.setEnabled(False) self.qmList = LanguageManager.get_qm_list() for key in sorted(self.qmList.keys()): self.LanguageComboBox.addItem(key) @@ -81,7 +85,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): self.__pluginStatus(self.presentationCheckBox, u'presentations/status') self.__pluginStatus(self.imageCheckBox, u'images/status') self.__pluginStatus(self.mediaCheckBox, u'media/status') - self.__pluginStatus(self.remoteCheckBox, u'remote/status') + self.__pluginStatus(self.remoteCheckBox, u'remotes/status') self.__pluginStatus(self.customCheckBox, u'custom/status') self.__pluginStatus(self.songUsageCheckBox, u'songusage/status') self.__pluginStatus(self.alertCheckBox, u'alerts/status') @@ -95,6 +99,12 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): LanguageManager.set_language(action, False) return QtGui.QWizard.accept(self) + def onAutoLanguageClicked(self, state): + if state == QtCore.Qt.Checked: + self.LanguageComboBox.setEnabled(False) + else: + self.LanguageComboBox.setEnabled(True) + def __pluginStatus(self, field, tag): status = PluginStatus.Active if field.checkState() \ == QtCore.Qt.Checked else PluginStatus.Inactive diff --git a/openlp/core/utils/languagemanager.py b/openlp/core/utils/languagemanager.py index e90a659ec..ebc9b4575 100644 --- a/openlp/core/utils/languagemanager.py +++ b/openlp/core/utils/languagemanager.py @@ -112,12 +112,13 @@ class LanguageManager(object): language = u'en' if action: action_name = u'%s' % action.objectName() - print action_name qm_list = LanguageManager.get_qm_list() language = u'%s' % qm_list[action_name] if LanguageManager.auto_language: language = u'[%s]' % language - QtCore.QSettings().setValue( + # This needs to be here for the setValue to work + settings = QtCore.QSettings(u'OpenLP', u'OpenLP') + settings.setValue( u'general/language', QtCore.QVariant(language)) log.info(u'Language file: \'%s\' written to conf file' % language) if message: From 0e773c7a1b3ddfd640ccdb78fbf2f74d0f3f53d6 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 27 Feb 2011 15:33:08 +0000 Subject: [PATCH 09/90] Lists from the web now --- openlp/core/ui/firsttimeform.py | 28 +++++++++++++++- resources/forms/firsttimewizard.ui | 53 +++++++++++++++--------------- 2 files changed, 53 insertions(+), 28 deletions(-) diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index 35cc65b1f..f739b9a81 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -44,8 +44,14 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): def __init__(self, parent=None): # check to see if we have web access - self.webAccess = get_web_page(u'http://openlp.org1') + self.webAccess = get_web_page(u'http://openlp.org/files/frw/themes.lst') print self.webAccess + if self.webAccess: + self.themes = self.webAccess.read() + songs = get_web_page(u'http://openlp.org/files/frw/songs.lst') + self.songs = songs.read() + bibles = get_web_page(u'http://openlp.org/files/frw/bibles.lst') + self.bibles = bibles.read() QtGui.QWizard.__init__(self, parent) self.setupUi(self) QtCore.QObject.connect(self.autoLanguageCheckBox, @@ -78,6 +84,26 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): self.qmList = LanguageManager.get_qm_list() for key in sorted(self.qmList.keys()): self.LanguageComboBox.addItem(key) + treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) + treewidgetitem.setText(0, u'Songs') + self.__loadChild(treewidgetitem, self.songs) + treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) + treewidgetitem.setText(0, u'Bibles') + self.__loadChild(treewidgetitem, self.bibles) + treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) + treewidgetitem.setText(0, u'Themes') + self.__loadChild(treewidgetitem, self.themes) + + def __loadChild(self, tree, list): + list = list.split(u'\n') + for item in list: + if item: + child = QtGui.QTreeWidgetItem(tree) + child.setText(0, item) + child.setCheckState(0, QtCore.Qt.Unchecked) + child.setFlags(QtCore.Qt.ItemIsUserCheckable | + QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) + #self.themeSelectionComboBox.addItem(theme) def accept(self): self.__pluginStatus(self.songsCheckBox, u'songs/status') diff --git a/resources/forms/firsttimewizard.ui b/resources/forms/firsttimewizard.ui index ec55bcd42..5e20b017b 100644 --- a/resources/forms/firsttimewizard.ui +++ b/resources/forms/firsttimewizard.ui @@ -250,10 +250,10 @@ p, li { white-space: pre-wrap; } - 30 - 50 - 441 - 191 + 20 + 0 + 501 + 281 @@ -261,29 +261,28 @@ p, li { white-space: pre-wrap; } - - - - - Sample Songs - - - - - - - Bible XXX (Repeat per bible) - - - - - - - Theme XXX (Repeat per theme) - - - - + + + Qt::ScrollBarAlwaysOff + + + false + + + true + + + QAbstractItemView::NoSelection + + + false + + + + 1 + + + From df3a3cc1334cbe9688b2bb94f377399a0e446cf3 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 27 Feb 2011 17:05:37 +0000 Subject: [PATCH 10/90] Oops missed the wizard --- openlp/core/ui/firsttimewizard.py | 194 ++++++++++++++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100644 openlp/core/ui/firsttimewizard.py diff --git a/openlp/core/ui/firsttimewizard.py b/openlp/core/ui/firsttimewizard.py new file mode 100644 index 000000000..68aa41285 --- /dev/null +++ b/openlp/core/ui/firsttimewizard.py @@ -0,0 +1,194 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'firsttimewizard.ui' +# +# Created: Sun Feb 27 15:02:08 2011 +# by: PyQt4 UI code generator 4.8.3 +# +# WARNING! All changes made in this file will be lost! + +from PyQt4 import QtCore, QtGui + +try: + _fromUtf8 = QtCore.QString.fromUtf8 +except AttributeError: + _fromUtf8 = lambda s: s + +class Ui_FirstTimeWizard(object): + def setupUi(self, FirstTimeWizard): + FirstTimeWizard.setObjectName(_fromUtf8("FirstTimeWizard")) + FirstTimeWizard.resize(550, 386) + FirstTimeWizard.setModal(True) + FirstTimeWizard.setWizardStyle(QtGui.QWizard.ModernStyle) + FirstTimeWizard.setOptions(QtGui.QWizard.IndependentPages|QtGui.QWizard.NoBackButtonOnStartPage) + self.welcomePage = QtGui.QWizardPage() + self.welcomePage.setTitle(_fromUtf8("")) + self.welcomePage.setSubTitle(_fromUtf8("")) + self.welcomePage.setObjectName(_fromUtf8("welcomePage")) + self.welcomeLayout = QtGui.QHBoxLayout(self.welcomePage) + self.welcomeLayout.setSpacing(8) + self.welcomeLayout.setMargin(0) + self.welcomeLayout.setObjectName(_fromUtf8("welcomeLayout")) + self.importBibleImage = QtGui.QLabel(self.welcomePage) + self.importBibleImage.setMinimumSize(QtCore.QSize(163, 0)) + self.importBibleImage.setMaximumSize(QtCore.QSize(163, 16777215)) + self.importBibleImage.setLineWidth(0) + self.importBibleImage.setText(_fromUtf8("")) + self.importBibleImage.setPixmap(QtGui.QPixmap(_fromUtf8(":/wizards/wizard_importbible.bmp"))) + self.importBibleImage.setIndent(0) + self.importBibleImage.setObjectName(_fromUtf8("importBibleImage")) + self.welcomeLayout.addWidget(self.importBibleImage) + self.welcomePageLayout = QtGui.QVBoxLayout() + self.welcomePageLayout.setSpacing(8) + self.welcomePageLayout.setObjectName(_fromUtf8("welcomePageLayout")) + self.titleLabel = QtGui.QLabel(self.welcomePage) + self.titleLabel.setObjectName(_fromUtf8("titleLabel")) + self.welcomePageLayout.addWidget(self.titleLabel) + spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + self.welcomePageLayout.addItem(spacerItem) + self.informationLabel = QtGui.QLabel(self.welcomePage) + self.informationLabel.setWordWrap(True) + self.informationLabel.setMargin(10) + self.informationLabel.setObjectName(_fromUtf8("informationLabel")) + self.welcomePageLayout.addWidget(self.informationLabel) + spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + self.welcomePageLayout.addItem(spacerItem1) + self.welcomeLayout.addLayout(self.welcomePageLayout) + FirstTimeWizard.addPage(self.welcomePage) + self.PluginPagePage = QtGui.QWizardPage() + self.PluginPagePage.setObjectName(_fromUtf8("PluginPagePage")) + self.verticalLayout_2 = QtGui.QVBoxLayout(self.PluginPagePage) + self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) + self.verticalLayout = QtGui.QVBoxLayout() + self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) + self.songsCheckBox = QtGui.QCheckBox(self.PluginPagePage) + self.songsCheckBox.setChecked(True) + self.songsCheckBox.setObjectName(_fromUtf8("songsCheckBox")) + self.verticalLayout.addWidget(self.songsCheckBox) + self.customCheckBox = QtGui.QCheckBox(self.PluginPagePage) + self.customCheckBox.setChecked(True) + self.customCheckBox.setObjectName(_fromUtf8("customCheckBox")) + self.verticalLayout.addWidget(self.customCheckBox) + self.bibleCheckBox = QtGui.QCheckBox(self.PluginPagePage) + self.bibleCheckBox.setChecked(True) + self.bibleCheckBox.setObjectName(_fromUtf8("bibleCheckBox")) + self.verticalLayout.addWidget(self.bibleCheckBox) + self.imageCheckBox = QtGui.QCheckBox(self.PluginPagePage) + self.imageCheckBox.setChecked(True) + self.imageCheckBox.setObjectName(_fromUtf8("imageCheckBox")) + self.verticalLayout.addWidget(self.imageCheckBox) + self.presentationCheckBox = QtGui.QCheckBox(self.PluginPagePage) + self.presentationCheckBox.setChecked(True) + self.presentationCheckBox.setObjectName(_fromUtf8("presentationCheckBox")) + self.verticalLayout.addWidget(self.presentationCheckBox) + self.mediaCheckBox = QtGui.QCheckBox(self.PluginPagePage) + self.mediaCheckBox.setChecked(True) + self.mediaCheckBox.setObjectName(_fromUtf8("mediaCheckBox")) + self.verticalLayout.addWidget(self.mediaCheckBox) + self.remoteCheckBox = QtGui.QCheckBox(self.PluginPagePage) + self.remoteCheckBox.setObjectName(_fromUtf8("remoteCheckBox")) + self.verticalLayout.addWidget(self.remoteCheckBox) + self.songUsageCheckBox = QtGui.QCheckBox(self.PluginPagePage) + self.songUsageCheckBox.setChecked(True) + self.songUsageCheckBox.setObjectName(_fromUtf8("songUsageCheckBox")) + self.verticalLayout.addWidget(self.songUsageCheckBox) + self.alertCheckBox = QtGui.QCheckBox(self.PluginPagePage) + self.alertCheckBox.setChecked(True) + self.alertCheckBox.setObjectName(_fromUtf8("alertCheckBox")) + self.verticalLayout.addWidget(self.alertCheckBox) + self.verticalLayout_2.addLayout(self.verticalLayout) + FirstTimeWizard.addPage(self.PluginPagePage) + self.downloadDefaultsPage = QtGui.QWizardPage() + self.downloadDefaultsPage.setObjectName(_fromUtf8("downloadDefaultsPage")) + self.noInternetLabel = QtGui.QLabel(self.downloadDefaultsPage) + self.noInternetLabel.setGeometry(QtCore.QRect(20, 20, 461, 17)) + self.noInternetLabel.setObjectName(_fromUtf8("noInternetLabel")) + self.internetGroupBox = QtGui.QGroupBox(self.downloadDefaultsPage) + self.internetGroupBox.setGeometry(QtCore.QRect(20, 10, 501, 271)) + self.internetGroupBox.setObjectName(_fromUtf8("internetGroupBox")) + self.verticalLayout_4 = QtGui.QVBoxLayout(self.internetGroupBox) + self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4")) + self.selectionTreeWidget = QtGui.QTreeWidget(self.internetGroupBox) + self.selectionTreeWidget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + self.selectionTreeWidget.setProperty(_fromUtf8("showDropIndicator"), False) + self.selectionTreeWidget.setAlternatingRowColors(True) + #self.selectionTreeWidget.setSelectionMode(QtGui.QAbstractItemView.NoSelection) + self.selectionTreeWidget.setObjectName(_fromUtf8("selectionTreeWidget")) + self.selectionTreeWidget.headerItem().setText(0, _fromUtf8("1")) + self.selectionTreeWidget.header().setVisible(False) + self.verticalLayout_4.addWidget(self.selectionTreeWidget) + FirstTimeWizard.addPage(self.downloadDefaultsPage) + self.DefaultsPage = QtGui.QWizardPage() + self.DefaultsPage.setObjectName(_fromUtf8("DefaultsPage")) + self.layoutWidget = QtGui.QWidget(self.DefaultsPage) + self.layoutWidget.setGeometry(QtCore.QRect(20, 20, 491, 113)) + self.layoutWidget.setObjectName(_fromUtf8("layoutWidget")) + self.gridLayout = QtGui.QGridLayout(self.layoutWidget) + self.gridLayout.setMargin(0) + self.gridLayout.setObjectName(_fromUtf8("gridLayout")) + self.displaySelectionLabel = QtGui.QLabel(self.layoutWidget) + self.displaySelectionLabel.setObjectName(_fromUtf8("displaySelectionLabel")) + self.gridLayout.addWidget(self.displaySelectionLabel, 0, 0, 1, 1) + self.displaySelectionComboBox = QtGui.QComboBox(self.layoutWidget) + self.displaySelectionComboBox.setEditable(False) + self.displaySelectionComboBox.setInsertPolicy(QtGui.QComboBox.NoInsert) + self.displaySelectionComboBox.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents) + self.displaySelectionComboBox.setObjectName(_fromUtf8("displaySelectionComboBox")) + self.gridLayout.addWidget(self.displaySelectionComboBox, 0, 1, 1, 1) + self.themeSelectionLabel = QtGui.QLabel(self.layoutWidget) + self.themeSelectionLabel.setObjectName(_fromUtf8("themeSelectionLabel")) + self.gridLayout.addWidget(self.themeSelectionLabel, 1, 0, 1, 1) + self.themeSelectionComboBox = QtGui.QComboBox(self.layoutWidget) + self.themeSelectionComboBox.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents) + self.themeSelectionComboBox.setObjectName(_fromUtf8("themeSelectionComboBox")) + self.gridLayout.addWidget(self.themeSelectionComboBox, 1, 1, 1, 1) + self.languageLabel = QtGui.QLabel(self.layoutWidget) + self.languageLabel.setObjectName(_fromUtf8("languageLabel")) + self.gridLayout.addWidget(self.languageLabel, 3, 0, 1, 1) + self.LanguageComboBox = QtGui.QComboBox(self.layoutWidget) + self.LanguageComboBox.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents) + self.LanguageComboBox.setObjectName(_fromUtf8("LanguageComboBox")) + self.gridLayout.addWidget(self.LanguageComboBox, 3, 1, 1, 1) + self.autoLanguageCheckBox = QtGui.QCheckBox(self.layoutWidget) + self.autoLanguageCheckBox.setChecked(True) + self.autoLanguageCheckBox.setObjectName(_fromUtf8("autoLanguageCheckBox")) + self.gridLayout.addWidget(self.autoLanguageCheckBox, 2, 0, 1, 1) + self.label = QtGui.QLabel(self.DefaultsPage) + self.label.setGeometry(QtCore.QRect(40, 190, 471, 17)) + self.label.setObjectName(_fromUtf8("label")) + FirstTimeWizard.addPage(self.DefaultsPage) + + self.retranslateUi(FirstTimeWizard) + QtCore.QMetaObject.connectSlotsByName(FirstTimeWizard) + + def retranslateUi(self, FirstTimeWizard): + FirstTimeWizard.setWindowTitle(QtGui.QApplication.translate("FirstTimeWizard", "First Time Wizard", None, QtGui.QApplication.UnicodeUTF8)) + self.titleLabel.setText(QtGui.QApplication.translate("FirstTimeWizard", "\n" +"\n" +"

Welcome to the First Time Wizard

", None, QtGui.QApplication.UnicodeUTF8)) + self.informationLabel.setText(QtGui.QApplication.translate("FirstTimeWizard", "This wizard will help you to configure OpenLP for initial use . Click the next button below to start the process of selection your initial options. ", None, QtGui.QApplication.UnicodeUTF8)) + self.PluginPagePage.setTitle(QtGui.QApplication.translate("FirstTimeWizard", "Activate required Plugins", None, QtGui.QApplication.UnicodeUTF8)) + self.PluginPagePage.setSubTitle(QtGui.QApplication.translate("FirstTimeWizard", "Select the Plugins you wish to use. ", None, QtGui.QApplication.UnicodeUTF8)) + self.songsCheckBox.setText(QtGui.QApplication.translate("FirstTimeWizard", "Songs", None, QtGui.QApplication.UnicodeUTF8)) + self.customCheckBox.setText(QtGui.QApplication.translate("FirstTimeWizard", "Custom Text", None, QtGui.QApplication.UnicodeUTF8)) + self.bibleCheckBox.setText(QtGui.QApplication.translate("FirstTimeWizard", "Bible", None, QtGui.QApplication.UnicodeUTF8)) + self.imageCheckBox.setText(QtGui.QApplication.translate("FirstTimeWizard", "Images", None, QtGui.QApplication.UnicodeUTF8)) + self.presentationCheckBox.setText(QtGui.QApplication.translate("FirstTimeWizard", "Presentations", None, QtGui.QApplication.UnicodeUTF8)) + self.mediaCheckBox.setText(QtGui.QApplication.translate("FirstTimeWizard", "Media (Audio and Video)", None, QtGui.QApplication.UnicodeUTF8)) + self.remoteCheckBox.setText(QtGui.QApplication.translate("FirstTimeWizard", "Allow remote access", None, QtGui.QApplication.UnicodeUTF8)) + self.songUsageCheckBox.setText(QtGui.QApplication.translate("FirstTimeWizard", "Monitor Song Usage", None, QtGui.QApplication.UnicodeUTF8)) + self.alertCheckBox.setText(QtGui.QApplication.translate("FirstTimeWizard", "Allow Alerts", None, QtGui.QApplication.UnicodeUTF8)) + self.downloadDefaultsPage.setTitle(QtGui.QApplication.translate("FirstTimeWizard", "Download Samples from OpenLP.org", None, QtGui.QApplication.UnicodeUTF8)) + self.downloadDefaultsPage.setSubTitle(QtGui.QApplication.translate("FirstTimeWizard", "Select samples to downlaod and install for use.", None, QtGui.QApplication.UnicodeUTF8)) + self.noInternetLabel.setText(QtGui.QApplication.translate("FirstTimeWizard", "No Internet connection found so unable to download any default files.", None, QtGui.QApplication.UnicodeUTF8)) + self.internetGroupBox.setTitle(QtGui.QApplication.translate("FirstTimeWizard", "Download Example Files", None, QtGui.QApplication.UnicodeUTF8)) + self.DefaultsPage.setTitle(QtGui.QApplication.translate("FirstTimeWizard", "Default Settings", None, QtGui.QApplication.UnicodeUTF8)) + self.DefaultsPage.setSubTitle(QtGui.QApplication.translate("FirstTimeWizard", "Set up default values to be used by OpenLP", None, QtGui.QApplication.UnicodeUTF8)) + self.displaySelectionLabel.setText(QtGui.QApplication.translate("FirstTimeWizard", "Default output display", None, QtGui.QApplication.UnicodeUTF8)) + self.themeSelectionLabel.setText(QtGui.QApplication.translate("FirstTimeWizard", "Select the default Theme", None, QtGui.QApplication.UnicodeUTF8)) + self.languageLabel.setText(QtGui.QApplication.translate("FirstTimeWizard", "Select default language", None, QtGui.QApplication.UnicodeUTF8)) + self.autoLanguageCheckBox.setText(QtGui.QApplication.translate("FirstTimeWizard", "Auto Language", None, QtGui.QApplication.UnicodeUTF8)) + self.label.setText(QtGui.QApplication.translate("FirstTimeWizard", "Press Finish to apply all you changes and start OpenLP", None, QtGui.QApplication.UnicodeUTF8)) + From a10ad04254766b2588514b3a89fc14c8166e175a Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 2 Mar 2011 17:44:33 +0000 Subject: [PATCH 11/90] Add first time language dialog --- openlp.pyw | 9 ++- openlp/core/ui/__init__.py | 1 + openlp/core/ui/firsttimeform.py | 24 +------- openlp/core/ui/firsttimelanguagedialog.py | 55 +++++++++++++++++++ openlp/core/ui/firsttimelanguageform.py | 67 +++++++++++++++++++++++ openlp/core/ui/firsttimewizard.py | 13 ----- 6 files changed, 131 insertions(+), 38 deletions(-) create mode 100644 openlp/core/ui/firsttimelanguagedialog.py create mode 100644 openlp/core/ui/firsttimelanguageform.py diff --git a/openlp.pyw b/openlp.pyw index 393a1331b..56626cf48 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -37,6 +37,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Receiver, check_directory_exists from openlp.core.resources import qInitResources from openlp.core.ui.mainwindow import MainWindow +from openlp.core.ui.firsttimelanguageform import FirstTimeLanguageForm from openlp.core.ui.firsttimeform import FirstTimeForm from openlp.core.ui.exceptionform import ExceptionForm from openlp.core.ui import SplashScreen, ScreenList @@ -275,14 +276,18 @@ def main(): # First time checks in settings if QtCore.QSettings().value( u'general/first time', QtCore.QVariant(True)).toBool(): - FirstTimeForm().exec_() + FirstTimeLanguageForm().exec_() # i18n Set Language language = LanguageManager.get_language() appTranslator = LanguageManager.get_translator(language) app.installTranslator(appTranslator) + # First time checks in settings + if QtCore.QSettings().value( + u'general/first time', QtCore.QVariant(True)).toBool(): + FirstTimeForm().exec_() if not options.no_error_form: sys.excepthook = app.hookException - sys.exit(app.run()) + sys.exit()#(app.run()) if __name__ == u'__main__': """ diff --git a/openlp/core/ui/__init__.py b/openlp/core/ui/__init__.py index a9b46ec9f..485d2adda 100644 --- a/openlp/core/ui/__init__.py +++ b/openlp/core/ui/__init__.py @@ -52,6 +52,7 @@ class HideMode(object): Screen = 3 from firsttimeform import FirstTimeForm +from firsttimelanguageform import FirstTimeLanguageForm from themeform import ThemeForm from filerenameform import FileRenameForm from starttimeform import StartTimeForm diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index f739b9a81..76f88b8b1 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -31,7 +31,7 @@ from PyQt4 import QtCore, QtGui from firsttimewizard import Ui_FirstTimeWizard from openlp.core.lib import translate, PluginStatus -from openlp.core.utils import get_web_page, LanguageManager +from openlp.core.utils import get_web_page log = logging.getLogger(__name__) @@ -54,9 +54,6 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): self.bibles = bibles.read() QtGui.QWizard.__init__(self, parent) self.setupUi(self) - QtCore.QObject.connect(self.autoLanguageCheckBox, - QtCore.SIGNAL(u'stateChanged(int)'), - self.onAutoLanguageClicked) #self.registerFields() def exec_(self, edit=False): @@ -79,11 +76,6 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): self.internetGroupBox.setVisible(False) self.noInternetLabel.setVisible(True) # Sort out Language settings - self.autoLanguageCheckBox.setChecked(True) - self.LanguageComboBox.setEnabled(False) - self.qmList = LanguageManager.get_qm_list() - for key in sorted(self.qmList.keys()): - self.LanguageComboBox.addItem(key) treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) treewidgetitem.setText(0, u'Songs') self.__loadChild(treewidgetitem, self.songs) @@ -115,22 +107,8 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): self.__pluginStatus(self.customCheckBox, u'custom/status') self.__pluginStatus(self.songUsageCheckBox, u'songusage/status') self.__pluginStatus(self.alertCheckBox, u'alerts/status') - if self.autoLanguageCheckBox.checkState() == QtCore.Qt.Checked: - LanguageManager.auto_language = True - LanguageManager.set_language(False, False) - else: - LanguageManager.auto_language = False - action = QtGui.QAction(None) - action.setObjectName(unicode(self.LanguageComboBox.currentText())) - LanguageManager.set_language(action, False) return QtGui.QWizard.accept(self) - def onAutoLanguageClicked(self, state): - if state == QtCore.Qt.Checked: - self.LanguageComboBox.setEnabled(False) - else: - self.LanguageComboBox.setEnabled(True) - def __pluginStatus(self, field, tag): status = PluginStatus.Active if field.checkState() \ == QtCore.Qt.Checked else PluginStatus.Inactive diff --git a/openlp/core/ui/firsttimelanguagedialog.py b/openlp/core/ui/firsttimelanguagedialog.py new file mode 100644 index 000000000..fbf817939 --- /dev/null +++ b/openlp/core/ui/firsttimelanguagedialog.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2011 Raoul Snyman # +# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, Armin Köhler, Andreas Preikschat, # +# Christian Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Carsten Tinggaard, Frode Woldsund # +# --------------------------------------------------------------------------- # +# 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 # +############################################################################### + +from PyQt4 import QtCore, QtGui + +from openlp.core.lib import translate +from openlp.core.lib.ui import create_accept_reject_button_box + +class Ui_FirstTimeLanguageDialog(object): + def setupUi(self, firstTimeLanguageDialog): + firstTimeLanguageDialog.setObjectName(u'firstTimeLanguageDialog') + firstTimeLanguageDialog.resize(300, 10) + self.dialogLayout = QtGui.QGridLayout(firstTimeLanguageDialog) + self.dialogLayout.setObjectName(u'dialogLayout') + self.fileNameLabel = QtGui.QLabel(firstTimeLanguageDialog) + self.fileNameLabel.setObjectName(u'fileNameLabel') + self.dialogLayout.addWidget(self.fileNameLabel, 0, 0) + self.LanguageComboBox = QtGui.QComboBox(firstTimeLanguageDialog) + self.LanguageComboBox.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents) + self.LanguageComboBox.setObjectName("LanguageComboBox") + self.dialogLayout.addWidget(self.LanguageComboBox, 0, 1) + self.buttonBox = create_accept_reject_button_box(firstTimeLanguageDialog, True) + self.dialogLayout.addWidget(self.buttonBox, 1, 0, 1, 2) + self.retranslateUi(firstTimeLanguageDialog) + self.setMaximumHeight(self.sizeHint().height()) + QtCore.QMetaObject.connectSlotsByName(firstTimeLanguageDialog) + + def retranslateUi(self, firstTimeLanguageDialog): + self.setWindowTitle(translate('OpenLP.FirstTimeLanguageForm', + 'Initial Set up Language')) + self.fileNameLabel.setText(translate('OpenLP.FirstTimeLanguageForm', + 'Initial Language:')) diff --git a/openlp/core/ui/firsttimelanguageform.py b/openlp/core/ui/firsttimelanguageform.py new file mode 100644 index 000000000..e3ed16796 --- /dev/null +++ b/openlp/core/ui/firsttimelanguageform.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2011 Raoul Snyman # +# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, Armin Köhler, Andreas Preikschat, # +# Christian Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Carsten Tinggaard, Frode Woldsund # +# --------------------------------------------------------------------------- # +# 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 # +############################################################################### + +from PyQt4 import QtGui + +from firsttimelanguagedialog import Ui_FirstTimeLanguageDialog + +from openlp.core.lib import translate +from openlp.core.utils import LanguageManager + +class FirstTimeLanguageForm(QtGui.QDialog, Ui_FirstTimeLanguageDialog): + """ + The exception dialog + """ + def __init__(self, parent=None): + QtGui.QDialog.__init__(self, parent) + self.setupUi(self) + self.qmList = LanguageManager.get_qm_list() + for key in sorted(self.qmList.keys()): + self.LanguageComboBox.addItem(key) + + def exec_(self): + """ + Run the Dialog with correct heading. + """ + return QtGui.QDialog.exec_(self) + + def accept(self): + print "Accept" +# if self.autoLanguageCheckBox.checkState() == QtCore.Qt.Checked: +# LanguageManager.auto_language = True +# LanguageManager.set_language(False, False) +# else: +# LanguageManager.auto_language = False +# action = QtGui.QAction(None) +# action.setObjectName(unicode(self.LanguageComboBox.currentText())) +# LanguageManager.set_language(action, False) + return QtGui.QDialog.accept(self) + + def reject(self): + print "Reject" + LanguageManager.auto_language = True + LanguageManager.set_language(False, False) + return QtGui.QDialog.reject(self) diff --git a/openlp/core/ui/firsttimewizard.py b/openlp/core/ui/firsttimewizard.py index 68aa41285..e9a1db232 100644 --- a/openlp/core/ui/firsttimewizard.py +++ b/openlp/core/ui/firsttimewizard.py @@ -142,17 +142,6 @@ class Ui_FirstTimeWizard(object): self.themeSelectionComboBox.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents) self.themeSelectionComboBox.setObjectName(_fromUtf8("themeSelectionComboBox")) self.gridLayout.addWidget(self.themeSelectionComboBox, 1, 1, 1, 1) - self.languageLabel = QtGui.QLabel(self.layoutWidget) - self.languageLabel.setObjectName(_fromUtf8("languageLabel")) - self.gridLayout.addWidget(self.languageLabel, 3, 0, 1, 1) - self.LanguageComboBox = QtGui.QComboBox(self.layoutWidget) - self.LanguageComboBox.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents) - self.LanguageComboBox.setObjectName(_fromUtf8("LanguageComboBox")) - self.gridLayout.addWidget(self.LanguageComboBox, 3, 1, 1, 1) - self.autoLanguageCheckBox = QtGui.QCheckBox(self.layoutWidget) - self.autoLanguageCheckBox.setChecked(True) - self.autoLanguageCheckBox.setObjectName(_fromUtf8("autoLanguageCheckBox")) - self.gridLayout.addWidget(self.autoLanguageCheckBox, 2, 0, 1, 1) self.label = QtGui.QLabel(self.DefaultsPage) self.label.setGeometry(QtCore.QRect(40, 190, 471, 17)) self.label.setObjectName(_fromUtf8("label")) @@ -188,7 +177,5 @@ class Ui_FirstTimeWizard(object): self.DefaultsPage.setSubTitle(QtGui.QApplication.translate("FirstTimeWizard", "Set up default values to be used by OpenLP", None, QtGui.QApplication.UnicodeUTF8)) self.displaySelectionLabel.setText(QtGui.QApplication.translate("FirstTimeWizard", "Default output display", None, QtGui.QApplication.UnicodeUTF8)) self.themeSelectionLabel.setText(QtGui.QApplication.translate("FirstTimeWizard", "Select the default Theme", None, QtGui.QApplication.UnicodeUTF8)) - self.languageLabel.setText(QtGui.QApplication.translate("FirstTimeWizard", "Select default language", None, QtGui.QApplication.UnicodeUTF8)) - self.autoLanguageCheckBox.setText(QtGui.QApplication.translate("FirstTimeWizard", "Auto Language", None, QtGui.QApplication.UnicodeUTF8)) self.label.setText(QtGui.QApplication.translate("FirstTimeWizard", "Press Finish to apply all you changes and start OpenLP", None, QtGui.QApplication.UnicodeUTF8)) From b34726e7901b1abf6ee81d2ffc0a33ae2d9d4dd5 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 2 Mar 2011 17:53:26 +0000 Subject: [PATCH 12/90] Hook up dialog and get working --- openlp.pyw | 2 +- openlp/core/ui/firsttimelanguageform.py | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index 56626cf48..f006002c0 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -287,7 +287,7 @@ def main(): FirstTimeForm().exec_() if not options.no_error_form: sys.excepthook = app.hookException - sys.exit()#(app.run()) + sys.exit(app.run()) if __name__ == u'__main__': """ diff --git a/openlp/core/ui/firsttimelanguageform.py b/openlp/core/ui/firsttimelanguageform.py index e3ed16796..98489fde7 100644 --- a/openlp/core/ui/firsttimelanguageform.py +++ b/openlp/core/ui/firsttimelanguageform.py @@ -39,6 +39,7 @@ class FirstTimeLanguageForm(QtGui.QDialog, Ui_FirstTimeLanguageDialog): QtGui.QDialog.__init__(self, parent) self.setupUi(self) self.qmList = LanguageManager.get_qm_list() + self.LanguageComboBox.addItem(u'Automatic') for key in sorted(self.qmList.keys()): self.LanguageComboBox.addItem(key) @@ -49,19 +50,18 @@ class FirstTimeLanguageForm(QtGui.QDialog, Ui_FirstTimeLanguageDialog): return QtGui.QDialog.exec_(self) def accept(self): - print "Accept" -# if self.autoLanguageCheckBox.checkState() == QtCore.Qt.Checked: -# LanguageManager.auto_language = True -# LanguageManager.set_language(False, False) -# else: -# LanguageManager.auto_language = False -# action = QtGui.QAction(None) -# action.setObjectName(unicode(self.LanguageComboBox.currentText())) -# LanguageManager.set_language(action, False) + # It's the first row so must be Automatic + if self.LanguageComboBox.currentIndex() == 0: + LanguageManager.auto_language = True + LanguageManager.set_language(False, False) + else: + LanguageManager.auto_language = False + action = QtGui.QAction(None) + action.setObjectName(unicode(self.LanguageComboBox.currentText())) + LanguageManager.set_language(action, False) return QtGui.QDialog.accept(self) def reject(self): - print "Reject" LanguageManager.auto_language = True LanguageManager.set_language(False, False) return QtGui.QDialog.reject(self) From 3369f4ff09be71346492e1b641da3b4576a25045 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 2 Mar 2011 19:01:18 +0000 Subject: [PATCH 13/90] Add web configuration --- openlp.pyw | 2 +- openlp/core/ui/firsttimeform.py | 44 ++++++++++++++++----------------- 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index f006002c0..56626cf48 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -287,7 +287,7 @@ def main(): FirstTimeForm().exec_() if not options.no_error_form: sys.excepthook = app.hookException - sys.exit(app.run()) + sys.exit()#(app.run()) if __name__ == u'__main__': """ diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index 76f88b8b1..b4921bdc9 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -24,6 +24,8 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +import ConfigParser +import io import logging from PyQt4 import QtCore, QtGui @@ -44,14 +46,11 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): def __init__(self, parent=None): # check to see if we have web access - self.webAccess = get_web_page(u'http://openlp.org/files/frw/themes.lst') - print self.webAccess + self.config = ConfigParser.ConfigParser() + self.webAccess = get_web_page(u'http://openlp.org/files/frw/download.cfg') if self.webAccess: - self.themes = self.webAccess.read() - songs = get_web_page(u'http://openlp.org/files/frw/songs.lst') - self.songs = songs.read() - bibles = get_web_page(u'http://openlp.org/files/frw/bibles.lst') - self.bibles = bibles.read() + files = self.webAccess.read() + self.config.readfp(io.BytesIO(files)) QtGui.QWizard.__init__(self, parent) self.setupUi(self) #self.registerFields() @@ -72,30 +71,29 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): if self.webAccess: self.internetGroupBox.setVisible(True) self.noInternetLabel.setVisible(False) + treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) + treewidgetitem.setText(0, u'Songs') + self.__loadChild(treewidgetitem, u'songs', u'languages', u'songs') + treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) + treewidgetitem.setText(0, u'Bibles') + self.__loadChild(treewidgetitem, u'bibles', u'translations', u'bible') + treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) + treewidgetitem.setText(0, u'Themes') + self.__loadChild(treewidgetitem, u'themes', u'files', 'theme') else: self.internetGroupBox.setVisible(False) self.noInternetLabel.setVisible(True) - # Sort out Language settings - treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) - treewidgetitem.setText(0, u'Songs') - self.__loadChild(treewidgetitem, self.songs) - treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) - treewidgetitem.setText(0, u'Bibles') - self.__loadChild(treewidgetitem, self.bibles) - treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) - treewidgetitem.setText(0, u'Themes') - self.__loadChild(treewidgetitem, self.themes) - def __loadChild(self, tree, list): - list = list.split(u'\n') - for item in list: - if item: + def __loadChild(self, tree, list, tag, root): + files = self.config.get(list, tag) + files = files.split(u',') + for file in files: + if file: child = QtGui.QTreeWidgetItem(tree) - child.setText(0, item) + child.setText(0, self.config.get(u'%s_%s' %(root, file), u'title')) child.setCheckState(0, QtCore.Qt.Unchecked) child.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) - #self.themeSelectionComboBox.addItem(theme) def accept(self): self.__pluginStatus(self.songsCheckBox, u'songs/status') From b09b36da8ee67e004057256599feb53934e31d70 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 2 Mar 2011 21:47:55 +0000 Subject: [PATCH 14/90] Move theme to default selection --- openlp/core/ui/firsttimeform.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index b4921bdc9..baf4624d6 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -91,10 +91,26 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): if file: child = QtGui.QTreeWidgetItem(tree) child.setText(0, self.config.get(u'%s_%s' %(root, file), u'title')) + child.setData(0, QtCore.Qt.UserRole, + QtCore.QVariant(self.config.get(u'%s_%s' %(root, file), u'filename'))) child.setCheckState(0, QtCore.Qt.Unchecked) child.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) + def initializePage(self, id): + """ + Set up the pages for Initial run through dialog + """ + wizardPage = self.page(id) + if wizardPage == self.DefaultsPage: + listIterator = QtGui.QTreeWidgetItemIterator(self.selectionTreeWidget) + while listIterator.value(): + parent = listIterator.value().parent() + if parent and listIterator.value().checkState(0) == QtCore.Qt.Checked: + if unicode(parent.text(0)) == u'Themes': + self.themeSelectionComboBox.addItem(listIterator.value().text(0)) + listIterator += 1 + def accept(self): self.__pluginStatus(self.songsCheckBox, u'songs/status') self.__pluginStatus(self.bibleCheckBox, u'bibles/status') @@ -105,6 +121,17 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): self.__pluginStatus(self.customCheckBox, u'custom/status') self.__pluginStatus(self.songUsageCheckBox, u'songusage/status') self.__pluginStatus(self.alertCheckBox, u'alerts/status') + + listIterator = QtGui.QTreeWidgetItemIterator(self.selectionTreeWidget) + while listIterator.value(): + type = listIterator.value().parent() + if listIterator.value().parent(): + if listIterator.value().checkState(0) == QtCore.Qt.Checked: + # Install + print type, listIterator.value().data(0, QtCore.Qt.UserRole).toString() + #if type == u'Themes': + #self.themeSelectionComboBox.addItem(listIterator.value().text()) + listIterator += 1 return QtGui.QWizard.accept(self) def __pluginStatus(self, field, tag): From cec487be858bd5be357113590fedc328dfcd77c9 Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Fri, 4 Mar 2011 13:57:39 +0000 Subject: [PATCH 15/90] Unused imports --- openlp/plugins/bibles/lib/csvbible.py | 2 -- openlp/plugins/bibles/lib/openlp1.py | 2 -- openlp/plugins/bibles/lib/opensong.py | 2 -- openlp/plugins/bibles/lib/osis.py | 2 -- 4 files changed, 8 deletions(-) diff --git a/openlp/plugins/bibles/lib/csvbible.py b/openlp/plugins/bibles/lib/csvbible.py index 18bf06cfb..b96382df2 100644 --- a/openlp/plugins/bibles/lib/csvbible.py +++ b/openlp/plugins/bibles/lib/csvbible.py @@ -69,8 +69,6 @@ import logging import chardet import csv -from PyQt4 import QtCore - from openlp.core.lib import Receiver, translate from openlp.plugins.bibles.lib.db import BibleDB, Testament diff --git a/openlp/plugins/bibles/lib/openlp1.py b/openlp/plugins/bibles/lib/openlp1.py index 03011fa5e..2d19db20c 100644 --- a/openlp/plugins/bibles/lib/openlp1.py +++ b/openlp/plugins/bibles/lib/openlp1.py @@ -27,8 +27,6 @@ import logging import sqlite -from PyQt4 import QtCore - from openlp.core.lib import Receiver from openlp.core.ui.wizard import WizardStrings from openlp.plugins.bibles.lib.db import BibleDB diff --git a/openlp/plugins/bibles/lib/opensong.py b/openlp/plugins/bibles/lib/opensong.py index 356483986..a7f1eff33 100644 --- a/openlp/plugins/bibles/lib/opensong.py +++ b/openlp/plugins/bibles/lib/opensong.py @@ -25,9 +25,7 @@ ############################################################################### import logging - from lxml import objectify -from PyQt4 import QtCore from openlp.core.lib import Receiver, translate from openlp.plugins.bibles.lib.db import BibleDB diff --git a/openlp/plugins/bibles/lib/osis.py b/openlp/plugins/bibles/lib/osis.py index 000471b96..78e2551d9 100644 --- a/openlp/plugins/bibles/lib/osis.py +++ b/openlp/plugins/bibles/lib/osis.py @@ -31,8 +31,6 @@ import chardet import codecs import re -from PyQt4 import QtCore - from openlp.core.lib import Receiver, translate from openlp.core.utils import AppLocation from openlp.plugins.bibles.lib.db import BibleDB From 2cd7c2c66e8f99cc86924d1a72e66731903a7afa Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Fri, 4 Mar 2011 14:44:21 +0000 Subject: [PATCH 16/90] Cleanups --- openlp/core/ui/screen.py | 2 +- openlp/plugins/songs/forms/songexportform.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/openlp/core/ui/screen.py b/openlp/core/ui/screen.py index 9f8191961..6b4978727 100644 --- a/openlp/core/ui/screen.py +++ b/openlp/core/ui/screen.py @@ -123,7 +123,7 @@ class ScreenList(object): [u'Screen 1 (primary)', u'Screen 2'] """ - screen_list= [] + screen_list = [] for screen in self.screen_list: screen_name = u'%s %d' % (translate('OpenLP.ScreenList', 'Screen'), screen[u'number'] + 1) diff --git a/openlp/plugins/songs/forms/songexportform.py b/openlp/plugins/songs/forms/songexportform.py index dbcff42f3..d8bc8b3a6 100644 --- a/openlp/plugins/songs/forms/songexportform.py +++ b/openlp/plugins/songs/forms/songexportform.py @@ -355,7 +355,8 @@ class SongExportForm(OpenLPWizard): the path to *directoryLineEdit*. """ path = unicode(QtGui.QFileDialog.getExistingDirectory(self, - translate('SongsPlugin.ExportWizardForm', 'Select Destination Folder'), + translate('SongsPlugin.ExportWizardForm', + 'Select Destination Folder'), SettingsManager.get_last_dir(self.plugin.settingsSection, 1), options=QtGui.QFileDialog.ShowDirsOnly)) SettingsManager.set_last_dir(self.plugin.settingsSection, path, 1) From 50818a63119c476c68b7ec8bdea2f4ac6538a3dd Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 4 Mar 2011 16:21:50 +0100 Subject: [PATCH 17/90] set 'Show Display' visible after changing the monitor setup --- openlp/core/ui/slidecontroller.py | 38 +++++++++++++++---------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 8d612676b..f6d0e98f5 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -32,7 +32,7 @@ from PyQt4.phonon import Phonon from openlp.core.lib import OpenLPToolbar, Receiver, resize_image, \ ItemCapabilities, translate -from openlp.core.lib.ui import UiStrings, shortcut_action +from openlp.core.lib.ui import icon_action, UiStrings, shortcut_action from openlp.core.ui import HideMode, MainDisplay log = logging.getLogger(__name__) @@ -146,34 +146,33 @@ class SlideController(QtGui.QWidget): u':/slides/slide_next.png', translate('OpenLP.SlideController', 'Move to next'), self.onSlideSelectedNext) + self.toolbar.addToolbarSeparator(u'Close Separator') if self.isLive: - self.toolbar.addToolbarSeparator(u'Close Separator') self.hideMenu = QtGui.QToolButton(self.toolbar) self.hideMenu.setText(translate('OpenLP.SlideController', 'Hide')) self.hideMenu.setPopupMode(QtGui.QToolButton.MenuButtonPopup) self.toolbar.addToolbarWidget(u'Hide Menu', self.hideMenu) self.hideMenu.setMenu(QtGui.QMenu( translate('OpenLP.SlideController', 'Hide'), self.toolbar)) - self.blankScreen = QtGui.QAction(QtGui.QIcon( - u':/slides/slide_blank.png'), - translate('OpenLP.SlideController', - 'Blank Screen'), self.hideMenu) - self.blankScreen.setCheckable(True) - self.themeScreen = QtGui.QAction(QtGui.QIcon( - u':/slides/slide_theme.png'), - translate('OpenLP.SlideController', - 'Blank to Theme'), self.hideMenu) - self.themeScreen.setCheckable(True) + self.blankScreen = icon_action(self.hideMenu, u'Blank Screen', + u':/slides/slide_blank.png', False) + self.blankScreen.setText( + translate('OpenLP.SlideController', 'Blank Screen')) + self.themeScreen = icon_action(self.hideMenu, u'Blank Theme', + u':/slides/slide_theme.png', False) + self.themeScreen.setText( + translate('OpenLP.SlideController', 'Blank to Theme')) + self.desktopScreen = icon_action(self.hideMenu, u'Desktop Screen', + u':/slides/slide_desktop.png', False) + self.desktopScreen.setText( + translate('OpenLP.SlideController', 'Show Desktop')) + self.desktopScreen.setVisible(False) self.hideMenu.setDefaultAction(self.blankScreen) self.hideMenu.menu().addAction(self.blankScreen) self.hideMenu.menu().addAction(self.themeScreen) + self.hideMenu.menu().addAction(self.desktopScreen) if self.screens.display_count > 1: - self.desktopScreen = QtGui.QAction(QtGui.QIcon( - u':/slides/slide_desktop.png'), - translate('OpenLP.SlideController', - 'Show Desktop'), self.hideMenu) - self.hideMenu.menu().addAction(self.desktopScreen) - self.desktopScreen.setCheckable(True) + self.desktopScreen.setVisible(True) QtCore.QObject.connect(self.desktopScreen, QtCore.SIGNAL(u'triggered(bool)'), self.onHideDisplay) self.toolbar.addToolbarSeparator(u'Loop Separator') @@ -195,7 +194,6 @@ class SlideController(QtGui.QWidget): self.delaySpinBox.setToolTip(translate('OpenLP.SlideController', 'Delay between slides in seconds')) else: - self.toolbar.addToolbarSeparator(u'Close Separator') self.toolbar.addToolbarButton( # Does not need translating - control string. u'Go Live', u':/general/general_live.png', @@ -411,6 +409,8 @@ class SlideController(QtGui.QWidget): Settings dialog has changed the screen size of adjust output and screen previews. """ + if hasattr(self, u'desktopScreen'): + self.desktopScreen.setVisible(self.screens.display_count > 1) # rebuild display as screen size changed self.display = MainDisplay(self, self.screens, self.isLive) self.display.imageManager = self.parent.renderManager.image_manager From 9ae56fa75459cd236337a1caa05101b321d3265b Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 4 Mar 2011 16:31:34 +0100 Subject: [PATCH 18/90] clean up --- openlp/core/ui/slidecontroller.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index f6d0e98f5..e93d9ff68 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -114,8 +114,7 @@ class SlideController(QtGui.QWidget): self.previewListWidget = SlideList(self) self.previewListWidget.setColumnCount(1) self.previewListWidget.horizontalHeader().setVisible(False) - self.previewListWidget.setColumnWidth( - 0, self.controller.width()) + self.previewListWidget.setColumnWidth(0, self.controller.width()) self.previewListWidget.isLive = self.isLive self.previewListWidget.setObjectName(u'PreviewListWidget') self.previewListWidget.setSelectionBehavior(1) @@ -166,15 +165,11 @@ class SlideController(QtGui.QWidget): u':/slides/slide_desktop.png', False) self.desktopScreen.setText( translate('OpenLP.SlideController', 'Show Desktop')) - self.desktopScreen.setVisible(False) + self.desktopScreen.setVisible(self.screens.display_count > 1) self.hideMenu.setDefaultAction(self.blankScreen) self.hideMenu.menu().addAction(self.blankScreen) self.hideMenu.menu().addAction(self.themeScreen) self.hideMenu.menu().addAction(self.desktopScreen) - if self.screens.display_count > 1: - self.desktopScreen.setVisible(True) - QtCore.QObject.connect(self.desktopScreen, - QtCore.SIGNAL(u'triggered(bool)'), self.onHideDisplay) self.toolbar.addToolbarSeparator(u'Loop Separator') self.toolbar.addToolbarButton( # Does not need translating - control string. @@ -224,8 +219,7 @@ class SlideController(QtGui.QWidget): if self.isLive: # Build the Song Toolbar self.songMenu = QtGui.QToolButton(self.toolbar) - self.songMenu.setText(translate('OpenLP.SlideController', - 'Go To')) + self.songMenu.setText(translate('OpenLP.SlideController', 'Go To')) self.songMenu.setPopupMode(QtGui.QToolButton.InstantPopup) self.toolbar.addToolbarWidget(u'Song Menu', self.songMenu) self.songMenu.setMenu(QtGui.QMenu( @@ -301,6 +295,8 @@ class SlideController(QtGui.QWidget): QtCore.SIGNAL(u'triggered(bool)'), self.onBlankDisplay) QtCore.QObject.connect(self.themeScreen, QtCore.SIGNAL(u'triggered(bool)'), self.onThemeDisplay) + QtCore.QObject.connect(self.desktopScreen, + QtCore.SIGNAL(u'triggered(bool)'), self.onHideDisplay) QtCore.QObject.connect(self.volumeSlider, QtCore.SIGNAL(u'sliderReleased()'), self.mediaVolume) QtCore.QObject.connect(Receiver.get_receiver(), @@ -409,7 +405,7 @@ class SlideController(QtGui.QWidget): Settings dialog has changed the screen size of adjust output and screen previews. """ - if hasattr(self, u'desktopScreen'): + if self.isLive: self.desktopScreen.setVisible(self.screens.display_count > 1) # rebuild display as screen size changed self.display = MainDisplay(self, self.screens, self.isLive) From f4e723ed1ccbc6b757a8a5f0c4ce130e5adadcd8 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 4 Mar 2011 18:31:23 +0100 Subject: [PATCH 19/90] fixed songs, without footer --- openlp/core/lib/serviceitem.py | 9 ++++----- openlp/plugins/bibles/lib/mediaitem.py | 14 ++++---------- openlp/plugins/songs/lib/mediaitem.py | 10 ++++------ 3 files changed, 12 insertions(+), 21 deletions(-) diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 9f2d0ff37..2dd87f6f5 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -88,8 +88,8 @@ class ServiceItem(object): self.audit = u'' self.items = [] self.iconic_representation = None - self.raw_footer = None - self.foot_text = None + self.raw_footer = [] + self.foot_text = u'' self.theme = None self.service_item_type = None self._raw_frames = [] @@ -183,9 +183,8 @@ class ServiceItem(object): else: log.error(u'Invalid value renderer :%s' % self.service_item_type) self.title = clean_tags(self.title) - self.foot_text = None - if self.raw_footer: - self.foot_text = u'
'.join(self.raw_footer) + self.foot_text = \ + u'
'.join([footer for footer in self.raw_footer if footer]) def add_from_image(self, path, title): """ diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index ab7897828..d63dfab0a 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -635,7 +635,6 @@ class BibleMediaItem(MediaManagerItem): bible_text = u'' old_item = None old_chapter = -1 - raw_footer = [] raw_slides = [] raw_title = [] for item in items: @@ -656,13 +655,13 @@ class BibleMediaItem(MediaManagerItem): second_text = self._decodeQtObject(bitem, 'second_text') verse_text = self.formatVerse(old_chapter, chapter, verse) footer = u'%s (%s %s %s)' % (book, version, copyright, permissions) - if footer not in raw_footer: - raw_footer.append(footer) + if footer not in service_item.raw_footer: + service_item.raw_footer.append(footer) if second_bible: footer = u'%s (%s %s %s)' % (book, second_version, second_copyright, second_permissions) - if footer not in raw_footer: - raw_footer.append(footer) + if footer not in service_item.raw_footer: + service_item.raw_footer.append(footer) bible_text = u'%s %s\n\n%s %s' % (verse_text, text, verse_text, second_text) raw_slides.append(bible_text.rstrip()) @@ -706,11 +705,6 @@ class BibleMediaItem(MediaManagerItem): service_item.theme = self.settings.bible_theme for slide in raw_slides: service_item.add_from_text(slide[:30], slide) - if service_item.raw_footer: - for footer in raw_footer: - service_item.raw_footer.append(footer) - else: - service_item.raw_footer = raw_footer return True def formatTitle(self, start_item, old_item): diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index d29e18c1d..37a404daa 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -330,7 +330,6 @@ class SongMediaItem(MediaManagerItem): def generateSlideData(self, service_item, item=None, xmlVersion=False): log.debug(u'generateSlideData (%s:%s)' % (service_item, item)) - raw_footer = [] item_id = self._getIdOfItemToGenerate(item, self.remoteSong) service_item.add_capability(ItemCapabilities.AllowsEdit) service_item.add_capability(ItemCapabilities.AllowsPreview) @@ -392,16 +391,15 @@ class SongMediaItem(MediaManagerItem): service_item.add_from_text(slide[:30], unicode(slide)) service_item.title = song.title author_list = [unicode(author.display_name) for author in song.authors] - raw_footer.append(song.title) - raw_footer.append(u', '.join(author_list)) - raw_footer.append(song.copyright) + service_item.raw_footer.append(song.title) + service_item.raw_footer.append(u', '.join(author_list)) + service_item.raw_footer.append(song.copyright) if QtCore.QSettings().value(u'general/ccli number', QtCore.QVariant(u'')).toString(): - raw_footer.append(unicode( + service_item.raw_footer.append(unicode( translate('SongsPlugin.MediaItem', 'CCLI License: ') + QtCore.QSettings().value(u'general/ccli number', QtCore.QVariant(u'')).toString())) - service_item.raw_footer = raw_footer service_item.audit = [ song.title, author_list, song.copyright, unicode(song.ccli_number) ] From 2af3c7af7cbd3d5b3d316175fd368af4ee0c4054 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 4 Mar 2011 18:46:59 +0100 Subject: [PATCH 20/90] hide 'Add Tool...' entry --- openlp/core/ui/mainwindow.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index b9de8a12e..7b9a520bc 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -206,7 +206,7 @@ class Ui_MainWindow(object): mainWindow.actionList.add_action(self.ModeDefaultItem, u'View Mode') self.ModeSetupItem = checkable_action(mainWindow, u'ModeLiveItem') mainWindow.actionList.add_action(self.ModeSetupItem, u'View Mode') - self.ModeLiveItem = checkable_action(mainWindow, u'ModeLiveItem') + self.ModeLiveItem = checkable_action(mainWindow, u'ModeLiveItem', True) mainWindow.actionList.add_action(self.ModeLiveItem, u'View Mode') self.ModeGroup = QtGui.QActionGroup(mainWindow) self.ModeGroup.addAction(self.ModeDefaultItem) @@ -215,6 +215,8 @@ class Ui_MainWindow(object): self.ModeDefaultItem.setChecked(True) self.ToolsAddToolItem = icon_action(mainWindow, u'ToolsAddToolItem', u':/tools/tools_add.png') + # Hide the entry, as it does not have any functionality yet. + self.ToolsAddToolItem.setVisible(False) mainWindow.actionList.add_action(self.ToolsAddToolItem, u'Tools') self.ToolsOpenDataFolder = icon_action(mainWindow, u'ToolsOpenDataFolder', u':/general/general_open.png') @@ -225,19 +227,17 @@ class Ui_MainWindow(object): u'Settings') # i18n Language Items self.AutoLanguageItem = checkable_action(mainWindow, - u'AutoLanguageItem') + u'AutoLanguageItem', LanguageManager.auto_language) mainWindow.actionList.add_action(self.AutoLanguageItem, u'Settings') self.LanguageGroup = QtGui.QActionGroup(mainWindow) self.LanguageGroup.setExclusive(True) self.LanguageGroup.setObjectName(u'LanguageGroup') - self.AutoLanguageItem.setChecked(LanguageManager.auto_language) self.LanguageGroup.setDisabled(LanguageManager.auto_language) qmList = LanguageManager.get_qm_list() savedLanguage = LanguageManager.get_language() for key in sorted(qmList.keys()): - languageItem = checkable_action(mainWindow, key) - if qmList[key] == savedLanguage: - languageItem.setChecked(True) + languageItem = checkable_action( + mainWindow, key, qmList[key] == savedLanguage) add_actions(self.LanguageGroup, [languageItem]) self.SettingsShortcutsItem = icon_action(mainWindow, u'SettingsShortcutsItem', From 4927bad4d2e244da4418ba32cb021c86ff0cdd4f Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 4 Mar 2011 18:22:44 +0000 Subject: [PATCH 21/90] Start updates --- openlp/core/ui/firsttimeform.py | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index baf4624d6..7fcf4596b 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -27,13 +27,15 @@ import ConfigParser import io import logging +import os +import urllib from PyQt4 import QtCore, QtGui from firsttimewizard import Ui_FirstTimeWizard -from openlp.core.lib import translate, PluginStatus -from openlp.core.utils import get_web_page +from openlp.core.lib import translate, PluginStatus, check_directory_exists +from openlp.core.utils import get_web_page, AppLocation log = logging.getLogger(__name__) @@ -46,8 +48,9 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): def __init__(self, parent=None): # check to see if we have web access + self.web = u'http://openlp.org/files/frw/' self.config = ConfigParser.ConfigParser() - self.webAccess = get_web_page(u'http://openlp.org/files/frw/download.cfg') + self.webAccess = get_web_page(u'%s%s' % (self.web, u'download.cfg')) if self.webAccess: files = self.webAccess.read() self.config.readfp(io.BytesIO(files)) @@ -123,14 +126,27 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): self.__pluginStatus(self.alertCheckBox, u'alerts/status') listIterator = QtGui.QTreeWidgetItemIterator(self.selectionTreeWidget) + songsDestination = AppLocation.get_section_data_path(u'songs') + check_directory_exists(songsDestination) + bibleDestination = AppLocation.get_section_data_path(u'bibles') + check_directory_exists(bibleDestination) + themeDestination = AppLocation.get_section_data_path(u'themes') + check_directory_exists(themeDestination) while listIterator.value(): type = listIterator.value().parent() if listIterator.value().parent(): if listIterator.value().checkState(0) == QtCore.Qt.Checked: # Install - print type, listIterator.value().data(0, QtCore.Qt.UserRole).toString() - #if type == u'Themes': - #self.themeSelectionComboBox.addItem(listIterator.value().text()) + if unicode(type.text(0)) == u'Bibles': + theme = unicode(listIterator.value().data(0, + QtCore.Qt.UserRole).toString()) + urllib.urlretrieve(u'%s%s' % (self.web, theme), + os.path.join(bibleDestination, theme)) + if unicode(type.text(0)) == u'Themes': + theme = unicode(listIterator.value().data(0, + QtCore.Qt.UserRole).toString()) + urllib.urlretrieve(u'%s%s' % (self.web, theme), + os.path.join(themeDestination, theme)) listIterator += 1 return QtGui.QWizard.accept(self) From c34d82fd1069a543fc308e9ecfbdd03b4516385c Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 4 Mar 2011 23:02:43 +0200 Subject: [PATCH 22/90] Updated the credits. --- openlp/core/ui/aboutdialog.py | 84 ++++++++++++++++++++++++++++++----- 1 file changed, 73 insertions(+), 11 deletions(-) diff --git a/openlp/core/ui/aboutdialog.py b/openlp/core/ui/aboutdialog.py index c3ab5a00f..b1b319c6b 100644 --- a/openlp/core/ui/aboutdialog.py +++ b/openlp/core/ui/aboutdialog.py @@ -108,19 +108,40 @@ class Ui_AboutDialog(object): self.aboutNotebook.indexOf(self.aboutTab), UiStrings.About) lead = u'Raoul "superfly" Snyman' developers = [u'Tim "TRB143" Bentley', u'Jonathan "gushie" Corwin', - u'Michael "cocooncrash" Gorven', u'Scott "sguerrieri" Guerrieri', - u'Raoul "superfly" Snyman', u'Martin "mijiti" Thompson', - u'Jon "Meths" Tibble<'] - contributors = [u'Meinert "m2j" Jordan', u'Andreas "googol" Preikschat', + u'Michael "cocooncrash" Gorven', + u'Andreas "googol" Preikschat', u'Raoul "superfly" Snyman', + u'Martin "mijiti" Thompson', u'Jon "Meths" Tibble'] + contributors = [u'Scott "sguerrieri" Guerrieri', + u'Meinert "m2j" Jordan', u'Armin "orangeshirt" K\xf6hler', u'Christian "crichter" Richter', u'Philip "Phill" Ridout', - u'Maikel Stuivenberg', u'Carsten "catini" Tingaard', - u'Frode "frodus" Woldsund'] - testers = [u'Philip "Phill" Ridout', u'Wesley "wrst" Stout (lead)'] - packagers = [u'Thomas "tabthorpe" Abthorpe (FreeBSD)', + u'Jeffrey "whydoubt" Smith', u'Maikel Stuivenberg', + u'Carsten "catini" Tingaard', u'Frode "frodus" Woldsund'] + testers = [u'Philip "Phill" Ridout', u'Wesley "wrst" Stout', + u'John "jseagull1" Cegalis (lead)'] + packagers = ['Thomas "tabthorpe" Abthorpe (FreeBSD)', u'Tim "TRB143" Bentley (Fedora)', u'Michael "cocooncrash" Gorven (Ubuntu)', u'Matthias "matthub" Hub (Mac OS X)', u'Raoul "superfly" Snyman (Windows, Ubuntu)'] + translators = { + u'af': [u'Johan "nuvolari" Mynhardt'], + u'de': [u'Patrick "madmuffin" Br\xfcckner', + u'Meinert "m2j" Jordan', + u'Andreas "googol" Preikschat', + u'Christian "crichter" Richter'], + u'en_GB': [u'Tim "TRB143" Bentley', u'Jonathan "gushie" Corwin'], + u'en_ZA': [u'Raoul "superfly" Snyman'], + u'et': [u'Mattias "mahfiaz" P\xf5ldaru'], + u'fr': [u'Stephan\xe9 "stbrunner" Brunner'], + u'hu': [u'Gyuris Gellért'], + u'ja': [u'Kunio "Kunio" Nakamaru'], + u'nb': [u'Atle "pendlaren" Weibell', u'Frode "frodus" Woldsund'], + u'nl': [u'Arjen "typovar" van Voorst'], + u'pt_BR': [u'Rafael "rafaellerm" Lerm'], + u'ru': [u'Sergey "ratz" Ratz'] + } + documentors = [u'Wesley "wrst" Stout', + u'John "jseagull1" Cegalis (lead)'] self.creditsTextEdit.setPlainText(unicode(translate('OpenLP.AboutForm', 'Project Lead\n' ' %s\n' @@ -137,6 +158,35 @@ class Ui_AboutDialog(object): 'Packagers\n' ' %s\n' '\n' + 'Translators\n' + ' Afrikaans (af)\n' + ' %s\n' + ' German (de)\n' + ' %s\n' + ' English, United Kingdom (en_GB)\n' + ' %s\n' + ' English, South Africa (en_ZA)\n' + ' %s\n' + ' Estonian (et)\n' + ' %s\n' + ' French (fr)\n' + ' %s\n' + ' Hungarian (hu)\n' + ' %s\n' + ' Japanese (ja)\n' + ' %s\n' + ' Norwegian Bokm\xe5l (nb)\n' + ' %s\n' + ' Dutch (nl)\n' + ' %s\n' + ' Portuguese, Brazil (pt_BR)\n' + ' %s\n' + ' Russian (ru)\n' + ' %s\n' + '\n' + 'Documentation\n' + ' %s\n' + '\n' 'Built With\n' ' Python: http://www.python.org/\n' ' Qt4: http://qt.nokia.com/\n' @@ -155,7 +205,19 @@ class Ui_AboutDialog(object): ' bring this software to you for free because\n' ' He has set us free.')) % (lead, u'\n '.join(developers), u'\n '.join(contributors), u'\n '.join(testers), - u'\n '.join(packagers))) + u'\n '.join(packagers), u'\n '.join(translators[u'af']), + u'\n '.join(translators[u'de']), + u'\n '.join(translators[u'en_GB']), + u'\n '.join(translators[u'en_ZA']), + u'\n '.join(translators[u'et']), + u'\n '.join(translators[u'fr']), + u'\n '.join(translators[u'hu']), + u'\n '.join(translators[u'ja']), + u'\n '.join(translators[u'nb']), + u'\n '.join(translators[u'nl']), + u'\n '.join(translators[u'pt_BR']), + u'\n '.join(translators[u'ru']), + u'\n '.join(documentors))) self.aboutNotebook.setTabText( self.aboutNotebook.indexOf(self.creditsTab), translate('OpenLP.AboutForm', 'Credits')) @@ -176,7 +238,7 @@ class Ui_AboutDialog(object): 'but WITHOUT ANY WARRANTY; without even the implied warranty of ' 'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See below ' 'for more details.') - gpltext = ('GNU GENERAL PUBLIC LICENSE\n' + gpltext = 'GNU GENERAL PUBLIC LICENSE\n' 'Version 2, June 1991\n' '\n' 'Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 ' @@ -546,7 +608,7 @@ class Ui_AboutDialog(object): 'subroutine library, you may consider it more useful to permit ' 'linking proprietary applications with the library. If this is ' 'what you want to do, use the GNU Lesser General Public License ' - 'instead of this License.') + 'instead of this License.' self.licenseTextEdit.setPlainText(u'%s\n\n%s\n\n%s\n\n\n%s' % (copyright, licence, disclaimer, gpltext)) self.aboutNotebook.setTabText( From fb1b2cc26898619cae0578831de06618cf361706 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sat, 5 Mar 2011 10:44:13 +0200 Subject: [PATCH 23/90] Updated the credits. --- openlp/core/ui/aboutdialog.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/openlp/core/ui/aboutdialog.py b/openlp/core/ui/aboutdialog.py index b1b319c6b..d973c5680 100644 --- a/openlp/core/ui/aboutdialog.py +++ b/openlp/core/ui/aboutdialog.py @@ -205,18 +205,18 @@ class Ui_AboutDialog(object): ' bring this software to you for free because\n' ' He has set us free.')) % (lead, u'\n '.join(developers), u'\n '.join(contributors), u'\n '.join(testers), - u'\n '.join(packagers), u'\n '.join(translators[u'af']), - u'\n '.join(translators[u'de']), - u'\n '.join(translators[u'en_GB']), - u'\n '.join(translators[u'en_ZA']), - u'\n '.join(translators[u'et']), - u'\n '.join(translators[u'fr']), - u'\n '.join(translators[u'hu']), - u'\n '.join(translators[u'ja']), - u'\n '.join(translators[u'nb']), - u'\n '.join(translators[u'nl']), - u'\n '.join(translators[u'pt_BR']), - u'\n '.join(translators[u'ru']), + u'\n '.join(packagers), u'\n '.join(translators[u'af']), + u'\n '.join(translators[u'de']), + u'\n '.join(translators[u'en_GB']), + u'\n '.join(translators[u'en_ZA']), + u'\n '.join(translators[u'et']), + u'\n '.join(translators[u'fr']), + u'\n '.join(translators[u'hu']), + u'\n '.join(translators[u'ja']), + u'\n '.join(translators[u'nb']), + u'\n '.join(translators[u'nl']), + u'\n '.join(translators[u'pt_BR']), + u'\n '.join(translators[u'ru']), u'\n '.join(documentors))) self.aboutNotebook.setTabText( self.aboutNotebook.indexOf(self.creditsTab), @@ -238,7 +238,7 @@ class Ui_AboutDialog(object): 'but WITHOUT ANY WARRANTY; without even the implied warranty of ' 'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See below ' 'for more details.') - gpltext = 'GNU GENERAL PUBLIC LICENSE\n' + gpltext = ('GNU GENERAL PUBLIC LICENSE\n' 'Version 2, June 1991\n' '\n' 'Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 ' @@ -608,7 +608,7 @@ class Ui_AboutDialog(object): 'subroutine library, you may consider it more useful to permit ' 'linking proprietary applications with the library. If this is ' 'what you want to do, use the GNU Lesser General Public License ' - 'instead of this License.' + 'instead of this License.') self.licenseTextEdit.setPlainText(u'%s\n\n%s\n\n%s\n\n\n%s' % (copyright, licence, disclaimer, gpltext)) self.aboutNotebook.setTabText( From cb661bf1ce912407247e649d4593024ec81ce18c Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 5 Mar 2011 09:23:47 +0000 Subject: [PATCH 24/90] bibles and themes work --- openlp.pyw | 30 +++++++++-------- openlp/core/ui/firsttimeform.py | 54 ++++++++++++++++++++++--------- openlp/core/ui/firsttimewizard.py | 13 +++++--- openlp/core/ui/mainwindow.py | 5 ++- openlp/core/ui/thememanager.py | 18 +++++++++++ 5 files changed, 85 insertions(+), 35 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index 650c00725..76c263ea5 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -151,7 +151,7 @@ class OpenLP(QtGui.QApplication): log.info(u'Openlp version %s' % app_version[u'version']) return app_version - def run(self, screens): + def run(self): """ Run the OpenLP application. """ @@ -167,6 +167,13 @@ class OpenLP(QtGui.QApplication): self.setOrganizationDomain(u'openlp.org') self.setApplicationName(u'OpenLP') self.setApplicationVersion(app_version[u'version']) + # Decide how many screens we have and their size + screens = ScreenList(self.desktop()) + # First time checks in settings + firstTime = QtCore.QSettings().value( + u'general/first time', QtCore.QVariant(True)).toBool() +# if firstTime: +# FirstTimeForm(screens).exec_() if os.name == u'nt': self.setStyleSheet(application_stylesheet) show_splash = QtCore.QSettings().value( @@ -178,7 +185,8 @@ class OpenLP(QtGui.QApplication): self.processEvents() # start the main app window self.appClipboard = self.clipboard() - self.mainWindow = MainWindow(screens, app_version, self.appClipboard) + self.mainWindow = MainWindow(screens, app_version, self.appClipboard, + firstTime) self.mainWindow.show() if show_splash: # now kill the splashscreen @@ -265,11 +273,11 @@ def main(): # Define the settings environment QtCore.QSettings(u'OpenLP', u'OpenLP') # First time checks in settings - if QtCore.QSettings().value( - u'general/first time', QtCore.QVariant(True)).toBool(): - if not FirstTimeLanguageForm().exec_(): - # if cancel then stop processing - sys.exit() +# if QtCore.QSettings().value( +# u'general/first time', QtCore.QVariant(True)).toBool(): +# if not FirstTimeLanguageForm().exec_(): +# # if cancel then stop processing +# sys.exit() if sys.platform == u'darwin': OpenLP.addLibraryPath(QtGui.QApplication.applicationDirPath() + "/qt4_plugins") @@ -277,15 +285,9 @@ def main(): language = LanguageManager.get_language() appTranslator = LanguageManager.get_translator(language) app.installTranslator(appTranslator) - # Decide how many screens we have and their size - screens = ScreenList(app.desktop()) - # First time checks in settings - if QtCore.QSettings().value( - u'general/first time', QtCore.QVariant(True)).toBool(): - FirstTimeForm(screens).exec_() if not options.no_error_form: sys.excepthook = app.hookException - sys.exit()#(app.run(screens)) + sys.exit(app.run()) if __name__ == u'__main__': """ diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index 4c2c699b6..df21b93d5 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -34,7 +34,7 @@ from PyQt4 import QtCore, QtGui from firsttimewizard import Ui_FirstTimeWizard -from openlp.core.lib import translate, PluginStatus, check_directory_exists +from openlp.core.lib import translate, PluginStatus, check_directory_exists, Receiver from openlp.core.utils import get_web_page, AppLocation log = logging.getLogger(__name__) @@ -58,6 +58,17 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): self.setupUi(self) for screen in screens.get_screen_list(): self.displaySelectionComboBox.addItem(screen) + self.songsText = translate('OpenLP.FirstTimeWizard', 'Songs') + self.biblesText = translate('OpenLP.FirstTimeWizard', 'Bibles') + self.themesText = translate('OpenLP.FirstTimeWizard', 'Themes') + self.startUpdates = translate('OpenLP.FirstTimeWizard', + 'Starting Updates') + self.downloadSongs = unicode(translate('OpenLP.FirstTimeWizard', + 'Downloading Songs.')) + self.downloadBible = unicode(translate('OpenLP.FirstTimeWizard', + 'Downloading bible')) + self.downloadTheme = unicode(translate('OpenLP.FirstTimeWizard', + 'Downloading theme')) def exec_(self, edit=False): """ @@ -76,13 +87,13 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): self.internetGroupBox.setVisible(True) self.noInternetLabel.setVisible(False) treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) - treewidgetitem.setText(0, u'Songs') + treewidgetitem.setText(0, self.songsText) self.__loadChild(treewidgetitem, u'songs', u'languages', u'songs') treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) - treewidgetitem.setText(0, u'Bibles') + treewidgetitem.setText(0, self.biblesText) self.__loadChild(treewidgetitem, u'bibles', u'translations', u'bible') treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) - treewidgetitem.setText(0, u'Themes') + treewidgetitem.setText(0, self.themesText) self.__loadChild(treewidgetitem, u'themes', u'files', 'theme') else: self.internetGroupBox.setVisible(False) @@ -94,9 +105,11 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): for file in files: if file: child = QtGui.QTreeWidgetItem(tree) - child.setText(0, self.config.get(u'%s_%s' %(root, file), u'title')) + child.setText(0, self.config.get(u'%s_%s' + % (root, file), u'title')) child.setData(0, QtCore.Qt.UserRole, - QtCore.QVariant(self.config.get(u'%s_%s' %(root, file), u'filename'))) + QtCore.QVariant(self.config.get(u'%s_%s' + % (root, file), u'filename'))) child.setCheckState(0, QtCore.Qt.Unchecked) child.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) @@ -107,15 +120,18 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): """ wizardPage = self.page(id) if wizardPage == self.DefaultsPage: - listIterator = QtGui.QTreeWidgetItemIterator(self.selectionTreeWidget) + listIterator = QtGui.QTreeWidgetItemIterator( + self.selectionTreeWidget) while listIterator.value(): parent = listIterator.value().parent() - if parent and listIterator.value().checkState(0) == QtCore.Qt.Checked: - if unicode(parent.text(0)) == u'Themes': + if parent and listIterator.value().checkState(0) \ + == QtCore.Qt.Checked: + if unicode(parent.text(0)) == self.themesText: self.themeSelectionComboBox.addItem(listIterator.value().text(0)) listIterator += 1 def accept(self): + self.__updateMessage(self.startUpdates) self.__pluginStatus(self.songsCheckBox, u'songs/status') self.__pluginStatus(self.bibleCheckBox, u'bibles/status') self.__pluginStatus(self.presentationCheckBox, u'presentations/status') @@ -138,14 +154,18 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): if listIterator.value().parent(): if listIterator.value().checkState(0) == QtCore.Qt.Checked: # Install - if unicode(type.text(0)) == u'Bibles': - theme = unicode(listIterator.value().data(0, - QtCore.Qt.UserRole).toString()) - urllib.urlretrieve(u'%s%s' % (self.web, theme), - os.path.join(bibleDestination, theme)) - if unicode(type.text(0)) == u'Themes': + if unicode(type.text(0)) == self.biblesText: + bible = unicode(listIterator.value().data(0, + QtCore.Qt.UserRole).toString()) + message = u'%s %s' % (self.downloadBible, bible) + self.__updateMessage(message) + urllib.urlretrieve(u'%s%s' % (self.web, bible), + os.path.join(bibleDestination, bible)) + if unicode(type.text(0)) == self.themesText: theme = unicode(listIterator.value().data(0, QtCore.Qt.UserRole).toString()) + message = u'%s %s' % (self.downloadTheme, bible) + self.__updateMessage(message) urllib.urlretrieve(u'%s%s' % (self.web, theme), os.path.join(themeDestination, theme)) listIterator += 1 @@ -155,3 +175,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): status = PluginStatus.Active if field.checkState() \ == QtCore.Qt.Checked else PluginStatus.Inactive QtCore.QSettings().setValue(tag, QtCore.QVariant(status)) + + def __updateMessage(self, text): + self.updateLabel.setText(text) + Receiver.send_message(u'openlp_process_events') diff --git a/openlp/core/ui/firsttimewizard.py b/openlp/core/ui/firsttimewizard.py index 70805bfea..081ac9991 100644 --- a/openlp/core/ui/firsttimewizard.py +++ b/openlp/core/ui/firsttimewizard.py @@ -163,13 +163,16 @@ class Ui_FirstTimeWizard(object): QtGui.QComboBox.AdjustToContents) self.themeSelectionComboBox.setObjectName(u'themeSelectionComboBox') self.gridLayout.addWidget(self.themeSelectionComboBox, 1, 1, 1, 1) - self.label = QtGui.QLabel(self.DefaultsPage) - self.label.setGeometry(QtCore.QRect(40, 190, 471, 17)) - self.label.setObjectName(u'label') + self.messageLabel = QtGui.QLabel(self.DefaultsPage) + self.messageLabel.setGeometry(QtCore.QRect(60, 160, 471, 17)) + self.messageLabel.setObjectName(u'messageLabel') + self.updateLabel = QtGui.QLabel(self.DefaultsPage) + self.updateLabel.setGeometry(QtCore.QRect(60, 220, 351, 17)) + self.updateLabel.setObjectName(u'updateLabel') FirstTimeWizard.addPage(self.DefaultsPage) self.retranslateUi(FirstTimeWizard) - QtCore.QMetaObject.connectSlotsByName(OpenLP.FirstTimeWizard) + QtCore.QMetaObject.connectSlotsByName(FirstTimeWizard) def retranslateUi(self, FirstTimeWizard): FirstTimeWizard.setWindowTitle(translate( @@ -220,5 +223,5 @@ class Ui_FirstTimeWizard(object): 'Default output display')) self.themeSelectionLabel.setText(translate('OpenLP.FirstTimeWizard', 'Select the default Theme')) - self.label.setText(translate('OpenLP.FirstTimeWizard', + self.messageLabel.setText(translate('OpenLP.FirstTimeWizard', 'Press Finish to apply all you changes and start OpenLP')) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 7a67331ad..d7d6a89f9 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -461,7 +461,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): actionList = ActionList() - def __init__(self, screens, applicationVersion, clipboard): + def __init__(self, screens, applicationVersion, clipboard, firstTime): """ This constructor sets up the interface, the various managers, and the plugins. @@ -626,6 +626,9 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.MediaToolBox.setCurrentIndex(savedPlugin) self.settingsForm.postSetUp() Receiver.send_message(u'cursor_normal') + # Import themes if first time +# if firstTime: +# self.themeManagerContents.firstTime() def setAutoLanguage(self, value): self.LanguageGroup.setDisabled(value) diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 0e04d7b46..407d0cfa8 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -145,6 +145,20 @@ class ThemeManager(QtGui.QWidget): # Last little bits of setting up self.configUpdated() + def firstTime(self): + """ + Import new themes downloaded by the first time wizard + """ + Receiver.send_message(u'cursor_busy') + encoding = get_filesystem_encoding() + files = SettingsManager.get_files(self.settingsSection, u'.otz') + for file in files: + file = os.path.join(self.path, file).encode(encoding) + self.unzipTheme(file, self.path) + delete_file(file) + self.loadThemes() + Receiver.send_message(u'cursor_normal') + def configUpdated(self, firstTime=False): """ Triggered when Config dialog is updated. @@ -370,6 +384,7 @@ class ThemeManager(QtGui.QWidget): 'Save Theme - (%s)')) % theme, SettingsManager.get_last_dir(self.settingsSection, 1)) path = unicode(path) + Receiver.send_message(u'cursor_busy') if path: SettingsManager.set_last_dir(self.settingsSection, path, 1) themePath = os.path.join(path, theme + u'.otz') @@ -395,6 +410,7 @@ class ThemeManager(QtGui.QWidget): finally: if zip: zip.close() + Receiver.send_message(u'cursor_normal') def onImportTheme(self): """ @@ -408,12 +424,14 @@ class ThemeManager(QtGui.QWidget): unicode(translate('OpenLP.ThemeManager', 'OpenLP Themes (*.theme *.otz)'))) log.info(u'New Themes %s', unicode(files)) + Receiver.send_message(u'cursor_busy') if files: for file in files: SettingsManager.set_last_dir( self.settingsSection, unicode(file)) self.unzipTheme(file, self.path) self.loadThemes() + Receiver.send_message(u'cursor_normal') def loadThemes(self): """ From 1e0ca83729d78355c3f86c88dc56d5f36246f232 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 5 Mar 2011 14:17:32 +0000 Subject: [PATCH 25/90] Open up again --- openlp.pyw | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index 76c263ea5..ee5d9691a 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -172,8 +172,8 @@ class OpenLP(QtGui.QApplication): # First time checks in settings firstTime = QtCore.QSettings().value( u'general/first time', QtCore.QVariant(True)).toBool() -# if firstTime: -# FirstTimeForm(screens).exec_() + if firstTime: + FirstTimeForm(screens).exec_() if os.name == u'nt': self.setStyleSheet(application_stylesheet) show_splash = QtCore.QSettings().value( From 632c1f8ade6a577defc8f7a2e8a950dcf8f5cdb0 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 5 Mar 2011 19:38:33 +0100 Subject: [PATCH 26/90] display 'Show Desktop' even with one screen --- openlp/core/ui/maindisplay.py | 11 ++++++----- openlp/core/ui/slidecontroller.py | 33 +++++++++++++------------------ 2 files changed, 20 insertions(+), 24 deletions(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 5fd361268..47321eedf 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -319,7 +319,7 @@ class MainDisplay(DisplayWidget): Changes the volume of a running video """ log.debug(u'videoVolume %d' % volume) - vol = float(volume)/float(10) + vol = float(volume) / float(10) if self.phononActive: self.audio.setVolume(vol) else: @@ -335,7 +335,7 @@ class MainDisplay(DisplayWidget): # We are running a background theme self.override[u'theme'] = u'' self.override[u'video'] = True - vol = float(volume)/float(10) + vol = float(volume) / float(10) if isBackground or not self.usePhonon: js = u'show_video("init", "%s", %s, true); show_video("play");' % \ (videoPath.replace(u'\\', u'\\\\'), str(vol)) @@ -388,9 +388,10 @@ class MainDisplay(DisplayWidget): Receiver.send_message(u'openlp_process_events') # if was hidden keep it hidden if self.isLive: - self.setVisible(True) - if self.hideMode: - self.hideDisplay(self.hideMode) + if self.hideMode: + self.hideDisplay(self.hideMode) + else: + self.setVisible(True) preview = QtGui.QImage(self.screen[u'size'].width(), self.screen[u'size'].height(), QtGui.QImage.Format_ARGB32_Premultiplied) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 89d7ac162..0caa83e72 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -165,7 +165,6 @@ class SlideController(QtGui.QWidget): u':/slides/slide_desktop.png', False) self.desktopScreen.setText( translate('OpenLP.SlideController', 'Show Desktop')) - self.desktopScreen.setVisible(self.screens.display_count > 1) self.hideMenu.setDefaultAction(self.blankScreen) self.hideMenu.menu().addAction(self.blankScreen) self.hideMenu.menu().addAction(self.themeScreen) @@ -405,8 +404,6 @@ class SlideController(QtGui.QWidget): Settings dialog has changed the screen size of adjust output and screen previews. """ - if self.isLive: - self.desktopScreen.setVisible(self.screens.display_count > 1) # rebuild display as screen size changed self.display = MainDisplay(self, self.screens, self.isLive) self.display.imageManager = self.parent.renderManager.image_manager @@ -465,6 +462,9 @@ class SlideController(QtGui.QWidget): self.onSlideSelected() def receiveSpinDelay(self, value): + """ + Adjusts the value of the ``delaySpinBox`` to the given one. + """ self.delaySpinBox.setValue(int(value)) def enableToolBar(self, item): @@ -748,8 +748,7 @@ class SlideController(QtGui.QWidget): self.hideMenu.setDefaultAction(self.blankScreen) self.blankScreen.setChecked(checked) self.themeScreen.setChecked(False) - if self.screens.display_count > 1: - self.desktopScreen.setChecked(False) + self.desktopScreen.setChecked(False) if checked: Receiver.send_message(u'maindisplay_hide', HideMode.Blank) QtCore.QSettings().setValue( @@ -770,8 +769,7 @@ class SlideController(QtGui.QWidget): self.hideMenu.setDefaultAction(self.themeScreen) self.blankScreen.setChecked(False) self.themeScreen.setChecked(checked) - if self.screens.display_count > 1: - self.desktopScreen.setChecked(False) + self.desktopScreen.setChecked(False) if checked: Receiver.send_message(u'maindisplay_hide', HideMode.Theme) QtCore.QSettings().setValue( @@ -792,9 +790,6 @@ class SlideController(QtGui.QWidget): self.hideMenu.setDefaultAction(self.desktopScreen) self.blankScreen.setChecked(False) self.themeScreen.setChecked(False) - # On valid if more than 1 display - if self.screens.display_count <= 1: - return self.desktopScreen.setChecked(checked) if checked: Receiver.send_message(u'maindisplay_hide', HideMode.Screen) @@ -1099,15 +1094,15 @@ class SlideController(QtGui.QWidget): Used by command items which provide their own displays to reset the screen hide attributes """ + blank = None if self.blankScreen.isChecked: - self.blankScreen.setChecked(False) - self.hideMenu.setDefaultAction(self.blankScreen) + blank = self.blankScreen + if self.themeScreen.isChecked: + blank = self.themeScreen + if self.desktopScreen.isChecked: + blank = self.desktopScreen + if blank: + blank.setChecked(False) + self.hideMenu.setDefaultAction(blank) QtCore.QSettings().remove( self.parent.generalSettingsSection + u'/screen blank') - if self.themeScreen.isChecked: - self.themeScreen.setChecked(False) - self.hideMenu.setDefaultAction(self.themeScreen) - if self.screens.display_count > 1: - if self.desktopScreen.isChecked: - self.desktopScreen.setChecked(False) - self.hideMenu.setDefaultAction(self.desktopScreen) From 892430f90c13a1a3739c05df67a7d44a6251749b Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 6 Mar 2011 07:51:24 +0000 Subject: [PATCH 27/90] cleanup --- openlp.pyw | 4 ---- 1 file changed, 4 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index 7cc4d6d15..920908b61 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -149,10 +149,6 @@ class OpenLP(QtGui.QApplication): log.info(u'Openlp version %s' % app_version[u'version']) return app_version -# def notify(self, obj, evt): -# #TODO needed for presentation exceptions -# return QtGui.QApplication.notify(self, obj, evt) - def run(self): """ Run the OpenLP application. From 094e7968d0f1a6c14a2f5621a9c645feca706850 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 6 Mar 2011 07:59:26 +0000 Subject: [PATCH 28/90] Fix not flagging of service item changes --- openlp/core/ui/servicemanager.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index f5a08d8b2..3cdf25c7a 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -943,6 +943,7 @@ class ServiceManager(QtGui.QWidget): for item in self.serviceItems: if item[u'service_item']._uuid == uuid: item[u'service_item'].edit_id = editId + self.setModified(True) def replaceServiceItem(self, newItem): """ @@ -1123,13 +1124,14 @@ class ServiceManager(QtGui.QWidget): self.serviceItems.remove(serviceItem) self.serviceItems.insert(endpos, serviceItem) self.repaintServiceList(endpos, child) + self.setModified(True) else: # we are not over anything so drop replace = False if item is None: self.dropPosition = len(self.serviceItems) else: - # we are over somthing so lets investigate + # we are over something so lets investigate pos = self._getParentItemData(item) - 1 serviceItem = self.serviceItems[pos] if (plugin == serviceItem[u'service_item'].name and From cf0a970184ff9988b557e62cdf41aab02cc7d821 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 6 Mar 2011 13:44:35 +0000 Subject: [PATCH 29/90] Tidy ups --- openlp.pyw | 11 ++++---- openlp/core/ui/firsttimeform.py | 47 +++++++++++++++++++++++++++------ openlp/core/ui/mainwindow.py | 4 +-- 3 files changed, 47 insertions(+), 15 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index ee5d9691a..39719a80e 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -273,11 +273,12 @@ def main(): # Define the settings environment QtCore.QSettings(u'OpenLP', u'OpenLP') # First time checks in settings -# if QtCore.QSettings().value( -# u'general/first time', QtCore.QVariant(True)).toBool(): -# if not FirstTimeLanguageForm().exec_(): -# # if cancel then stop processing -# sys.exit() + # Use explicit reference as not inside a QT environment yet + if QtCore.QSettings(u'OpenLP', u'OpenLP').value( + u'general/first time', QtCore.QVariant(True)).toBool(): + if not FirstTimeLanguageForm().exec_(): + # if cancel then stop processing + sys.exit() if sys.platform == u'darwin': OpenLP.addLibraryPath(QtGui.QApplication.applicationDirPath() + "/qt4_plugins") diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index df21b93d5..cd3a1754e 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -34,7 +34,8 @@ from PyQt4 import QtCore, QtGui from firsttimewizard import Ui_FirstTimeWizard -from openlp.core.lib import translate, PluginStatus, check_directory_exists, Receiver +from openlp.core.lib import translate, PluginStatus, check_directory_exists, \ + Receiver from openlp.core.utils import get_web_page, AppLocation log = logging.getLogger(__name__) @@ -91,7 +92,8 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): self.__loadChild(treewidgetitem, u'songs', u'languages', u'songs') treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) treewidgetitem.setText(0, self.biblesText) - self.__loadChild(treewidgetitem, u'bibles', u'translations', u'bible') + self.__loadChild(treewidgetitem, u'bibles', u'translations', + u'bible') treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) treewidgetitem.setText(0, self.themesText) self.__loadChild(treewidgetitem, u'themes', u'files', 'theme') @@ -127,11 +129,13 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): if parent and listIterator.value().checkState(0) \ == QtCore.Qt.Checked: if unicode(parent.text(0)) == self.themesText: - self.themeSelectionComboBox.addItem(listIterator.value().text(0)) + self.themeSelectionComboBox.addItem( + listIterator.value().text(0)) listIterator += 1 def accept(self): self.__updateMessage(self.startUpdates) + # Set up the Plugin status's self.__pluginStatus(self.songsCheckBox, u'songs/status') self.__pluginStatus(self.bibleCheckBox, u'bibles/status') self.__pluginStatus(self.presentationCheckBox, u'presentations/status') @@ -141,34 +145,58 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): self.__pluginStatus(self.customCheckBox, u'custom/status') self.__pluginStatus(self.songUsageCheckBox, u'songusage/status') self.__pluginStatus(self.alertCheckBox, u'alerts/status') - - listIterator = QtGui.QTreeWidgetItemIterator(self.selectionTreeWidget) + # Build directories for downloads songsDestination = AppLocation.get_section_data_path(u'songs') check_directory_exists(songsDestination) bibleDestination = AppLocation.get_section_data_path(u'bibles') check_directory_exists(bibleDestination) themeDestination = AppLocation.get_section_data_path(u'themes') check_directory_exists(themeDestination) + # Install Selected Items looping through them + listIterator = QtGui.QTreeWidgetItemIterator(self.selectionTreeWidget) while listIterator.value(): type = listIterator.value().parent() if listIterator.value().parent(): if listIterator.value().checkState(0) == QtCore.Qt.Checked: - # Install + # Install items as theu have been selected + item = unicode(listIterator.value().text(0)) + # Download Song database if selected + if unicode(type.text(0)) == self.songsText: + songs = unicode(listIterator.value().data(0, + QtCore.Qt.UserRole).toString()) + message = u'%s %s' % (self.downloadSongs, item) + self.__updateMessage(message) + # Song database is a fixed file name + urllib.urlretrieve(u'%s%s' % (self.web, songs), + os.path.join(songsDestination, u'songs.sqlite')) + # Download and selected Bibles if unicode(type.text(0)) == self.biblesText: bible = unicode(listIterator.value().data(0, QtCore.Qt.UserRole).toString()) - message = u'%s %s' % (self.downloadBible, bible) + message = u'%s %s' % (self.downloadBible, item) self.__updateMessage(message) urllib.urlretrieve(u'%s%s' % (self.web, bible), os.path.join(bibleDestination, bible)) + # Download any themes if unicode(type.text(0)) == self.themesText: theme = unicode(listIterator.value().data(0, QtCore.Qt.UserRole).toString()) - message = u'%s %s' % (self.downloadTheme, bible) + message = u'%s %s' % (self.downloadTheme, item) self.__updateMessage(message) urllib.urlretrieve(u'%s%s' % (self.web, theme), os.path.join(themeDestination, theme)) listIterator += 1 + # Set Default Display + if self.displaySelectionComboBox.currentIndex() != -1: + QtCore.QSettings().setValue(u'General/monitor', + QtCore.QVariant(self.displaySelectionComboBox. + currentIndex())) + # Set Global Theme + if self.themeSelectionComboBox.currentIndex() != -1: + QtCore.QSettings().setValue(u'themes/global theme', + QtCore.QVariant(self.themeSelectionComboBox.currentText())) + QtCore.QSettings().setValue(u'general/first time', + QtCore.QVariant(False)) return QtGui.QWizard.accept(self) def __pluginStatus(self, field, tag): @@ -177,5 +205,8 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): QtCore.QSettings().setValue(tag, QtCore.QVariant(status)) def __updateMessage(self, text): + """ + Keep screen up to date + """ self.updateLabel.setText(text) Receiver.send_message(u'openlp_process_events') diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index bd5e45193..229394247 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -627,8 +627,8 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.settingsForm.postSetUp() Receiver.send_message(u'cursor_normal') # Import themes if first time -# if firstTime: -# self.themeManagerContents.firstTime() + if firstTime: + self.themeManagerContents.firstTime() def setAutoLanguage(self, value): self.LanguageGroup.setDisabled(value) From ff61f14bdebd081f824b645f2f1602d00e65b35c Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 6 Mar 2011 14:15:35 +0000 Subject: [PATCH 30/90] Fix Language setting for first time --- openlp/core/ui/mainwindow.py | 2 ++ openlp/core/utils/languagemanager.py | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 229394247..bec6d03e4 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -629,6 +629,8 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): # Import themes if first time if firstTime: self.themeManagerContents.firstTime() + self.themeManagerContents.firstTime() + def setAutoLanguage(self, value): self.LanguageGroup.setDisabled(value) diff --git a/openlp/core/utils/languagemanager.py b/openlp/core/utils/languagemanager.py index ebc9b4575..9cadf06e2 100644 --- a/openlp/core/utils/languagemanager.py +++ b/openlp/core/utils/languagemanager.py @@ -89,7 +89,8 @@ class LanguageManager(object): """ Retrieve a saved language to use from settings """ - language = unicode(QtCore.QSettings().value( + settings = QtCore.QSettings(u'OpenLP', u'OpenLP') + language = unicode(settings.value( u'general/language', QtCore.QVariant(u'[en]')).toString()) log.info(u'Language file: \'%s\' Loaded from conf file' % language) reg_ex = QtCore.QRegExp("^\[(.*)\]") From 3b465ed22fb51845e4ce78d7060fa2ee8b1d758f Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 6 Mar 2011 16:29:25 +0100 Subject: [PATCH 31/90] fixed images being displayed for a short time, even when the desktop was hidden --- openlp/core/ui/maindisplay.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 47321eedf..f8bd99b81 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -233,9 +233,6 @@ class MainDisplay(DisplayWidget): image = self.imageManager.get_image_bytes(name) self.resetVideo() self.displayImage(image) - # show screen - if self.isLive: - self.setVisible(True) return self.preview() def displayImage(self, image): @@ -388,9 +385,9 @@ class MainDisplay(DisplayWidget): Receiver.send_message(u'openlp_process_events') # if was hidden keep it hidden if self.isLive: - if self.hideMode: - self.hideDisplay(self.hideMode) - else: + if self.hideMode: + self.hideDisplay(self.hideMode) + else: self.setVisible(True) preview = QtGui.QImage(self.screen[u'size'].width(), self.screen[u'size'].height(), From 6ef78ef39d1a76c6e41a7fefece1ed4a32770c1c Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 6 Mar 2011 16:28:26 +0000 Subject: [PATCH 32/90] Fix song import duplication by removing training space on the search title. Fixed up all locations field was made and the reindex code. Only tested with reindex! Fixes: https://launchpad.net/bugs/712252 --- openlp/plugins/songs/forms/editsongform.py | 2 +- openlp/plugins/songs/lib/foilpresenterimport.py | 2 +- openlp/plugins/songs/lib/olpimport.py | 2 +- openlp/plugins/songs/lib/songimport.py | 1 + openlp/plugins/songs/lib/xml.py | 2 +- openlp/plugins/songs/songsplugin.py | 2 +- 6 files changed, 6 insertions(+), 5 deletions(-) diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 0e874c3d5..0d9121c45 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -810,4 +810,4 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): # This method must only be run after the self.song = Song() assignment. log.debug(u'processTitle') self.song.search_title = re.sub(r'[\'"`,;:(){}?]+', u'', - unicode(self.song.search_title)).lower() + unicode(self.song.search_title)).lower().strip() diff --git a/openlp/plugins/songs/lib/foilpresenterimport.py b/openlp/plugins/songs/lib/foilpresenterimport.py index 0d81e6f41..a26d1c05a 100644 --- a/openlp/plugins/songs/lib/foilpresenterimport.py +++ b/openlp/plugins/songs/lib/foilpresenterimport.py @@ -540,7 +540,7 @@ class FoilPresenter(object): song.alternate_title = self._child(titelstring) song.search_title += u'@' + song.alternate_title song.search_title = re.sub(r'[\'"`,;:(){}?]+', u'', - unicode(song.search_title)).lower() + unicode(song.search_title)).lower().strip() def _process_topics(self, foilpresenterfolie, song): """ diff --git a/openlp/plugins/songs/lib/olpimport.py b/openlp/plugins/songs/lib/olpimport.py index fe010b501..11170f9a0 100644 --- a/openlp/plugins/songs/lib/olpimport.py +++ b/openlp/plugins/songs/lib/olpimport.py @@ -167,7 +167,7 @@ class OpenLPSongImport(SongImport): new_song.alternate_title = old_titles[1] else: new_song.alternate_title = u'' - new_song.search_title = song.search_title + new_song.search_title = song.search_title.strip() new_song.song_number = song.song_number new_song.lyrics = song.lyrics new_song.search_lyrics = song.search_lyrics diff --git a/openlp/plugins/songs/lib/songimport.py b/openlp/plugins/songs/lib/songimport.py index 5bfba9b77..fc78b5033 100644 --- a/openlp/plugins/songs/lib/songimport.py +++ b/openlp/plugins/songs/lib/songimport.py @@ -276,6 +276,7 @@ class SongImport(QtCore.QObject): song.alternate_title = self.alternate_title song.search_title = self.remove_punctuation(self.title).lower() \ + '@' + self.remove_punctuation(self.alternate_title).lower() + song.search_title = song.search_title.strip() song.song_number = self.song_number song.search_lyrics = u'' verses_changed_to_other = {} diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py index a2a73ec97..bd22ea4b2 100644 --- a/openlp/plugins/songs/lib/xml.py +++ b/openlp/plugins/songs/lib/xml.py @@ -536,7 +536,7 @@ class OpenLyrics(object): song.alternate_title = self._text(title) song.search_title += u'@' + song.alternate_title song.search_title = re.sub(r'[\'"`,;:(){}?]+', u'', - unicode(song.search_title)).lower() + unicode(song.search_title)).lower().strip() def _process_topics(self, properties, song): """ diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index 0335b3a6e..bfd5c4eea 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -154,7 +154,7 @@ class SongsPlugin(Plugin): if song.alternate_title is None: song.alternate_title = u'' song.search_title = self.whitespace.sub(u' ', song.title.lower() + - u' ' + song.alternate_title.lower()) + u' ' + song.alternate_title.lower()).strip() # Remove the "language" attribute from lyrics tag. This is not very # important, but this keeps the database clean. This can be removed # when everybody has run the reindex tool once. From 47b72badda6700bf0411cac045d336b264874ad3 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 6 Mar 2011 19:25:35 +0000 Subject: [PATCH 33/90] Merge fixes --- openlp/core/ui/firsttimeform.py | 46 ++++++++++++++++----------------- openlp/core/ui/mainwindow.py | 1 - 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index cd3a1754e..3e7993c80 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -38,7 +38,7 @@ from openlp.core.lib import translate, PluginStatus, check_directory_exists, \ Receiver from openlp.core.utils import get_web_page, AppLocation -log = logging.getLogger(__name__) +log = logging.getLogger(_name_) class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): """ @@ -47,7 +47,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): """ log.info(u'ThemeWizardForm loaded') - def __init__(self, screens, parent=None): + def _init_(self, screens, parent=None): # check to see if we have web access self.web = u'http://openlp.org/files/frw/' self.config = ConfigParser.ConfigParser() @@ -55,7 +55,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): if self.webAccess: files = self.webAccess.read() self.config.readfp(io.BytesIO(files)) - QtGui.QWizard.__init__(self, parent) + QtGui.QWizard._init_(self, parent) self.setupUi(self) for screen in screens.get_screen_list(): self.displaySelectionComboBox.addItem(screen) @@ -65,7 +65,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): self.startUpdates = translate('OpenLP.FirstTimeWizard', 'Starting Updates') self.downloadSongs = unicode(translate('OpenLP.FirstTimeWizard', - 'Downloading Songs.')) + 'Downloading songs')) self.downloadBible = unicode(translate('OpenLP.FirstTimeWizard', 'Downloading bible')) self.downloadTheme = unicode(translate('OpenLP.FirstTimeWizard', @@ -89,19 +89,19 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): self.noInternetLabel.setVisible(False) treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) treewidgetitem.setText(0, self.songsText) - self.__loadChild(treewidgetitem, u'songs', u'languages', u'songs') + self._loadChild(treewidgetitem, u'songs', u'languages', u'songs') treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) treewidgetitem.setText(0, self.biblesText) - self.__loadChild(treewidgetitem, u'bibles', u'translations', + self._loadChild(treewidgetitem, u'bibles', u'translations', u'bible') treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) treewidgetitem.setText(0, self.themesText) - self.__loadChild(treewidgetitem, u'themes', u'files', 'theme') + self._loadChild(treewidgetitem, u'themes', u'files', 'theme') else: self.internetGroupBox.setVisible(False) self.noInternetLabel.setVisible(True) - def __loadChild(self, tree, list, tag, root): + def _loadChild(self, tree, list, tag, root): files = self.config.get(list, tag) files = files.split(u',') for file in files: @@ -134,17 +134,17 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): listIterator += 1 def accept(self): - self.__updateMessage(self.startUpdates) + self._updateMessage(self.startUpdates) # Set up the Plugin status's - self.__pluginStatus(self.songsCheckBox, u'songs/status') - self.__pluginStatus(self.bibleCheckBox, u'bibles/status') - self.__pluginStatus(self.presentationCheckBox, u'presentations/status') - self.__pluginStatus(self.imageCheckBox, u'images/status') - self.__pluginStatus(self.mediaCheckBox, u'media/status') - self.__pluginStatus(self.remoteCheckBox, u'remotes/status') - self.__pluginStatus(self.customCheckBox, u'custom/status') - self.__pluginStatus(self.songUsageCheckBox, u'songusage/status') - self.__pluginStatus(self.alertCheckBox, u'alerts/status') + self._pluginStatus(self.songsCheckBox, u'songs/status') + self._pluginStatus(self.bibleCheckBox, u'bibles/status') + self._pluginStatus(self.presentationCheckBox, u'presentations/status') + self._pluginStatus(self.imageCheckBox, u'images/status') + self._pluginStatus(self.mediaCheckBox, u'media/status') + self._pluginStatus(self.remoteCheckBox, u'remotes/status') + self._pluginStatus(self.customCheckBox, u'custom/status') + self._pluginStatus(self.songUsageCheckBox, u'songusage/status') + self._pluginStatus(self.alertCheckBox, u'alerts/status') # Build directories for downloads songsDestination = AppLocation.get_section_data_path(u'songs') check_directory_exists(songsDestination) @@ -165,7 +165,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): songs = unicode(listIterator.value().data(0, QtCore.Qt.UserRole).toString()) message = u'%s %s' % (self.downloadSongs, item) - self.__updateMessage(message) + self._updateMessage(message) # Song database is a fixed file name urllib.urlretrieve(u'%s%s' % (self.web, songs), os.path.join(songsDestination, u'songs.sqlite')) @@ -174,7 +174,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): bible = unicode(listIterator.value().data(0, QtCore.Qt.UserRole).toString()) message = u'%s %s' % (self.downloadBible, item) - self.__updateMessage(message) + self._updateMessage(message) urllib.urlretrieve(u'%s%s' % (self.web, bible), os.path.join(bibleDestination, bible)) # Download any themes @@ -182,7 +182,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): theme = unicode(listIterator.value().data(0, QtCore.Qt.UserRole).toString()) message = u'%s %s' % (self.downloadTheme, item) - self.__updateMessage(message) + self._updateMessage(message) urllib.urlretrieve(u'%s%s' % (self.web, theme), os.path.join(themeDestination, theme)) listIterator += 1 @@ -199,12 +199,12 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): QtCore.QVariant(False)) return QtGui.QWizard.accept(self) - def __pluginStatus(self, field, tag): + def _pluginStatus(self, field, tag): status = PluginStatus.Active if field.checkState() \ == QtCore.Qt.Checked else PluginStatus.Inactive QtCore.QSettings().setValue(tag, QtCore.QVariant(status)) - def __updateMessage(self, text): + def _updateMessage(self, text): """ Keep screen up to date """ diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index bec6d03e4..bb35936d5 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -629,7 +629,6 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): # Import themes if first time if firstTime: self.themeManagerContents.firstTime() - self.themeManagerContents.firstTime() def setAutoLanguage(self, value): From 3b9adbb1db343b5d3f99d50d70d96fa2923434e8 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 6 Mar 2011 19:44:33 +0000 Subject: [PATCH 34/90] Merge fixes 2 --- openlp/core/ui/firsttimeform.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index 3e7993c80..7da2ff0b3 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -38,7 +38,7 @@ from openlp.core.lib import translate, PluginStatus, check_directory_exists, \ Receiver from openlp.core.utils import get_web_page, AppLocation -log = logging.getLogger(_name_) +log = logging.getLogger(__name__) class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): """ @@ -47,7 +47,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): """ log.info(u'ThemeWizardForm loaded') - def _init_(self, screens, parent=None): + def __init__(self, screens, parent=None): # check to see if we have web access self.web = u'http://openlp.org/files/frw/' self.config = ConfigParser.ConfigParser() @@ -55,7 +55,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): if self.webAccess: files = self.webAccess.read() self.config.readfp(io.BytesIO(files)) - QtGui.QWizard._init_(self, parent) + QtGui.QWizard.__init__(self, parent) self.setupUi(self) for screen in screens.get_screen_list(): self.displaySelectionComboBox.addItem(screen) @@ -65,11 +65,11 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): self.startUpdates = translate('OpenLP.FirstTimeWizard', 'Starting Updates') self.downloadSongs = unicode(translate('OpenLP.FirstTimeWizard', - 'Downloading songs')) + 'Downloading songs: %s')) self.downloadBible = unicode(translate('OpenLP.FirstTimeWizard', - 'Downloading bible')) + 'Downloading bible: %s')) self.downloadTheme = unicode(translate('OpenLP.FirstTimeWizard', - 'Downloading theme')) + 'Downloading theme: %s')) def exec_(self, edit=False): """ @@ -164,7 +164,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): if unicode(type.text(0)) == self.songsText: songs = unicode(listIterator.value().data(0, QtCore.Qt.UserRole).toString()) - message = u'%s %s' % (self.downloadSongs, item) + message = self.downloadSongs % item self._updateMessage(message) # Song database is a fixed file name urllib.urlretrieve(u'%s%s' % (self.web, songs), @@ -173,7 +173,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): if unicode(type.text(0)) == self.biblesText: bible = unicode(listIterator.value().data(0, QtCore.Qt.UserRole).toString()) - message = u'%s %s' % (self.downloadBible, item) + message = self.downloadBible % item self._updateMessage(message) urllib.urlretrieve(u'%s%s' % (self.web, bible), os.path.join(bibleDestination, bible)) @@ -181,7 +181,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): if unicode(type.text(0)) == self.themesText: theme = unicode(listIterator.value().data(0, QtCore.Qt.UserRole).toString()) - message = u'%s %s' % (self.downloadTheme, item) + message = self.downloadTheme % item self._updateMessage(message) urllib.urlretrieve(u'%s%s' % (self.web, theme), os.path.join(themeDestination, theme)) From f1f6c6bd3e22c41d96034aa619184c86fbdd7d54 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 6 Mar 2011 20:09:03 +0000 Subject: [PATCH 35/90] Merge fixes 3 --- openlp/core/ui/firsttimeform.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index 7da2ff0b3..e1dd31778 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -64,12 +64,8 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): self.themesText = translate('OpenLP.FirstTimeWizard', 'Themes') self.startUpdates = translate('OpenLP.FirstTimeWizard', 'Starting Updates') - self.downloadSongs = unicode(translate('OpenLP.FirstTimeWizard', - 'Downloading songs: %s')) - self.downloadBible = unicode(translate('OpenLP.FirstTimeWizard', - 'Downloading bible: %s')) - self.downloadTheme = unicode(translate('OpenLP.FirstTimeWizard', - 'Downloading theme: %s')) + self.downloading = unicode(translate('OpenLP.FirstTimeWizard', + 'Downloading %s')) def exec_(self, edit=False): """ @@ -164,7 +160,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): if unicode(type.text(0)) == self.songsText: songs = unicode(listIterator.value().data(0, QtCore.Qt.UserRole).toString()) - message = self.downloadSongs % item + message = self.downloading % item self._updateMessage(message) # Song database is a fixed file name urllib.urlretrieve(u'%s%s' % (self.web, songs), @@ -173,7 +169,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): if unicode(type.text(0)) == self.biblesText: bible = unicode(listIterator.value().data(0, QtCore.Qt.UserRole).toString()) - message = self.downloadBible % item + message = self.downloading % item self._updateMessage(message) urllib.urlretrieve(u'%s%s' % (self.web, bible), os.path.join(bibleDestination, bible)) @@ -181,7 +177,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): if unicode(type.text(0)) == self.themesText: theme = unicode(listIterator.value().data(0, QtCore.Qt.UserRole).toString()) - message = self.downloadTheme % item + message = self.downloading % item self._updateMessage(message) urllib.urlretrieve(u'%s%s' % (self.web, theme), os.path.join(themeDestination, theme)) From faa0d2740a74e0885a0ad231ebdc8facf3dba821 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 7 Mar 2011 17:38:04 +0000 Subject: [PATCH 36/90] Stop song database overwrite --- openlp/core/ui/firsttimeform.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index e1dd31778..fb2a0a3fe 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -83,9 +83,13 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): if self.webAccess: self.internetGroupBox.setVisible(True) self.noInternetLabel.setVisible(False) - treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) - treewidgetitem.setText(0, self.songsText) - self._loadChild(treewidgetitem, u'songs', u'languages', u'songs') + # If songs database exists do not allow a copy + songs = os.path.join(AppLocation.get_section_data_path(u'songs'), + u'songs.sqlite') + if not os.path.exists(songs): + treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) + treewidgetitem.setText(0, self.songsText) + self._loadChild(treewidgetitem, u'songs', u'languages', u'songs') treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) treewidgetitem.setText(0, self.biblesText) self._loadChild(treewidgetitem, u'bibles', u'translations', From e535c4e04022d74d8951cbd79c07ea8d9b3d17e1 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 7 Mar 2011 19:04:40 +0100 Subject: [PATCH 37/90] fixed Bug #727710 Fixes: https://launchpad.net/bugs/727710 --- openlp/core/ui/maindisplay.py | 15 ++++++++++----- openlp/core/ui/slidecontroller.py | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index f8bd99b81..4a12ca05e 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -245,7 +245,8 @@ class MainDisplay(DisplayWidget): js = u'show_image("");' self.frame.evaluateJavaScript(js) # Update the preview frame. - Receiver.send_message(u'maindisplay_active') + if self.isLive: + Receiver.send_message(u'maindisplay_active') def resetImage(self): """ @@ -259,7 +260,8 @@ class MainDisplay(DisplayWidget): self.displayImage(None) self.override = {} # Update the preview frame. - Receiver.send_message(u'maindisplay_active') + if self.isLive: + Receiver.send_message(u'maindisplay_active') def resetVideo(self): """ @@ -276,7 +278,8 @@ class MainDisplay(DisplayWidget): self.frame.evaluateJavaScript(u'show_video("close");') self.override = {} # Update the preview frame. - Receiver.send_message(u'maindisplay_active') + if self.isLive: + Receiver.send_message(u'maindisplay_active') def videoPlay(self): """ @@ -347,7 +350,8 @@ class MainDisplay(DisplayWidget): self.videoWidget.setVisible(True) self.audio.setVolume(vol) # Update the preview frame. - Receiver.send_message(u'maindisplay_active') + if self.isLive: + Receiver.send_message(u'maindisplay_active') return self.preview() def videoStart(self, newState, oldState): @@ -481,7 +485,8 @@ class MainDisplay(DisplayWidget): self.videoPlay() self.hideMode = None # Trigger actions when display is active again - Receiver.send_message(u'maindisplay_active') + if self.isLive: + Receiver.send_message(u'maindisplay_active') def __hideMouse(self): # Hide mouse cursor when moved over display if enabled in settings diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 0caa83e72..c81b987b4 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -162,7 +162,7 @@ class SlideController(QtGui.QWidget): self.themeScreen.setText( translate('OpenLP.SlideController', 'Blank to Theme')) self.desktopScreen = icon_action(self.hideMenu, u'Desktop Screen', - u':/slides/slide_desktop.png', False) + u':/slides/slide_desktop.png', False) self.desktopScreen.setText( translate('OpenLP.SlideController', 'Show Desktop')) self.hideMenu.setDefaultAction(self.blankScreen) From 15eb939d76f6f7e80582ee9fa45eb62f7e39a86d Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 7 Mar 2011 18:07:13 +0000 Subject: [PATCH 38/90] Fix English --- openlp/core/ui/firsttimewizard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/ui/firsttimewizard.py b/openlp/core/ui/firsttimewizard.py index 081ac9991..491246a6c 100644 --- a/openlp/core/ui/firsttimewizard.py +++ b/openlp/core/ui/firsttimewizard.py @@ -224,4 +224,4 @@ class Ui_FirstTimeWizard(object): self.themeSelectionLabel.setText(translate('OpenLP.FirstTimeWizard', 'Select the default Theme')) self.messageLabel.setText(translate('OpenLP.FirstTimeWizard', - 'Press Finish to apply all you changes and start OpenLP')) + 'Press Finish to apply all your changes and start OpenLP')) From 3eb8ca476b392265dfe9a14f4356c565002a6a57 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 7 Mar 2011 19:16:56 +0000 Subject: [PATCH 39/90] english --- openlp/core/ui/firsttimewizard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/ui/firsttimewizard.py b/openlp/core/ui/firsttimewizard.py index 491246a6c..ee14b6b0e 100644 --- a/openlp/core/ui/firsttimewizard.py +++ b/openlp/core/ui/firsttimewizard.py @@ -224,4 +224,4 @@ class Ui_FirstTimeWizard(object): self.themeSelectionLabel.setText(translate('OpenLP.FirstTimeWizard', 'Select the default Theme')) self.messageLabel.setText(translate('OpenLP.FirstTimeWizard', - 'Press Finish to apply all your changes and start OpenLP')) + 'Press finish to apply all your changes and start OpenLP')) From c3c4e855906492e14678ba8edbc99477f35df946 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 7 Mar 2011 19:58:51 +0000 Subject: [PATCH 40/90] Fixes --- openlp/core/ui/firsttimeform.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index fb2a0a3fe..e658f38d3 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -66,6 +66,9 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): 'Starting Updates') self.downloading = unicode(translate('OpenLP.FirstTimeWizard', 'Downloading %s')) + QtCore.QObject.connect(self, + QtCore.SIGNAL(u'currentIdChanged(int)'), + self.onCurrentIdChanged) def exec_(self, edit=False): """ @@ -116,12 +119,11 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): child.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) - def initializePage(self, id): + def onCurrentIdChanged(self, pageId): """ - Set up the pages for Initial run through dialog + Detects Page changes and updates as approprate. """ - wizardPage = self.page(id) - if wizardPage == self.DefaultsPage: + if self.page(pageId) == self.DefaultsPage: listIterator = QtGui.QTreeWidgetItemIterator( self.selectionTreeWidget) while listIterator.value(): @@ -134,6 +136,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): listIterator += 1 def accept(self): + Receiver.send_message(u'cursor_busy') self._updateMessage(self.startUpdates) # Set up the Plugin status's self._pluginStatus(self.songsCheckBox, u'songs/status') @@ -197,6 +200,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): QtCore.QVariant(self.themeSelectionComboBox.currentText())) QtCore.QSettings().setValue(u'general/first time', QtCore.QVariant(False)) + Receiver.send_message(u'cursor_normal') return QtGui.QWizard.accept(self) def _pluginStatus(self, field, tag): From ef00fcdc0b774b0bfa592ef2912e8996374ec06d Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Mon, 7 Mar 2011 23:12:31 +0000 Subject: [PATCH 41/90] Fix ooo file open for windows --- openlp/plugins/songs/lib/oooimport.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openlp/plugins/songs/lib/oooimport.py b/openlp/plugins/songs/lib/oooimport.py index 22e36b716..4fb6b5876 100644 --- a/openlp/plugins/songs/lib/oooimport.py +++ b/openlp/plugins/songs/lib/oooimport.py @@ -135,8 +135,9 @@ class OooImport(SongImport): Open the passed file in OpenOffice.org Impress """ if os.name == u'nt': - url = u'file:///' + filepath.replace(u'\\', u'/') + url = filepath.replace(u'\\', u'/') url = url.replace(u':', u'|').replace(u' ', u'%20') + url = u'file:///' + url else: url = uno.systemPathToFileUrl(filepath) properties = [] From 80f4c67daad5febbf929d6831a6a55e7485f19f2 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Tue, 8 Mar 2011 08:52:01 +0200 Subject: [PATCH 42/90] Added an initial Gentoo ebuild file. --- resources/gentoo/openlp-1.9.4.ebuild | 30 ++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 resources/gentoo/openlp-1.9.4.ebuild diff --git a/resources/gentoo/openlp-1.9.4.ebuild b/resources/gentoo/openlp-1.9.4.ebuild new file mode 100644 index 000000000..4e87a27b3 --- /dev/null +++ b/resources/gentoo/openlp-1.9.4.ebuild @@ -0,0 +1,30 @@ +# Copyright 1999-2009 Gentoo Foundation +# Copyright 2010 Jaak Ristioja +# Distributed under the terms of the GNU General Public License v2 +# $Header: $ + +EAPI=2 +RESTRICT_PYTHON_ABIS="3.*" +inherit python + +DESCRIPTION="Free church presentation software" +HOMEPAGE="http://openlp.org/" +SRC_URI="mirror://sourceforge/${PN}/${PV}/OpenLP-${PV}-src.tar.gz" + +LICENSE="GPL-2" +SLOT="0" +KEYWORDS="alpha amd64 arm hppa ia64 ppc ppc64 sparc x86 x86-fbsd x86-freebsd amd64-linux x86-linux x86-macos x86-solaris" + +RDEPEND=">=dev-lang/python-2.5.0 + dev-python/beautifulsoup + dev-python/chardet + dev-python/lxml + dev-python/pyenchant + dev-python/PyQt4[X,multimedia] + dev-python/sqlalchemy" +DEPEND="${RDEPEND}" + +PYTHON_DEPEND="2:2.5" +PYTHON_MODNAME="openlp" + +S=${WORKDIR}/OpenLP-${PV}-src From 562a88a9934f532c08d67a4c4070405c40f0626f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Tue, 8 Mar 2011 09:38:25 +0200 Subject: [PATCH 43/90] Fixes #730459 and 4 unreported bugs. --- openlp/core/lib/mediamanageritem.py | 6 +++--- openlp/core/ui/servicemanager.py | 32 ++++++++++++++--------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index e3bb4ae0f..ceaad2d46 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -349,11 +349,11 @@ class MediaManagerItem(QtGui.QWidget): Validates whether an image still exists and, if it does, is the thumbnail representation of the image up to date. """ - if not os.path.exists(image): + if not os.path.exists(unicode(image)): return False if os.path.exists(thumb): - imageDate = os.stat(image).st_mtime - thumbDate = os.stat(thumb).st_mtime + imageDate = os.stat(unicode(image)).st_mtime + thumbDate = os.stat(unicode(thumb)).st_mtime # If image has been updated rebuild icon if imageDate > thumbDate: self.iconFromFile(image, thumb) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 3cdf25c7a..555441f96 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -416,36 +416,37 @@ class ServiceManager(QtGui.QWidget): if not self.fileName(): return self.saveFileAs() else: - fileName = self.fileName() - log.debug(u'ServiceManager.saveFile - %s' % fileName) + path_file_name = unicode(self.fileName()) + (path, file_name) = os.path.split(path_file_name) + basename = file_name[0:file_name.rfind(u'.')-1] + file_name = basename + '.osz' + service_file_name = basename + '.osd' + log.debug(u'ServiceManager.saveFile - %s' % path_file_name) SettingsManager.set_last_dir(self.mainwindow.serviceSettingsSection, - split_filename(fileName)[0]) + path) service = [] - serviceFileName = fileName.replace(u'.osz', u'.osd') zip = None file = None try: write_list = [] - zip = zipfile.ZipFile(unicode(fileName), 'w') + zip = zipfile.ZipFile(path_file_name, 'w') for item in self.serviceItems: - service.append({u'serviceitem': \ + service.append({u'serviceitem': item[u'service_item'].get_service_repr()}) if item[u'service_item'].uses_file(): for frame in item[u'service_item'].get_frames(): if item[u'service_item'].is_image(): path_from = frame[u'path'] else: - path_from = unicode(os.path.join( - frame[u'path'], - frame[u'title'])) + path_from = os.path.join(frame[u'path'], + frame[u'title']) # On write a file once if not path_from in write_list: write_list.append(path_from) - zip.write(path_from.encode(u'utf-8')) - file = open(serviceFileName, u'wb') - cPickle.dump(service, file) - file.close() - zip.write(serviceFileName.encode(u'utf-8')) + zip.write(path_from, + path_from.encode(u'utf-8')) + zip.writestr(service_file_name.encode(u'utf-8'), + cPickle.dumps(service)) except IOError: log.exception(u'Failed to save service to disk') finally: @@ -453,8 +454,7 @@ class ServiceManager(QtGui.QWidget): file.close() if zip: zip.close() - delete_file(serviceFileName) - self.mainwindow.addRecentFile(fileName) + self.mainwindow.addRecentFile(path_file_name) self.setModified(False) return True From 216cc407c6372110b58e12130a6f9f7bdf28d044 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Tue, 8 Mar 2011 11:32:37 +0200 Subject: [PATCH 44/90] Now able to write >2GiB service files (haven't tested opening these),\n on IOError not-saved * asterisk will remain in place,\nbefore adding >50GiB files, user is asked first. --- openlp/core/ui/servicemanager.py | 58 +++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 13 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 555441f96..93d24a567 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -419,17 +419,15 @@ class ServiceManager(QtGui.QWidget): path_file_name = unicode(self.fileName()) (path, file_name) = os.path.split(path_file_name) basename = file_name[0:file_name.rfind(u'.')-1] - file_name = basename + '.osz' service_file_name = basename + '.osd' log.debug(u'ServiceManager.saveFile - %s' % path_file_name) SettingsManager.set_last_dir(self.mainwindow.serviceSettingsSection, path) service = [] zip = None - file = None try: write_list = [] - zip = zipfile.ZipFile(path_file_name, 'w') + total_size = 0 for item in self.serviceItems: service.append({u'serviceitem': item[u'service_item'].get_service_repr()}) @@ -440,20 +438,54 @@ class ServiceManager(QtGui.QWidget): else: path_from = os.path.join(frame[u'path'], frame[u'title']) - # On write a file once + # Only write a file once if not path_from in write_list: - write_list.append(path_from) - zip.write(path_from, - path_from.encode(u'utf-8')) + file_size = os.path.getsize(path_from) + size_limit = 52428800 # 50MiB + if file_size > size_limit: + # File exeeds size_limit bytes, ask user + message = unicode(self.trUtf8('Do you want' + ' to include \n%.1f MiB file "%s"\n' + 'into the service file?\n' + 'This may take some time.\n\n' + 'Please note that you need to\n' + 'take care of that file yourself.')) %\ + (file_size/1048576, + os.path.split(path_from)[1]) + ans = QtGui.QMessageBox.question(self, + self.trUtf8('Including Large File'), + message, + QtGui.QMessageBox.StandardButtons( + QtGui.QMessageBox.Ok|\ + QtGui.QMessageBox.Cancel), + QtGui.QMessageBox.Ok) + if ans == QtGui.QMessageBox.Ok: + write_list.append(path_from) + total_size += file_size + else: + write_list.append(path_from) + total_size += file_size + log.debug(u'ServiceManager.saveFile - ZIP contents size is %i' + ' bytes' % total_size) + service_content = cPickle.dumps(service) + # Usual Zip file cannot exceed 2GiB, file with Zip64 cannot be + # extracted using unzip in UNIX. + allow_zip_64 = (total_size > 2147483648 + len(service_content)) + log.debug(u'ServiceManager.saveFile - allowZip64 is %s' % + allow_zip_64) + zip = zipfile.ZipFile(path_file_name, 'w', zipfile.ZIP_STORED, + allow_zip_64) + # We first add service contents. + # We save ALL filenames into ZIP using UTF-8. zip.writestr(service_file_name.encode(u'utf-8'), - cPickle.dumps(service)) + service_content) + # Finally add all the listed media files. + for path_from in write_list: + zip.write(path_from, path_from.encode(u'utf-8')) + zip.close() except IOError: log.exception(u'Failed to save service to disk') - finally: - if file: - file.close() - if zip: - zip.close() + return False self.mainwindow.addRecentFile(path_file_name) self.setModified(False) return True From 25dbf271f68ec848df9908eee3cbf841d9a9fa8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Tue, 8 Mar 2011 12:16:09 +0200 Subject: [PATCH 45/90] Cleanup --- openlp/core/ui/servicemanager.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 93d24a567..164147c06 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -444,16 +444,20 @@ class ServiceManager(QtGui.QWidget): size_limit = 52428800 # 50MiB if file_size > size_limit: # File exeeds size_limit bytes, ask user - message = unicode(self.trUtf8('Do you want' - ' to include \n%.1f MiB file "%s"\n' + message = unicode(translate( + 'OpenLP.ServiceManager', 'Do you want' + ' to include \n%.1f MB file "%s"\n' 'into the service file?\n' 'This may take some time.\n\n' 'Please note that you need to\n' - 'take care of that file yourself.')) %\ + 'take care of that file yourself,\n' + 'if you leave it out.')) %\ (file_size/1048576, os.path.split(path_from)[1]) - ans = QtGui.QMessageBox.question(self, - self.trUtf8('Including Large File'), + ans = QtGui.QMessageBox.question( + self.mainwindow, + translate('OpenLP.ServiceManager', + 'Including Large File'), message, QtGui.QMessageBox.StandardButtons( QtGui.QMessageBox.Ok|\ From f73b8660e011c15b774e01ae2d9b0c7063abefaa Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Tue, 8 Mar 2011 17:46:53 +0100 Subject: [PATCH 46/90] added more debug messages --- openlp/core/ui/maindisplay.py | 8 ++++++-- openlp/plugins/songs/lib/mediaitem.py | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 4a12ca05e..357eb655a 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -90,8 +90,8 @@ class MainDisplay(DisplayWidget): """ Set up and build the output screen """ - log.debug(u'Setup live = %s for monitor %s ' % (self.isLive, - self.screens.monitor_number)) + log.debug(u'Start setup for monitor %s (live = %s)' % + (self.screens.monitor_number, self.isLive)) self.usePhonon = QtCore.QSettings().value( u'media/use phonon', QtCore.QVariant(True)).toBool() self.phononActive = False @@ -102,6 +102,7 @@ class MainDisplay(DisplayWidget): self.videoWidget.setVisible(False) self.videoWidget.setGeometry(QtCore.QRect(0, 0, self.screen[u'size'].width(), self.screen[u'size'].height())) + log.debug(u'Setup Phonon for monitor %s' % self.screens.monitor_number) self.mediaObject = Phonon.MediaObject(self) self.audio = Phonon.AudioOutput(Phonon.VideoCategory, self.mediaObject) Phonon.createPath(self.mediaObject, self.videoWidget) @@ -109,6 +110,7 @@ class MainDisplay(DisplayWidget): QtCore.QObject.connect(self.mediaObject, QtCore.SIGNAL(u'stateChanged(Phonon::State, Phonon::State)'), self.videoStart) + log.debug(u'Setup webView for monitor %s' % self.screens.monitor_number) self.webView = QtWebKit.QWebView(self) self.webView.setGeometry(0, 0, self.screen[u'size'].width(), self.screen[u'size'].height()) @@ -165,6 +167,8 @@ class MainDisplay(DisplayWidget): self.primary = False else: self.primary = True + log.debug( + u'Finished setup for monitor %s' % self.screens.monitor_number) def text(self, slide): """ diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 37a404daa..4c267dd3c 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -198,7 +198,7 @@ class SongMediaItem(MediaManagerItem): Handle the exit from the edit dialog and trigger remote updates of songs """ - log.debug(u'onSongListLoad') + log.debug(u'onSongListLoad - start') # Called to redisplay the song list screen edit from a search # or from the exit of the Song edit dialog. If remote editing is active # Trigger it and clean up so it will not update again. @@ -213,6 +213,7 @@ class SongMediaItem(MediaManagerItem): self.parent.serviceManager.replaceServiceItem(item) self.onRemoteEditClear() self.onSearchTextButtonClick() + log.debug(u'onSongListLoad - finished') def displayResultsSong(self, searchresults): log.debug(u'display results Song') From 1292ea3931c6e336fced30819194cedd20b1a264 Mon Sep 17 00:00:00 2001 From: "John Cegalis jseagull1@hotmail.com" Date: Tue, 8 Mar 2011 12:30:27 -0500 Subject: [PATCH 47/90] Added a credits section --- documentation/manual/source/index.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/documentation/manual/source/index.rst b/documentation/manual/source/index.rst index 378cfe2a0..89b9cf813 100644 --- a/documentation/manual/source/index.rst +++ b/documentation/manual/source/index.rst @@ -17,3 +17,6 @@ Contents: mediamanager songs +Credits +------- +Edited by john \ No newline at end of file From 8887a7c04aada40b11c496a9f55696cd6b0de8c1 Mon Sep 17 00:00:00 2001 From: "John Cegalis jseagull1@hotmail.com" Date: Tue, 8 Mar 2011 13:08:00 -0500 Subject: [PATCH 48/90] Removed test credits --- documentation/manual/source/index.rst | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/documentation/manual/source/index.rst b/documentation/manual/source/index.rst index 89b9cf813..36bcf2cc1 100644 --- a/documentation/manual/source/index.rst +++ b/documentation/manual/source/index.rst @@ -15,8 +15,4 @@ Contents: glossary dualmonitors mediamanager - songs - -Credits -------- -Edited by john \ No newline at end of file + songs \ No newline at end of file From 9e66b03774e2bca73c266faede705a96ff05a022 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 8 Mar 2011 18:50:26 +0000 Subject: [PATCH 49/90] Fix combo refresh --- openlp/core/ui/firsttimeform.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index e658f38d3..88cd7a5cc 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -124,6 +124,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): Detects Page changes and updates as approprate. """ if self.page(pageId) == self.DefaultsPage: + self.themeSelectionComboBox.clear() listIterator = QtGui.QTreeWidgetItemIterator( self.selectionTreeWidget) while listIterator.value(): From fcadc58e75c744c6fa167c036f871de573f5f751 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Tue, 8 Mar 2011 22:09:52 +0100 Subject: [PATCH 50/90] fixed bug #730979 Fixes: https://launchpad.net/bugs/730979 --- openlp/core/lib/__init__.py | 12 ++++++++++++ openlp/plugins/bibles/lib/db.py | 18 ++---------------- openlp/plugins/songs/lib/openlyricsexport.py | 10 ++++++---- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index dc60a5a65..e92b9c64a 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -29,6 +29,7 @@ OpenLP work. """ import logging import os.path +import re import types from PyQt4 import QtCore, QtGui @@ -320,6 +321,17 @@ def check_directory_exists(dir): if not os.path.exists(dir): os.makedirs(dir) +def clean_file_name(path): + """ + Removes not supported characters from the given path. + + ``path`` + The path to clean. + """ + if not isinstance(path, unicode): + path = unicode(path, u'utf-8') + return re.sub(r'[/\\?*|<>\[\]":<>+%]+', u'_', path).strip(u'_') + from listwidgetwithdnd import ListWidgetWithDnD from displaytags import DisplayTags from spelltextedit import SpellTextEdit diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 5cf000ee1..2021afa40 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -26,14 +26,13 @@ import logging import chardet -import re from PyQt4 import QtCore from sqlalchemy import Column, ForeignKey, or_, Table, types from sqlalchemy.orm import class_mapper, mapper, relation from sqlalchemy.orm.exc import UnmappedClassError -from openlp.core.lib import Receiver, translate +from openlp.core.lib import clean_file_name, Receiver, translate from openlp.core.lib.db import BaseModel, init_db, Manager from openlp.core.lib.ui import critical_error_message_box @@ -155,7 +154,7 @@ class BibleDB(QtCore.QObject, Manager): self.name = kwargs[u'name'] if not isinstance(self.name, unicode): self.name = unicode(self.name, u'utf-8') - self.file = self.clean_filename(self.name) + self.file = clean_file_name(self.name) + u'.sqlite' if u'file' in kwargs: self.file = kwargs[u'file'] Manager.__init__(self, u'bibles', init_schema, self.file) @@ -183,19 +182,6 @@ class BibleDB(QtCore.QObject, Manager): self.name = None return self.name - def clean_filename(self, old_filename): - """ - Clean up the version name of the Bible and convert it into a valid - file name. - - ``old_filename`` - The "dirty" file name or version name. - """ - if not isinstance(old_filename, unicode): - old_filename = unicode(old_filename, u'utf-8') - old_filename = re.sub(r'[^\w]+', u'_', old_filename).strip(u'_') - return old_filename + u'.sqlite' - def register(self, wizard): """ This method basically just initialialises the database. It is called diff --git a/openlp/plugins/songs/lib/openlyricsexport.py b/openlp/plugins/songs/lib/openlyricsexport.py index c2b58980b..f4fdd769a 100644 --- a/openlp/plugins/songs/lib/openlyricsexport.py +++ b/openlp/plugins/songs/lib/openlyricsexport.py @@ -32,7 +32,8 @@ import os from lxml import etree -from openlp.core.lib import Receiver, translate +from openlp.core.lib import check_directory_exists, clean_file_name, Receiver, \ + translate from openlp.plugins.songs.lib import OpenLyrics log = logging.getLogger(__name__) @@ -50,8 +51,7 @@ class OpenLyricsExport(object): self.manager = parent.plugin.manager self.songs = songs self.save_path = save_path - if not os.path.exists(self.save_path): - os.mkdir(self.save_path) + check_directory_exists(self.save_path) def do_export(self): """ @@ -69,6 +69,8 @@ class OpenLyricsExport(object): song.title) xml = openLyrics.song_to_xml(song) tree = etree.ElementTree(etree.fromstring(xml)) - tree.write(os.path.join(self.save_path, song.title + u'.xml'), + filename = clean_file_name(u'%s (%s).xml' % (song.title, + u', '.join([author.display_name for author in song.authors]))) + tree.write(os.path.join(self.save_path, filename), encoding=u'utf-8', xml_declaration=True, pretty_print=True) return True From ae864689c76fc5b158145938bfc2e9de68cd24fb Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Wed, 9 Mar 2011 08:02:31 +0200 Subject: [PATCH 51/90] Make the language detection menu item part of the group. --- openlp/core/ui/mainwindow.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 2e87f186e..ba3141f97 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -228,11 +228,12 @@ class Ui_MainWindow(object): # i18n Language Items self.AutoLanguageItem = checkable_action(mainWindow, u'AutoLanguageItem', LanguageManager.auto_language) - mainWindow.actionList.add_action(self.AutoLanguageItem, u'Settings') + #mainWindow.actionList.add_action(self.AutoLanguageItem, u'Settings') self.LanguageGroup = QtGui.QActionGroup(mainWindow) self.LanguageGroup.setExclusive(True) self.LanguageGroup.setObjectName(u'LanguageGroup') - self.LanguageGroup.setDisabled(LanguageManager.auto_language) + #self.LanguageGroup.setDisabled(LanguageManager.auto_language) + add_actions(self.LanguageGroup, [self.AutoLanguageItem]) qmList = LanguageManager.get_qm_list() savedLanguage = LanguageManager.get_language() for key in sorted(qmList.keys()): From e7cc230560212417c78b32439f60f0d3e97ca5b4 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Wed, 9 Mar 2011 08:55:41 +0200 Subject: [PATCH 52/90] Added debian into the main branch. --- resources/debian/Makefile | 13 + resources/debian/debian/changelog | 389 +++++++++++++++++++++++++ resources/debian/debian/compat | 1 + resources/debian/debian/control | 19 ++ resources/debian/debian/copyright | 10 + resources/debian/debian/docs | 1 + resources/debian/debian/openlp.install | 1 + resources/debian/debian/pycompat | 1 + resources/debian/debian/pyversions | 1 + resources/debian/debian/rules | 21 ++ 10 files changed, 457 insertions(+) create mode 100644 resources/debian/Makefile create mode 100644 resources/debian/debian/changelog create mode 100644 resources/debian/debian/compat create mode 100644 resources/debian/debian/control create mode 100644 resources/debian/debian/copyright create mode 100644 resources/debian/debian/docs create mode 100644 resources/debian/debian/openlp.install create mode 100644 resources/debian/debian/pycompat create mode 100644 resources/debian/debian/pyversions create mode 100755 resources/debian/debian/rules diff --git a/resources/debian/Makefile b/resources/debian/Makefile new file mode 100644 index 000000000..fd19cffb7 --- /dev/null +++ b/resources/debian/Makefile @@ -0,0 +1,13 @@ +#!/usr/bin/make -f +# -*- makefile -*- + +build: + mkdir -p openlp/i18n + for TSFILE in resources/i18n/*.ts; do\ + lrelease-qt4 $$TSFILE -qm openlp/i18n/`basename $$TSFILE .ts`.qm;\ + done + +install: + +clean: + diff --git a/resources/debian/debian/changelog b/resources/debian/debian/changelog new file mode 100644 index 000000000..1d22843f1 --- /dev/null +++ b/resources/debian/debian/changelog @@ -0,0 +1,389 @@ +openlp (1.9.4+bzr1355-0ubuntu1~natty1) natty; urgency=low + + * Autobuild + + -- Sun, 06 Mar 2011 00:10:03 -0500 + +openlp (1.9.4+bzr1355-0ubuntu1~maverick1) maverick; urgency=low + + * Autobuild + + -- Sun, 06 Mar 2011 00:07:03 -0500 + +openlp (1.9.4+bzr1355-0ubuntu1~lucid1) lucid; urgency=low + + * Autobuild + + -- Sun, 06 Mar 2011 00:05:27 -0500 + +openlp (1.9.4+bzr1355-0ubuntu1~karmic1) karmic; urgency=low + + * Autobuild + + -- Sun, 06 Mar 2011 00:03:17 -0500 + +openlp (1.9.4+bzr1350-0ubuntu1~natty1) natty; urgency=low + + * Autobuild + + -- Sat, 05 Mar 2011 00:08:15 -0500 + +openlp (1.9.4+bzr1350-0ubuntu1~maverick1) maverick; urgency=low + + * Autobuild + + -- Sat, 05 Mar 2011 00:06:40 -0500 + +openlp (1.9.4+bzr1350-0ubuntu1~lucid1) lucid; urgency=low + + * Autobuild + + -- Sat, 05 Mar 2011 00:05:09 -0500 + +openlp (1.9.4+bzr1350-0ubuntu1~karmic1) karmic; urgency=low + + * Autobuild + + -- Sat, 05 Mar 2011 00:03:14 -0500 + +openlp (1.9.4+bzr1347-0ubuntu1~natty1) natty; urgency=low + + * Autobuild + + -- Fri, 04 Mar 2011 00:04:49 -0500 + +openlp (1.9.4+bzr1347-0ubuntu1~maverick1) maverick; urgency=low + + * Autobuild + + -- Fri, 04 Mar 2011 00:04:15 -0500 + +openlp (1.9.4+bzr1347-0ubuntu1~lucid1) lucid; urgency=low + + * Autobuild + + -- Fri, 04 Mar 2011 00:03:34 -0500 + +openlp (1.9.4+bzr1347-0ubuntu1~karmic1) karmic; urgency=low + + * Autobuild + + -- Fri, 04 Mar 2011 00:02:43 -0500 + +openlp (1.9.4+bzr1344-0ubuntu1~natty1) natty; urgency=low + + * Autobuild + + -- Thu, 03 Mar 2011 00:03:56 -0500 + +openlp (1.9.4+bzr1344-0ubuntu1~maverick1) maverick; urgency=low + + * Autobuild + + -- Thu, 03 Mar 2011 00:03:30 -0500 + +openlp (1.9.4+bzr1344-0ubuntu1~lucid1) lucid; urgency=low + + * Autobuild + + -- Thu, 03 Mar 2011 00:03:05 -0500 + +openlp (1.9.4+bzr1344-0ubuntu1~karmic1) karmic; urgency=low + + * Autobuild + + -- Thu, 03 Mar 2011 00:02:26 -0500 + +openlp (1.9.4+bzr1342-0ubuntu1~natty1) natty; urgency=low + + * Autobuild + + -- Tue, 01 Mar 2011 00:03:44 -0500 + +openlp (1.9.4+bzr1342-0ubuntu1~maverick1) maverick; urgency=low + + * Autobuild + + -- Tue, 01 Mar 2011 00:03:28 -0500 + +openlp (1.9.4+bzr1342-0ubuntu1~lucid1) lucid; urgency=low + + * Autobuild + + -- Tue, 01 Mar 2011 00:03:03 -0500 + +openlp (1.9.4+bzr1342-0ubuntu1~karmic1) karmic; urgency=low + + * Autobuild + + -- Tue, 01 Mar 2011 00:02:28 -0500 + +openlp (1.9.4+bzr1341-0ubuntu1~natty1) natty; urgency=low + + * Autobuild + + -- Sun, 27 Feb 2011 00:04:05 -0500 + +openlp (1.9.4+bzr1341-0ubuntu1~maverick1) maverick; urgency=low + + * Autobuild + + -- Sun, 27 Feb 2011 00:03:48 -0500 + +openlp (1.9.4+bzr1341-0ubuntu1~lucid1) lucid; urgency=low + + * Autobuild + + -- Sun, 27 Feb 2011 00:03:20 -0500 + +openlp (1.9.4+bzr1341-0ubuntu1~karmic1) karmic; urgency=low + + * Autobuild + + -- Sun, 27 Feb 2011 00:02:34 -0500 + +openlp (1.9.4+bzr1337-0ubuntu1~natty1) natty; urgency=low + + * Autobuild + + -- Sat, 26 Feb 2011 00:04:02 -0500 + +openlp (1.9.4+bzr1337-0ubuntu1~maverick1) maverick; urgency=low + + * Autobuild + + -- Sat, 26 Feb 2011 00:03:44 -0500 + +openlp (1.9.4+bzr1337-0ubuntu1~lucid1) lucid; urgency=low + + * Autobuild + + -- Sat, 26 Feb 2011 00:03:18 -0500 + +openlp (1.9.4+bzr1337-0ubuntu1~karmic1) karmic; urgency=low + + * Autobuild + + -- Sat, 26 Feb 2011 00:02:32 -0500 + +openlp (1.9.4+bzr1332-0ubuntu1~natty1) natty; urgency=low + + * Autobuild + + -- Fri, 25 Feb 2011 00:04:00 -0500 + +openlp (1.9.4+bzr1332-0ubuntu1~maverick1) maverick; urgency=low + + * Autobuild + + -- Fri, 25 Feb 2011 00:03:41 -0500 + +openlp (1.9.4+bzr1332-0ubuntu1~lucid1) lucid; urgency=low + + * Autobuild + + -- Fri, 25 Feb 2011 00:03:16 -0500 + +openlp (1.9.4+bzr1332-0ubuntu1~karmic1) karmic; urgency=low + + * Autobuild + + -- Fri, 25 Feb 2011 00:02:36 -0500 + +openlp (1.9.4+bzr1328-0ubuntu1~natty1) natty; urgency=low + + * Autobuild + + -- Thu, 24 Feb 2011 00:03:47 -0500 + +openlp (1.9.4+bzr1328-0ubuntu1~maverick1) maverick; urgency=low + + * Autobuild + + -- Thu, 24 Feb 2011 00:03:31 -0500 + +openlp (1.9.4+bzr1328-0ubuntu1~lucid1) lucid; urgency=low + + * Autobuild + + -- Thu, 24 Feb 2011 00:03:07 -0500 + +openlp (1.9.4+bzr1328-0ubuntu1~karmic1) karmic; urgency=low + + * Autobuild + + -- Thu, 24 Feb 2011 00:02:28 -0500 + +openlp (1.9.4+bzr1324-0ubuntu1~natty1) natty; urgency=low + + * Autobuild + + -- Wed, 23 Feb 2011 00:03:48 -0500 + +openlp (1.9.4+bzr1324-0ubuntu1~maverick1) maverick; urgency=low + + * Autobuild + + -- Wed, 23 Feb 2011 00:03:33 -0500 + +openlp (1.9.4+bzr1324-0ubuntu1~lucid1) lucid; urgency=low + + * Autobuild + + -- Wed, 23 Feb 2011 00:03:08 -0500 + +openlp (1.9.4+bzr1324-0ubuntu1~karmic1) karmic; urgency=low + + * Autobuild + + -- Wed, 23 Feb 2011 00:02:28 -0500 + +openlp (1.9.4+bzr1322-0ubuntu1~natty1) natty; urgency=low + + * Autobuild + + -- Tue, 22 Feb 2011 00:04:06 -0500 + +openlp (1.9.4+bzr1322-0ubuntu1~maverick1) maverick; urgency=low + + * Autobuild + + -- Tue, 22 Feb 2011 00:03:52 -0500 + +openlp (1.9.4+bzr1322-0ubuntu1~lucid1) lucid; urgency=low + + * Autobuild + + -- Tue, 22 Feb 2011 00:03:28 -0500 + +openlp (1.9.4+bzr1322-0ubuntu1~karmic1) karmic; urgency=low + + * Autobuild + + -- Tue, 22 Feb 2011 00:02:42 -0500 + +openlp (1.9.4+bzr1320-0ubuntu1~natty1) natty; urgency=low + + * Autobuild + + -- Mon, 21 Feb 2011 00:03:59 -0500 + +openlp (1.9.4+bzr1320-0ubuntu1~maverick1) maverick; urgency=low + + * Autobuild + + -- Mon, 21 Feb 2011 00:03:45 -0500 + +openlp (1.9.4+bzr1320-0ubuntu1~lucid1) lucid; urgency=low + + * Autobuild + + -- Mon, 21 Feb 2011 00:03:21 -0500 + +openlp (1.9.4+bzr1320-0ubuntu1~karmic1) karmic; urgency=low + + * Autobuild + + -- Mon, 21 Feb 2011 00:02:41 -0500 + +openlp (1.9.4+bzr1316-0ubuntu1~natty1) natty; urgency=low + + * Autobuild + + -- Sun, 20 Feb 2011 05:32:08 -0500 + +openlp (1.9.4+bzr1316-0ubuntu1~maverick1) maverick; urgency=low + + * Autobuild + + -- Sun, 20 Feb 2011 05:31:51 -0500 + +openlp (1.9.4+bzr1316-0ubuntu1~lucid1) lucid; urgency=low + + * Autobuild + + -- Sun, 20 Feb 2011 05:31:28 -0500 + +openlp (1.9.4+bzr1316-0ubuntu1~karmic1) karmic; urgency=low + + * Autobuild + + -- Sun, 20 Feb 2011 05:30:49 -0500 + +openlp (1.9.4+bzr1315-0ubuntu1~natty1) natty; urgency=low + + * Autobuild + + -- Sat, 19 Feb 2011 16:24:12 -0500 + +openlp (1.9.4+bzr1315-0ubuntu1~maverick1) maverick; urgency=low + + * Autobuild + + -- Sat, 19 Feb 2011 16:23:51 -0500 + +openlp (1.9.4+bzr1315-0ubuntu1~lucid1) lucid; urgency=low + + * Autobuild + + -- Sat, 19 Feb 2011 16:23:28 -0500 + +openlp (1.9.4+bzr1315-0ubuntu1~karmic1) karmic; urgency=low + + * Autobuild + + -- Sat, 19 Feb 2011 16:22:49 -0500 + +openlp (1.9.4+bzr1314-0ubuntu1~natty1) natty; urgency=low + + * Autobuild + + -- Sat, 19 Feb 2011 15:35:36 -0500 + +openlp (1.9.4+bzr1314-0ubuntu1~maverick1) maverick; urgency=low + + * Autobuild + + -- Sat, 19 Feb 2011 15:35:21 -0500 + +openlp (1.9.4+bzr1314-0ubuntu1~lucid1) lucid; urgency=low + + * Autobuild + + -- Sat, 19 Feb 2011 15:34:53 -0500 + +openlp (1.9.4+bzr1314-0ubuntu1~karmic1) karmic; urgency=low + + * Autobuild + + -- Sat, 19 Feb 2011 15:34:10 -0500 + +openlp (1.9.4+bzr1313-0ubuntu1~natty1) natty; urgency=low + + * Autobuild + + -- Sat, 19 Feb 2011 13:58:14 -0500 + +openlp (1.9.4+bzr1313-0ubuntu1~maverick1) maverick; urgency=low + + * Autobuild + + -- Sat, 19 Feb 2011 13:57:40 -0500 + +openlp (1.9.4+bzr1313-0ubuntu1~lucid1) lucid; urgency=low + + * Autobuild + + -- Sat, 19 Feb 2011 13:57:11 -0500 + +openlp (1.9.4+bzr1313-0ubuntu1~karmic1) karmic; urgency=low + + * Autobuild + + -- Sat, 19 Feb 2011 13:56:17 -0500 + +openlp (0.0.0+bzr664-0ubuntu1) karmic; urgency=low + + * Initial release + + -- Michael Gorven Fri, 06 Nov 2009 09:46:40 +0200 diff --git a/resources/debian/debian/compat b/resources/debian/debian/compat new file mode 100644 index 000000000..7ed6ff82d --- /dev/null +++ b/resources/debian/debian/compat @@ -0,0 +1 @@ +5 diff --git a/resources/debian/debian/control b/resources/debian/debian/control new file mode 100644 index 000000000..220b500d2 --- /dev/null +++ b/resources/debian/debian/control @@ -0,0 +1,19 @@ +Source: openlp +Section: python +Priority: extra +Maintainer: OpenLP Developers +Build-Depends: cdbs, debhelper (>= 5), python-setuptools, python-support, + python, qt4-dev-tools +Standards-Version: 3.8.3 +Homepage: http://openlp.org/ + +Package: openlp +Architecture: all +Depends: ${shlibs:Depends}, ${misc:Depends}, ${python:Depends}, python-qt4, + python-qt4-phonon, python-sqlalchemy, python-chardet, python-beautifulsoup, + python-lxml, python-sqlite, python-enchant +Conflicts: python-openlp +Description: Church lyrics projection application + OpenLP is free church presentation software, or lyrics projection software, + used to display slides of songs, Bible verses, videos, images, and even + presentations for church worship using a computer and a data projector. diff --git a/resources/debian/debian/copyright b/resources/debian/debian/copyright new file mode 100644 index 000000000..54e52a356 --- /dev/null +++ b/resources/debian/debian/copyright @@ -0,0 +1,10 @@ +Format-Specification: http://wiki.debian.org/Proposals/CopyrightFormat +Upstream-Name: OpenLP +Upstream-Maintainer: OpenLP Developers +Upstream-Source: http://openlp.org/ + +Files: * +Copyright: (c) 2008-2009 Raoul Snyman +License: GPL-2 +X-Comment: On Debian GNU/Linux systems, the complete text of the + GPL-2 License can be found in /usr/share/common-licenses/GPL-2 diff --git a/resources/debian/debian/docs b/resources/debian/debian/docs new file mode 100644 index 000000000..dfcaa10d3 --- /dev/null +++ b/resources/debian/debian/docs @@ -0,0 +1 @@ +documentation diff --git a/resources/debian/debian/openlp.install b/resources/debian/debian/openlp.install new file mode 100644 index 000000000..5ef4e79ce --- /dev/null +++ b/resources/debian/debian/openlp.install @@ -0,0 +1 @@ +resources/openlp.desktop /usr/share/applications diff --git a/resources/debian/debian/pycompat b/resources/debian/debian/pycompat new file mode 100644 index 000000000..0cfbf0888 --- /dev/null +++ b/resources/debian/debian/pycompat @@ -0,0 +1 @@ +2 diff --git a/resources/debian/debian/pyversions b/resources/debian/debian/pyversions new file mode 100644 index 000000000..b3dc41ebc --- /dev/null +++ b/resources/debian/debian/pyversions @@ -0,0 +1 @@ +2.5- diff --git a/resources/debian/debian/rules b/resources/debian/debian/rules new file mode 100755 index 000000000..18a593660 --- /dev/null +++ b/resources/debian/debian/rules @@ -0,0 +1,21 @@ +#!/usr/bin/make -f + +DEB_PYTHON_SYSTEM := pysupport +DEB_MAKE_BUILD_TARGET := build +DEB_MAKE_INSTALL_TARGET := +DEB_MAKE_CLEAN_TARGET := + +include /usr/share/cdbs/1/rules/debhelper.mk +include /usr/share/cdbs/1/class/python-distutils.mk +include /usr/share/cdbs/1/class/makefile.mk + +binary-post-install/openlp:: + for SIZE in 16x16 32x32 48x48 64x64 128x128 256x256; do \ + mkdir -p debian/openlp/usr/share/icons/hicolor/$$SIZE/apps && \ + cp resources/images/openlp-logo-$$SIZE.png debian/openlp/usr/share/icons/hicolor/$$SIZE/apps/openlp.png; \ + done + + mkdir -p debian/openlp/usr/share/icons/hicolor/scalable/apps && \ + cp resources/images/openlp-logo.svg debian/openlp/usr/share/icons/hicolor/scalable/apps/openlp.svg + + cd debian/openlp/usr/bin/ && mv openlp.pyw openlp From c7a435951df7d6eefcadc05ed37a09dd11358cca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Wed, 9 Mar 2011 09:17:58 +0200 Subject: [PATCH 53/90] Better code, as suggested and a few suggested fixes as well. --- openlp/core/ui/servicemanager.py | 142 ++++++++++++++----------------- 1 file changed, 66 insertions(+), 76 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 164147c06..703c5ebc4 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -415,84 +415,74 @@ class ServiceManager(QtGui.QWidget): """ if not self.fileName(): return self.saveFileAs() - else: - path_file_name = unicode(self.fileName()) - (path, file_name) = os.path.split(path_file_name) - basename = file_name[0:file_name.rfind(u'.')-1] - service_file_name = basename + '.osd' - log.debug(u'ServiceManager.saveFile - %s' % path_file_name) - SettingsManager.set_last_dir(self.mainwindow.serviceSettingsSection, - path) - service = [] - zip = None - try: - write_list = [] - total_size = 0 - for item in self.serviceItems: - service.append({u'serviceitem': - item[u'service_item'].get_service_repr()}) - if item[u'service_item'].uses_file(): - for frame in item[u'service_item'].get_frames(): - if item[u'service_item'].is_image(): - path_from = frame[u'path'] - else: - path_from = os.path.join(frame[u'path'], - frame[u'title']) - # Only write a file once - if not path_from in write_list: - file_size = os.path.getsize(path_from) - size_limit = 52428800 # 50MiB - if file_size > size_limit: - # File exeeds size_limit bytes, ask user - message = unicode(translate( - 'OpenLP.ServiceManager', 'Do you want' - ' to include \n%.1f MB file "%s"\n' - 'into the service file?\n' - 'This may take some time.\n\n' - 'Please note that you need to\n' - 'take care of that file yourself,\n' - 'if you leave it out.')) %\ - (file_size/1048576, - os.path.split(path_from)[1]) - ans = QtGui.QMessageBox.question( - self.mainwindow, - translate('OpenLP.ServiceManager', - 'Including Large File'), - message, - QtGui.QMessageBox.StandardButtons( - QtGui.QMessageBox.Ok|\ - QtGui.QMessageBox.Cancel), - QtGui.QMessageBox.Ok) - if ans == QtGui.QMessageBox.Ok: - write_list.append(path_from) - total_size += file_size - else: - write_list.append(path_from) - total_size += file_size - log.debug(u'ServiceManager.saveFile - ZIP contents size is %i' - ' bytes' % total_size) - service_content = cPickle.dumps(service) - # Usual Zip file cannot exceed 2GiB, file with Zip64 cannot be - # extracted using unzip in UNIX. - allow_zip_64 = (total_size > 2147483648 + len(service_content)) - log.debug(u'ServiceManager.saveFile - allowZip64 is %s' % - allow_zip_64) - zip = zipfile.ZipFile(path_file_name, 'w', zipfile.ZIP_STORED, - allow_zip_64) - # We first add service contents. - # We save ALL filenames into ZIP using UTF-8. - zip.writestr(service_file_name.encode(u'utf-8'), - service_content) - # Finally add all the listed media files. - for path_from in write_list: - zip.write(path_from, path_from.encode(u'utf-8')) - zip.close() - except IOError: - log.exception(u'Failed to save service to disk') - return False + path_file_name = unicode(self.fileName()) + (path, file_name) = os.path.split(path_file_name) + basename = file_name[0:file_name.rfind(u'.')-1] + service_file_name = basename + '.osd' + log.debug(u'ServiceManager.saveFile - %s' % path_file_name) + SettingsManager.set_last_dir(self.mainwindow.serviceSettingsSection, + path) + service = [] + write_list = [] + total_size = 0 + for item in self.serviceItems: + service.append({u'serviceitem': + item[u'service_item'].get_service_repr()}) + if not item[u'service_item'].uses_file(): + continue + for frame in item[u'service_item'].get_frames(): + if item[u'service_item'].is_image(): + path_from = frame[u'path'] + else: + path_from = os.path.join(frame[u'path'], frame[u'title']) + # Only write a file once + if path_from in write_list: + continue + file_size = os.path.getsize(path_from) + size_limit = 52428800 # 50MiB + if file_size > size_limit: + # File exeeds size_limit bytes, ask user + message = unicode(translate('OpenLP.ServiceManager', + 'Do you want to include \n%.1f MB file "%s"\n' + 'into the service file?\nThis may take some time.\n\n' + 'Please note that you need to\ntake care of that file ' + 'yourself,\nif you leave it out.')) % \ + (file_size/1048576, os.path.split(path_from)[1]) + ans = QtGui.QMessageBox.question(self.mainwindow, + translate('OpenLP.ServiceManager', 'Including Large ' + 'File'), message, QtGui.QMessageBox.StandardButtons( + QtGui.QMessageBox.Ok|QtGui.QMessageBox.Cancel), + QtGui.QMessageBox.Ok) + if ans == QtGui.QMessageBox.Cancel: + continue + write_list.append(path_from) + total_size += file_size + log.debug(u'ServiceManager.saveFile - ZIP contents size is %i bytes' % + total_size) + service_content = cPickle.dumps(service) + # Usual Zip file cannot exceed 2GiB, file with Zip64 cannot be + # extracted using unzip in UNIX. + allow_zip_64 = (total_size > 2147483648 + len(service_content)) + log.debug(u'ServiceManager.saveFile - allowZip64 is %s' % + allow_zip_64) + try: + zip = zipfile.ZipFile(path_file_name, 'w', zipfile.ZIP_STORED, + allow_zip_64) + # First we add service contents. + # We save ALL filenames into ZIP using UTF-8. + zip.writestr(service_file_name.encode(u'utf-8'), + service_content) + # Finally add all the listed media files. + for path_from in write_list: + zip.write(path_from, path_from.encode(u'utf-8')) + except IOError: + log.exception(u'Failed to save service to disk') + finally: + zip.close() self.mainwindow.addRecentFile(path_file_name) self.setModified(False) - return True + return True + return False def saveFileAs(self): """ From 6b437a120c79ae5bdb595da84e0a006c9bdb0e2f Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Wed, 9 Mar 2011 18:16:40 +0200 Subject: [PATCH 54/90] Updated the look and feel of the language form. Fixed up the welcome page of the wizard. --- openlp/core/ui/firsttimeform.py | 2 +- openlp/core/ui/firsttimelanguagedialog.py | 51 +- openlp/core/ui/firsttimelanguageform.py | 11 +- openlp/core/ui/firsttimewizard.py | 102 +-- resources/i18n/af.ts | 871 +++++++++++++-------- resources/i18n/de.ts | 352 +++++++-- resources/i18n/en.ts | 352 +++++++-- resources/i18n/en_GB.ts | 352 +++++++-- resources/i18n/en_ZA.ts | 857 ++++++++++++-------- resources/i18n/es.ts | 352 +++++++-- resources/i18n/et.ts | 352 +++++++-- resources/i18n/fr.ts | 352 +++++++-- resources/i18n/hu.ts | 352 +++++++-- resources/i18n/id.ts | 352 +++++++-- resources/i18n/ja.ts | 874 +++++++++++++-------- resources/i18n/ko.ts | 352 +++++++-- resources/i18n/nb.ts | 352 +++++++-- resources/i18n/nl.ts | 509 ++++++++---- resources/i18n/pt_BR.ts | 909 +++++++++++++--------- resources/i18n/ru.ts | 352 +++++++-- resources/i18n/sv.ts | 406 +++++++--- resources/images/openlp-2.qrc | 1 + resources/images/wizard_firsttime.bmp | Bin 0 -> 172254 bytes 23 files changed, 5802 insertions(+), 2663 deletions(-) create mode 100644 resources/images/wizard_firsttime.bmp diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index 88cd7a5cc..40f2a23e2 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -48,6 +48,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): log.info(u'ThemeWizardForm loaded') def __init__(self, screens, parent=None): + QtGui.QWizard.__init__(self, parent) # check to see if we have web access self.web = u'http://openlp.org/files/frw/' self.config = ConfigParser.ConfigParser() @@ -55,7 +56,6 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): if self.webAccess: files = self.webAccess.read() self.config.readfp(io.BytesIO(files)) - QtGui.QWizard.__init__(self, parent) self.setupUi(self) for screen in screens.get_screen_list(): self.displaySelectionComboBox.addItem(screen) diff --git a/openlp/core/ui/firsttimelanguagedialog.py b/openlp/core/ui/firsttimelanguagedialog.py index fbf817939..ae44abeb5 100644 --- a/openlp/core/ui/firsttimelanguagedialog.py +++ b/openlp/core/ui/firsttimelanguagedialog.py @@ -30,26 +30,37 @@ from openlp.core.lib import translate from openlp.core.lib.ui import create_accept_reject_button_box class Ui_FirstTimeLanguageDialog(object): - def setupUi(self, firstTimeLanguageDialog): - firstTimeLanguageDialog.setObjectName(u'firstTimeLanguageDialog') - firstTimeLanguageDialog.resize(300, 10) - self.dialogLayout = QtGui.QGridLayout(firstTimeLanguageDialog) + def setupUi(self, languageDialog): + languageDialog.setObjectName(u'languageDialog') + languageDialog.resize(300, 50) + self.dialogLayout = QtGui.QVBoxLayout(languageDialog) + self.dialogLayout.setContentsMargins(8, 8, 8, 8) + self.dialogLayout.setSpacing(8) self.dialogLayout.setObjectName(u'dialogLayout') - self.fileNameLabel = QtGui.QLabel(firstTimeLanguageDialog) - self.fileNameLabel.setObjectName(u'fileNameLabel') - self.dialogLayout.addWidget(self.fileNameLabel, 0, 0) - self.LanguageComboBox = QtGui.QComboBox(firstTimeLanguageDialog) - self.LanguageComboBox.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents) - self.LanguageComboBox.setObjectName("LanguageComboBox") - self.dialogLayout.addWidget(self.LanguageComboBox, 0, 1) - self.buttonBox = create_accept_reject_button_box(firstTimeLanguageDialog, True) - self.dialogLayout.addWidget(self.buttonBox, 1, 0, 1, 2) - self.retranslateUi(firstTimeLanguageDialog) - self.setMaximumHeight(self.sizeHint().height()) - QtCore.QMetaObject.connectSlotsByName(firstTimeLanguageDialog) + self.infoLabel = QtGui.QLabel(languageDialog) + self.infoLabel.setObjectName(u'infoLabel') + self.dialogLayout.addWidget(self.infoLabel) + self.languageLayout = QtGui.QHBoxLayout() + self.languageLayout.setObjectName(u'languageLayout') + self.languageLabel = QtGui.QLabel(languageDialog) + self.languageLabel.setObjectName(u'languageLabel') + self.languageLayout.addWidget(self.languageLabel) + self.languageComboBox = QtGui.QComboBox(languageDialog) + self.languageComboBox.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents) + self.languageComboBox.setObjectName("languageComboBox") + self.languageLayout.addWidget(self.languageComboBox) + self.dialogLayout.addLayout(self.languageLayout) + self.buttonBox = create_accept_reject_button_box(languageDialog, True) + self.dialogLayout.addWidget(self.buttonBox) - def retranslateUi(self, firstTimeLanguageDialog): + self.retranslateUi(languageDialog) + self.setMaximumHeight(self.sizeHint().height()) + QtCore.QMetaObject.connectSlotsByName(languageDialog) + + def retranslateUi(self, languageDialog): self.setWindowTitle(translate('OpenLP.FirstTimeLanguageForm', - 'Initial Set up Language')) - self.fileNameLabel.setText(translate('OpenLP.FirstTimeLanguageForm', - 'Initial Language:')) + 'Select Translation')) + self.infoLabel.setText(translate('OpenLP.FirstTimeLanguageForm', + 'Choose the translation you\'d like to use in OpenLP.')) + self.languageLabel.setText(translate('OpenLP.FirstTimeLanguageForm', + 'Translation:')) diff --git a/openlp/core/ui/firsttimelanguageform.py b/openlp/core/ui/firsttimelanguageform.py index 98489fde7..a8ce3bd57 100644 --- a/openlp/core/ui/firsttimelanguageform.py +++ b/openlp/core/ui/firsttimelanguageform.py @@ -26,10 +26,9 @@ from PyQt4 import QtGui -from firsttimelanguagedialog import Ui_FirstTimeLanguageDialog - from openlp.core.lib import translate from openlp.core.utils import LanguageManager +from firsttimelanguagedialog import Ui_FirstTimeLanguageDialog class FirstTimeLanguageForm(QtGui.QDialog, Ui_FirstTimeLanguageDialog): """ @@ -39,9 +38,9 @@ class FirstTimeLanguageForm(QtGui.QDialog, Ui_FirstTimeLanguageDialog): QtGui.QDialog.__init__(self, parent) self.setupUi(self) self.qmList = LanguageManager.get_qm_list() - self.LanguageComboBox.addItem(u'Automatic') + self.languageComboBox.addItem(u'Autodetect') for key in sorted(self.qmList.keys()): - self.LanguageComboBox.addItem(key) + self.languageComboBox.addItem(key) def exec_(self): """ @@ -51,13 +50,13 @@ class FirstTimeLanguageForm(QtGui.QDialog, Ui_FirstTimeLanguageDialog): def accept(self): # It's the first row so must be Automatic - if self.LanguageComboBox.currentIndex() == 0: + if self.languageComboBox.currentIndex() == 0: LanguageManager.auto_language = True LanguageManager.set_language(False, False) else: LanguageManager.auto_language = False action = QtGui.QAction(None) - action.setObjectName(unicode(self.LanguageComboBox.currentText())) + action.setObjectName(unicode(self.languageComboBox.currentText())) LanguageManager.set_language(action, False) return QtGui.QDialog.accept(self) diff --git a/openlp/core/ui/firsttimewizard.py b/openlp/core/ui/firsttimewizard.py index ee14b6b0e..299160b3f 100644 --- a/openlp/core/ui/firsttimewizard.py +++ b/openlp/core/ui/firsttimewizard.py @@ -27,7 +27,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate - +from openlp.core.lib.ui import add_welcome_page class Ui_FirstTimeWizard(object): def setupUi(self, FirstTimeWizard): @@ -37,86 +37,50 @@ class Ui_FirstTimeWizard(object): FirstTimeWizard.setWizardStyle(QtGui.QWizard.ModernStyle) FirstTimeWizard.setOptions(QtGui.QWizard.IndependentPages| QtGui.QWizard.NoBackButtonOnStartPage) - self.welcomePage = QtGui.QWizardPage() - self.welcomePage.setTitle(u'') - self.welcomePage.setSubTitle(u'') - self.welcomePage.setObjectName(u'welcomePage') - self.welcomeLayout = QtGui.QHBoxLayout(self.welcomePage) - self.welcomeLayout.setSpacing(8) - self.welcomeLayout.setMargin(0) - self.welcomeLayout.setObjectName(u'welcomeLayout') - self.importBibleImage = QtGui.QLabel(self.welcomePage) - self.importBibleImage.setMinimumSize(QtCore.QSize(163, 0)) - self.importBibleImage.setMaximumSize(QtCore.QSize(163, 16777215)) - self.importBibleImage.setLineWidth(0) - self.importBibleImage.setText(u'') - self.importBibleImage.setPixmap( - QtGui.QPixmap(u':/wizards/wizard_importbible.bmp')) - self.importBibleImage.setIndent(0) - self.importBibleImage.setObjectName(u'importBibleImage') - self.welcomeLayout.addWidget(self.importBibleImage) - self.welcomePageLayout = QtGui.QVBoxLayout() - self.welcomePageLayout.setSpacing(8) - self.welcomePageLayout.setObjectName(u'welcomePageLayout') - self.titleLabel = QtGui.QLabel(self.welcomePage) - self.titleLabel.setObjectName(u'titleLabel') - self.welcomePageLayout.addWidget(self.titleLabel) - spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, - QtGui.QSizePolicy.Fixed) - self.welcomePageLayout.addItem(spacerItem) - self.informationLabel = QtGui.QLabel(self.welcomePage) - self.informationLabel.setWordWrap(True) - self.informationLabel.setMargin(10) - self.informationLabel.setObjectName(u'informationLabel') - self.welcomePageLayout.addWidget(self.informationLabel) - spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, - QtGui.QSizePolicy.Expanding) - self.welcomePageLayout.addItem(spacerItem1) - self.welcomeLayout.addLayout(self.welcomePageLayout) - FirstTimeWizard.addPage(self.welcomePage) - self.PluginPagePage = QtGui.QWizardPage() - self.PluginPagePage.setObjectName(u'PluginPagePage') - self.verticalLayout_2 = QtGui.QVBoxLayout(self.PluginPagePage) - self.verticalLayout_2.setObjectName(u'verticalLayout_2') - self.verticalLayout = QtGui.QVBoxLayout() - self.verticalLayout.setObjectName(u'verticalLayout') - self.songsCheckBox = QtGui.QCheckBox(self.PluginPagePage) + add_welcome_page(FirstTimeWizard, u':/wizards/wizard_firsttime.bmp') + # The plugins page + self.pluginPage = QtGui.QWizardPage() + self.pluginPage.setObjectName(u'pluginPage') + self.pluginLayout = QtGui.QVBoxLayout(self.pluginPage) + self.pluginLayout.setContentsMargins(40, 15, 40, 0) + self.pluginLayout.setObjectName(u'pluginLayout') + self.songsCheckBox = QtGui.QCheckBox(self.pluginPage) self.songsCheckBox.setChecked(True) self.songsCheckBox.setObjectName(u'songsCheckBox') - self.verticalLayout.addWidget(self.songsCheckBox) - self.customCheckBox = QtGui.QCheckBox(self.PluginPagePage) + self.pluginLayout.addWidget(self.songsCheckBox) + self.customCheckBox = QtGui.QCheckBox(self.pluginPage) self.customCheckBox.setChecked(True) self.customCheckBox.setObjectName(u'customCheckBox') - self.verticalLayout.addWidget(self.customCheckBox) - self.bibleCheckBox = QtGui.QCheckBox(self.PluginPagePage) + self.pluginLayout.addWidget(self.customCheckBox) + self.bibleCheckBox = QtGui.QCheckBox(self.pluginPage) self.bibleCheckBox.setChecked(True) self.bibleCheckBox.setObjectName(u'bibleCheckBox') - self.verticalLayout.addWidget(self.bibleCheckBox) - self.imageCheckBox = QtGui.QCheckBox(self.PluginPagePage) + self.pluginLayout.addWidget(self.bibleCheckBox) + self.imageCheckBox = QtGui.QCheckBox(self.pluginPage) self.imageCheckBox.setChecked(True) self.imageCheckBox.setObjectName(u'imageCheckBox') - self.verticalLayout.addWidget(self.imageCheckBox) - self.presentationCheckBox = QtGui.QCheckBox(self.PluginPagePage) + self.pluginLayout.addWidget(self.imageCheckBox) + self.presentationCheckBox = QtGui.QCheckBox(self.pluginPage) self.presentationCheckBox.setChecked(True) self.presentationCheckBox.setObjectName(u'presentationCheckBox') - self.verticalLayout.addWidget(self.presentationCheckBox) - self.mediaCheckBox = QtGui.QCheckBox(self.PluginPagePage) + self.pluginLayout.addWidget(self.presentationCheckBox) + self.mediaCheckBox = QtGui.QCheckBox(self.pluginPage) self.mediaCheckBox.setChecked(True) self.mediaCheckBox.setObjectName(u'mediaCheckBox') - self.verticalLayout.addWidget(self.mediaCheckBox) - self.remoteCheckBox = QtGui.QCheckBox(self.PluginPagePage) + self.pluginLayout.addWidget(self.mediaCheckBox) + self.remoteCheckBox = QtGui.QCheckBox(self.pluginPage) self.remoteCheckBox.setObjectName(u'remoteCheckBox') - self.verticalLayout.addWidget(self.remoteCheckBox) - self.songUsageCheckBox = QtGui.QCheckBox(self.PluginPagePage) + self.pluginLayout.addWidget(self.remoteCheckBox) + self.songUsageCheckBox = QtGui.QCheckBox(self.pluginPage) self.songUsageCheckBox.setChecked(True) self.songUsageCheckBox.setObjectName(u'songUsageCheckBox') - self.verticalLayout.addWidget(self.songUsageCheckBox) - self.alertCheckBox = QtGui.QCheckBox(self.PluginPagePage) + self.pluginLayout.addWidget(self.songUsageCheckBox) + self.alertCheckBox = QtGui.QCheckBox(self.pluginPage) self.alertCheckBox.setChecked(True) self.alertCheckBox.setObjectName(u'alertCheckBox') - self.verticalLayout.addWidget(self.alertCheckBox) - self.verticalLayout_2.addLayout(self.verticalLayout) - FirstTimeWizard.addPage(self.PluginPagePage) + self.pluginLayout.addWidget(self.alertCheckBox) + FirstTimeWizard.addPage(self.pluginPage) + # The song samples page self.downloadDefaultsPage = QtGui.QWizardPage() self.downloadDefaultsPage.setObjectName(u'downloadDefaultsPage') self.noInternetLabel = QtGui.QLabel(self.downloadDefaultsPage) @@ -125,8 +89,8 @@ class Ui_FirstTimeWizard(object): self.internetGroupBox = QtGui.QGroupBox(self.downloadDefaultsPage) self.internetGroupBox.setGeometry(QtCore.QRect(20, 10, 501, 271)) self.internetGroupBox.setObjectName(u'internetGroupBox') - self.verticalLayout_4 = QtGui.QVBoxLayout(self.internetGroupBox) - self.verticalLayout_4.setObjectName(u'verticalLayout_4') + self.pluginLayout_4 = QtGui.QVBoxLayout(self.internetGroupBox) + self.pluginLayout_4.setObjectName(u'pluginLayout_4') self.selectionTreeWidget = QtGui.QTreeWidget(self.internetGroupBox) self.selectionTreeWidget.setHorizontalScrollBarPolicy( QtCore.Qt.ScrollBarAlwaysOff) @@ -135,7 +99,7 @@ class Ui_FirstTimeWizard(object): self.selectionTreeWidget.setObjectName(u'selectionTreeWidget') self.selectionTreeWidget.headerItem().setText(0, u'1') self.selectionTreeWidget.header().setVisible(False) - self.verticalLayout_4.addWidget(self.selectionTreeWidget) + self.pluginLayout_4.addWidget(self.selectionTreeWidget) FirstTimeWizard.addPage(self.downloadDefaultsPage) self.DefaultsPage = QtGui.QWizardPage() self.DefaultsPage.setObjectName(u'DefaultsPage') @@ -185,9 +149,9 @@ class Ui_FirstTimeWizard(object): 'This wizard will help you to configure OpenLP for initial use .' ' Click the next button below to start the process of selection ' 'your initial options. ')) - self.PluginPagePage.setTitle(translate('OpenLP.FirstTimeWizard', + self.pluginPage.setTitle(translate('OpenLP.FirstTimeWizard', 'Activate required Plugins')) - self.PluginPagePage.setSubTitle(translate('OpenLP.FirstTimeWizard', + self.pluginPage.setSubTitle(translate('OpenLP.FirstTimeWizard', 'Select the Plugins you wish to use. ')) self.songsCheckBox.setText(translate('OpenLP.FirstTimeWizard', 'Songs')) self.customCheckBox.setText(translate('OpenLP.FirstTimeWizard', diff --git a/resources/i18n/af.ts b/resources/i18n/af.ts index f9d3e7117..17dd303f3 100644 --- a/resources/i18n/af.ts +++ b/resources/i18n/af.ts @@ -23,7 +23,8 @@ Gaan steeds voort? The alert text does not contain '<>'. Do you want to continue anyway? - + Die attent-teks bevat nie '<>' nie. +Gaan steeds voort? @@ -154,28 +155,28 @@ Do you want to continue anyway? BibleDB.Wizard - + Importing testaments... %s Testament invoer... %s - + Importing testaments... done. Testament invoer... voltooi. - + Importing books... %s Boek invoer... %s - + Importing verses from %s... Importing verses from <book name>... Vers invoer vanaf %s... - + Importing verses... done. Vers invoer... voltooi. @@ -529,7 +530,7 @@ Veranderinge affekteer nie verse wat reeds in die diens is nie. Bybel Bestaan reeds - + Your Bible import failed. Die Bybel invoer het misluk. @@ -544,12 +545,12 @@ Veranderinge affekteer nie verse wat reeds in die diens is nie. Hierdie Bybel bestaan reeds. Voer asseblief 'n ander Bybel in of wis eers die bestaande een uit. - + Starting Registering bible... Begin Bybel registrasie... - + Registered bible. Please note, that verses will be downloaded on demand and thus an internet connection is required. Geregistreerde bybel. Neem kennis daarvan dat verse op aanvraag @@ -672,7 +673,7 @@ afgelaai word en dus word 'n Internet konneksie benodig. BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... Invoer %s %s... @@ -681,12 +682,12 @@ afgelaai word en dus word 'n Internet konneksie benodig. BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... Bepaal enkodering (dit mag 'n paar minuute neem)... - + Importing %s %s... Importing <book name> <chapter>... Invoer %s %s... @@ -1086,17 +1087,17 @@ Vind meer uit oor OpenLP: http://openlp.org/ OpenLP is geskryf en word onderhou deur vrywilligers. As u graag wil sien dat meer Christelike sagteware geskryf word, oorweeg dit asseblief om by te dra deur die knoppie hieronder te gebruik. - + Credits Krediete - + License Lisensie - + Contribute Dra By @@ -1106,7 +1107,28 @@ OpenLP is geskryf en word onderhou deur vrywilligers. As u graag wil sien dat me bou %s - + + Copyright © 2004-2011 Raoul Snyman +Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, +Meinert Jordan, Andreas Preikschat, Christian Richter, Philip +Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund + Kopiereg © 2004-2011 Raoul Snyman +Gedeeltelike kopiereg © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, +Meinert Jordan, Andreas Preikschat, Christian Richter, Philip +Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund + + + + 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. + Hierdie program is gratis sagteware; dit kan verspei en/of verander word onder die terme van die GNU Algemene Publieke Lisensie soos deur die Gratis Sagteware Vondasie gepubliseer is; weergawe 2 van die Lisensie. + + + + 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 below for more details. + Hierdie program word versprei in die hoop dat dit nuttig sal wees, maar SONDER ENIGE WAARBORG; sonder die geïmpliseerde waarborg van VERHANDELBAARHEID of GESKIKTHEID VIR 'N SPESIFIEKE DOEL. Sien hieronder vir meer inligting. + + + Project Lead %s @@ -1122,6 +1144,35 @@ Testers Packagers %s +Translators + Afrikaans (af) + %s + German (de) + %s + English, United Kingdom (en_GB) + %s + English, South Africa (en_ZA) + %s + Estonian (et) + %s + French (fr) + %s + Hungarian (hu) + %s + Japanese (ja) + %s + Norwegian Bokmål (nb) + %s + Dutch (nl) + %s + Portuguese, Brazil (pt_BR) + %s + Russian (ru) + %s + +Documentation + %s + Built With Python: http://www.python.org/ Qt4: http://qt.nokia.com/ @@ -1141,24 +1192,6 @@ Final Credit He has set us free. - - - Copyright © 2004-2011 Raoul Snyman -Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, -Meinert Jordan, Andreas Preikschat, Christian Richter, Philip -Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund - - - - - 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 below for more details. - - OpenLP.AdvancedTab @@ -1326,12 +1359,12 @@ Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frod Attach File - + Heg 'n Lêer aan Description characters to enter : %s - + Beskrywende karakters om in te voer: %s @@ -1340,17 +1373,18 @@ Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frod Platform: %s - + Platvorm: %s + Save Crash Report - + Stoor Bots Verslag Text files (*.txt *.log *.text) - + Teks lêers (*.txt *.log *.text) @@ -1368,7 +1402,20 @@ Version: %s --- Library Versions --- %s - + **OpenLP Bug Report** +Version: %s + +--- Details of the Exception. --- + +%s + + --- Exception Traceback --- +%s +--- System information --- +%s +--- Library Versions --- +%s + @@ -1387,7 +1434,20 @@ Version: %s %s Please add the information that bug reports are favoured written in English. - + *OpenLP Bug Report* +Version: %s + +--- Details of the Exception. --- + +%s + + --- Exception Traceback --- +%s +--- System information --- +%s +--- Library Versions --- +%s + @@ -1395,16 +1455,167 @@ Version: %s File Rename - + Lêer Hernoem New File Name: - + Nuwe Lêer Naam: File Copy + Lêer Kopieër + + + + OpenLP.FirstTimeLanguageForm + + + Initial Set up Language + + + + + Select the language you'd like to use in OpenLP. + + + + + OpenLP.FirstTimeWizard + + + Songs + + + + + Bibles + + + + + Themes + + + + + Starting Updates + + + + + Downloading %s + + + + + First Time Wizard + + + + + Welcome to the First Time Wizard + + + + + This wizard will help you to configure OpenLP for initial use . Click the next button below to start the process of selection your initial options. + + + + + Activate required Plugins + + + + + Select the Plugins you wish to use. + + + + + Custom Text + + + + + Bible + + + + + Images + Beelde + + + + Presentations + + + + + Media (Audio and Video) + + + + + Allow remote access + + + + + Monitor Song Usage + + + + + Allow Alerts + + + + + Download Samples from OpenLP.org + + + + + Select samples to downlaod and install for use. + + + + + No Internet connection found so unable to download any default files. + + + + + Download Example Files + + + + + Default Settings + + + + + Set up default values to be used by OpenLP + + + + + Default output display + + + + + Select the default Theme + + + + + Press finish to apply all your changes and start OpenLP @@ -1523,18 +1734,18 @@ Version: %s Check for updates to OpenLP - + Kyk vir opdaterings van OpenLP OpenLP.LanguageManager - + Language Taal - + Please restart OpenLP to use your new language setting. Herlaai asseblief OpenLP om die nuwe taal instelling te gebruik. @@ -1544,7 +1755,7 @@ Version: %s OpenLP Display - + OpenLP Vertooning @@ -1895,7 +2106,7 @@ Version: %s Verstel die skou modus na Regstreeks. - + Version %s of OpenLP is now available for download (you are currently running version %s). You can download the latest version from http://openlp.org/. @@ -1904,22 +2115,22 @@ You can download the latest version from http://openlp.org/. Die nuutste weergawe kan afgelaai word vanaf http://openlp.org/. - + OpenLP Version Updated OpenLP Weergawe is Opdateer - + OpenLP Main Display Blanked OpenLP Hoof Vertoning Blanko - + The Main Display has been blanked out Die Hoof Skerm is afgeskakel - + Default Theme: %s Verstek Tema: %s @@ -1932,42 +2143,42 @@ Die nuutste weergawe kan afgelaai word vanaf http://openlp.org/. Configure &Shortcuts... - + Konfigureer Kortpaaie - + Close OpenLP - + Mook OpenLP toe - + Are you sure you want to close OpenLP? - + Maak OpenLP sekerlik toe? Print the current Service Order. - + Druk die huidige Diens Bestelling. Ctrl+P - + Ctrl+P Open &Data Folder... - + Maak &Data Lêer oop... Open the folder where songs, bibles and other data resides. - + Maak die lêer waar liedere, bybels en ander data is, oop. &Configure Display Tags - + Konfigureer Vertoon Haakies @@ -2061,12 +2272,12 @@ Die nuutste weergawe kan afgelaai word vanaf http://openlp.org/. Fit Page - + Pas Blaai Fit Width - + Pas Wydte @@ -2074,62 +2285,62 @@ Die nuutste weergawe kan afgelaai word vanaf http://openlp.org/. Options - + Opsies Close - + Close Copy - + Kopieër Copy as HTML - + Kopieër as HTML Zoom In - + Zoom In Zoom Out - + Zoem Uit Zoom Original - + Zoem Oorspronklike Other Options - + Ander Opsies Include slide text if available - + Sluit skyfie teks in indien beskikbaar Include service item notes - + Sluit diens item notas in Include play length of media items - + Sluit die speel tyd van die media items in Service Order Sheet - + Diens Bestelling Blad @@ -2137,12 +2348,12 @@ Die nuutste weergawe kan afgelaai word vanaf http://openlp.org/. Screen - + Skerm primary - + primêr @@ -2263,39 +2474,39 @@ Die inhoud enkodering is nie UTF-8 nie. Lêer is nie 'n geldige diens nie. - + Missing Display Handler Vermisde Vertoon Hanteerder - + Your item cannot be displayed as there is no handler to display it Die item kan nie vertoon word nie omdat daar nie 'n hanteerder is om dit te vertoon nie - + Your item cannot be displayed as the plugin required to display it is missing or inactive Die item kan nie vertoon word nie omdat die mini-program wat dit moet vertoon vermis of onaktief is &Expand all - + Br&ei alles uit Expand all the service items. - + Brei al die diens items uit. &Collapse all - + Stort alles ineen Collapse all the service items. - + Stort al die diens items ineen @@ -2305,62 +2516,62 @@ Die inhoud enkodering is nie UTF-8 nie. OpenLP Service Files (*.osz) - + OpenLP Diens Lêers (*.osz) Moves the selection down the window. - + Skuif die geselekteerde afwaarts in die venster. Move up - + Skuif op Moves the selection up the window. - + Skuif die geselekteerde opwaarts in die venster. Go Live - + Gaan Regstreeks Send the selected item to Live. - + Stuur die geselekteerde item Regstreeks Modified Service - + Redigeer Diens Notes: - + Notas: &Start Time - + Begin Tyd Show &Preview - + Wys Voorskou Show &Live - + Vertoon Regstreeks The current service has been modified. Would you like to save this service? - + Die huidige diens was verander. Stoor hierdie diens? @@ -2384,140 +2595,140 @@ Die inhoud enkodering is nie UTF-8 nie. Customize Shortcuts - + Verpersoonlik Kortpaaie Action - + Aksie Shortcut - + Kortpad Default: %s - + Verstek: %s Custom: - + Persoonlik: None - + Geen Duplicate Shortcut - + Duplikaat Kortpad The shortcut "%s" is already assigned to another action, please use a different shortcut. - + Die kortpad "%s" is alreeds toegeken aan 'n ander aksie, kies asseblief 'n ander kortpad. Alternate - + Alternatief OpenLP.SlideController - + Move to previous Beweeg na vorige - + Move to next Beweeg na volgende - + Hide Verskuil - + Move to live Verskuif na regstreekse skerm - + Start continuous loop Begin aaneenlopende lus - + Stop continuous loop Stop deurlopende lus - + Delay between slides in seconds Vertraging tussen skyfies in sekondes - + Start playing media Begin media speel - + Go To Gaan Na - + Edit and reload song preview Redigeer en laai weer 'n lied voorskou - + Blank Screen - + Blanko Skerm Blank to Theme - + Blanko na Tema - + Show Desktop - + Wys Werkskerm - + Previous Slide - + Vorige Skyfie - + Next Slide - + Volgende Skyfie - + Previous Service - + Vorige Diens - + Next Service - + Volgende Diens - + Escape Item - + Ontsnap Item @@ -2538,32 +2749,32 @@ Die inhoud enkodering is nie UTF-8 nie. Item Start Time - + Item Begin Tyd Hours: - + Ure: h - + h m - + m Minutes: - + Minute: Seconds: - + Sekondes: @@ -2571,32 +2782,32 @@ Die inhoud enkodering is nie UTF-8 nie. Select Image - Selekteer beeld + Selekteer Beeld Theme Name Missing - + Tema Naam Vermis There is no name for this theme. Please enter one. - + Daar is nie 'n naam vir hierdie tema nie. Voer asseblief een in. Theme Name Invalid - + Tema Naam Ongeldig Invalid theme name. Please enter one. - + Ongeldige tema naam. Voer asseblief een in. (%d lines per slide) - + (%d lyne per skyfie) @@ -2662,131 +2873,131 @@ Die inhoud enkodering is nie UTF-8 nie. Stel in As &Globale Standaard - + %s (default) %s (standaard) - + You must select a theme to edit. Kies 'n tema om te redigeer. - + You are unable to delete the default theme. Die standaard tema kan nie uitgewis word nie. - + You have not selected a theme. Geen tema is geselekteer nie. - + Save Theme - (%s) Stoor Tema - (%s) - + Theme Exported Tema Uitvoer - + Your theme has been successfully exported. Die tema was suksesvol uitgevoer. - + Theme Export Failed Tema Uitvoer het Misluk - + Your theme could not be exported due to an error. Die tema kon nie uitgevoer word nie weens 'n fout. - + Select Theme Import File Kies Tema Invoer Lêer - + File is not a valid theme. The content encoding is not UTF-8. Lêer is nie 'n geldige tema nie. Die inhoud enkodering is nie UTF-8 nie. - + File is not a valid theme. Lêer is nie 'n geldige tema nie. - + Theme %s is used in the %s plugin. Tema %s is in gebruik deur die %s mini-program. &Copy Theme - + &Kopieër Tema &Rename Theme - + He&rnoem Tema &Export Theme - + Vo&er Tema uit - + You must select a theme to rename. - + Kies 'n tema om te hernoem. - + Rename Confirmation - + Hernoem Bevestiging - + Rename %s theme? - + Hernoem %s tema? - + You must select a theme to delete. - + Kies 'n tema om uit te wis. - + Delete Confirmation - + Uitwis Bevestiging - + Delete %s theme? - + Wis %s tema uit? - + Validation Error - + Validerings Fout - + A theme with this name already exists. - + 'n Tema met hierdie naam bestaan alreeds. - + OpenLP Themes (*.theme *.otz) - + OpenLP Temas (*.theme *.otz) @@ -2794,27 +3005,27 @@ Die inhoud enkodering is nie UTF-8 nie. Theme Wizard - + Tema Gids Welcome to the Theme Wizard - + Welkom by die Tema Gids Set Up Background - + Stel die Agtergrond Op Set up your theme's background according to the parameters below. - + Stel jou tema se agtergrond op volgens die parameters hier onder. Background type: - + Agtergrond tipe: @@ -2854,22 +3065,22 @@ Die inhoud enkodering is nie UTF-8 nie. Top Left - Bottom Right - + Links Bo - Regs Onder Bottom Left - Top Right - + Links Onder - Regs Bo Main Area Font Details - + Hoof Area Skrif Gegewens Define the font and display characteristics for the Display text - + Definieër die skrif en vertoon karrakters vir die Vertoon teks @@ -2884,17 +3095,17 @@ Die inhoud enkodering is nie UTF-8 nie. Line Spacing: - + Lyn Spasiëring: &Outline: - + Buitelyn: &Shadow: - + &Skaduwee: @@ -2904,32 +3115,32 @@ Die inhoud enkodering is nie UTF-8 nie. Italic - + Italiaans Footer Area Font Details - + Voetskrif Area Skrif Gegewens Define the font and display characteristics for the Footer text - + Definieër die skrif en vertoon karraktereienskappe vir die Voetskrif teks Text Formatting Details - + Teks Formattering Gegewens Allows additional display formatting information to be defined - + Laat toe dat addisionele vertoon formattering inligting gedifinieër word Horizontal Align: - + Horisontale Sporing: @@ -2949,22 +3160,22 @@ Die inhoud enkodering is nie UTF-8 nie. Output Area Locations - + Uitvoer Area Liggings Allows you to change and move the main and footer areas. - + Laat toe dat die hoof en voetskrif areas verander en geskuif word. &Main Area - + Hoof Area &Use default location - + Gebr&uik verstek ligging @@ -2999,37 +3210,37 @@ Die inhoud enkodering is nie UTF-8 nie. Save and Preview - + Stoor en Voorskou View the theme and save it replacing the current one or change the name to create a new theme - + Besigtig die tema en stoor dit waarna die huidige een vervang, of verander die naam om 'n nuwe een te skep Theme name: - + Tema naam: This wizard will help you to create and edit your themes. Click the next button below to start the process by setting up your background. - + Hierdie gids sal help om temas te skep en te redigeer. Klik die volgende knoppie hieronder om die proses te begin deur jou agtergrond op te stel. Transitions: - + Oorskakel effekte: &Footer Area - + Voetskrif Area Edit Theme - %s - + Redigeer Tema - %s @@ -3090,22 +3301,22 @@ Die inhoud enkodering is nie UTF-8 nie. Delete the selected item. - + Wis die geselekteerde item uit. Move selection up one position. - + Skuif die seleksie een posisie op. Move selection down one position. - + Skuif die seleksie een posisie af. &Add - + &Voeg by @@ -3130,12 +3341,12 @@ Die inhoud enkodering is nie UTF-8 nie. Import - + Voer in Length %s - + Lengte %s @@ -3145,12 +3356,12 @@ Die inhoud enkodering is nie UTF-8 nie. Load - + Laai New - + Nuwe @@ -3185,7 +3396,7 @@ Die inhoud enkodering is nie UTF-8 nie. Reset Background - + Herstel Agtergrond @@ -3200,17 +3411,17 @@ Die inhoud enkodering is nie UTF-8 nie. Service - + Diens Start %s - + Begin %s &Vertical Align: - + &Vertikale Sporing: @@ -3240,7 +3451,7 @@ Die inhoud enkodering is nie UTF-8 nie. Cancel - + Kanselleer @@ -3250,12 +3461,12 @@ Die inhoud enkodering is nie UTF-8 nie. Empty Field - + Leë Veld Export - + Uitvoer @@ -3271,12 +3482,12 @@ Die inhoud enkodering is nie UTF-8 nie. Live Background Error - + Regstreekse Agtergrond Fout Live Panel - + Regstreekse Paneel @@ -3287,25 +3498,25 @@ Die inhoud enkodering is nie UTF-8 nie. No File Selected Singular - + Geen Lêer Geselekteer nie No Files Selected Plural - + Geen Leêrs Geselekteer nie No Item Selected Singular - + Geen Item Geselekteer nie No Items Selected Plural - Geen item geselekteer nie + Geen items geselekteer nie @@ -3315,12 +3526,12 @@ Die inhoud enkodering is nie UTF-8 nie. Preview Panel - + Voorskou Paneel Print Service Order - + Druk Diens Orde @@ -3341,7 +3552,7 @@ Die inhoud enkodering is nie UTF-8 nie. You must select an item to delete. - + Kies 'n item om uit te wis. @@ -3363,7 +3574,7 @@ Die inhoud enkodering is nie UTF-8 nie. Version - + Weergawe @@ -3393,7 +3604,7 @@ Die inhoud enkodering is nie UTF-8 nie. Select the import format and the location to import from. - + Selekteer die invoer vormaat en die ligging vanwaar invoer geskied. @@ -3403,7 +3614,7 @@ Die inhoud enkodering is nie UTF-8 nie. Open %s File - + Maak %s Lêer Oop @@ -3424,7 +3635,7 @@ Die inhoud enkodering is nie UTF-8 nie. You need to specify at least one %s file to import from. A file type e.g. OpenSong - + Spesifiseer ten minste een %s lêer om vanaf in te voer. @@ -3434,7 +3645,7 @@ Die inhoud enkodering is nie UTF-8 nie. Welcome to the Song Export Wizard - + Welkom by die Lied Uitvoer Gids @@ -3445,13 +3656,13 @@ Die inhoud enkodering is nie UTF-8 nie. Author Singular - + Outeur Authors Plural - Skrywers + Outeure @@ -3494,7 +3705,7 @@ Die inhoud enkodering is nie UTF-8 nie. Configure Display Tags - + Konfigureer Vertoon Hakkies @@ -3507,27 +3718,27 @@ Die inhoud enkodering is nie UTF-8 nie. Load a new Presentation - + Laai 'n nuwe Aanbiedieng Delete the selected Presentation - + Wis die geselekteerde Aanbieding uit Preview the selected Presentation - + Sien voorskou van die geselekteerde Aanbieding Send the selected Presentation live - + Stuur die geselekteerde Aanbieding regstreeks Add the selected Presentation to the service - + Voeg die geselekteerde Aanbieding by die diens @@ -3588,22 +3799,22 @@ Die inhoud enkodering is nie UTF-8 nie. Presentations (%s) - + Aanbiedinge (%s) Missing Presentation - + Vermisde Aanbieding The Presentation %s no longer exists. - + Die Aanbieding %s bestaan nie meer nie. The Presentation %s is incomplete, please reload. - + Die Aanbieding %s is onvolledig, herlaai asseblief. @@ -3621,7 +3832,7 @@ Die inhoud enkodering is nie UTF-8 nie. %s (unavailable) - + %s (nie beskikbaar nie) @@ -3635,7 +3846,7 @@ Die inhoud enkodering is nie UTF-8 nie. Remote name singular - + Afstandbeheer @@ -3647,7 +3858,7 @@ Die inhoud enkodering is nie UTF-8 nie. Remote container title - + Afstandbeheer @@ -3714,19 +3925,19 @@ Die inhoud enkodering is nie UTF-8 nie. SongUsage name singular - + SongUsage SongUsage name plural - + SongUsage SongUsage container title - + SongUsage @@ -3749,12 +3960,12 @@ Die inhoud enkodering is nie UTF-8 nie. Deletion Successful - + Uitwissing Suksesvol All requested data has been deleted successfully. - + Al die gevraagde data is suksesvol uitgewis. @@ -3787,19 +3998,21 @@ Die inhoud enkodering is nie UTF-8 nie. usage_detail_%s_%s.txt - + usage_detail_%s_%s.txt Report Creation - + Verslag Skepping Report %s has been successfully created. - + Verslag + %s +was suksesvol geskep. @@ -3822,47 +4035,47 @@ has been successfully created. &Re-index Songs - + He&r-indeks Liedere Re-index the songs database to improve searching and ordering. - + Her-indeks die liedere databasis om lied-soektogte en organisering te verbeter. Reindexing songs... - + Besig om liedere indek te herskep... Add a new Song - + Voeg 'n nuwe Lied by Edit the selected Song - + Redigeer die geselekteerde Lied Delete the selected Song - + Wis die geselekteerde Lied uit Preview the selected Song - + Skou die geselekteerde Lied Send the selected Song live - + Stuur die geselekteerde Lied regstreeks Add the selected Song to the service - + Voeg die geselekteerde Lied by die diens @@ -3885,95 +4098,99 @@ has been successfully created. Arabic (CP-1256) - + Arabies (CP-1256) Baltic (CP-1257) - + Balties (CP-1257) Central European (CP-1250) - + Sentraal Europees (CP-1250) Cyrillic (CP-1251) - + Cyrillies (CP-1251) Greek (CP-1253) - + Grieks (CP-1253) Hebrew (CP-1255) - + Hebreeus (CP-1255) Japanese (CP-932) - + Japanees (CP-932) Korean (CP-949) - + Koreaans (CP-949) Simplified Chinese (CP-936) - + Vereenvoudigde Chinees (CP-936) Thai (CP-874) - + Thai (CP-874) Traditional Chinese (CP-950) - + Tradisionele Chinees (CP-950) Turkish (CP-1254) - + Turks (CP-1254) Vietnam (CP-1258) - + Viëtnamees (CP-1258) Western European (CP-1252) - + Wes-Europees (CP-1252) Character Encoding - + Karrakter Enkodering The codepage setting is responsible for the correct character representation. Usually you are fine with the preselected choice. - + Die kodeblad instelling is verantwoordelik +vir die korrekte karrakter voorstelling. +Gewoonlik is die reeds-geselekteerde +keuse voldoende. Please choose the character encoding. The encoding is responsible for the correct character representation. - + Kies asseblief die karrakter enkodering. +Die enkodering is verantwoordelik vir die korrekte karrakter voorstelling. Exports songs using the export wizard. - + Voer liedere uit deur gebruik te maak van die uitvoer gids. @@ -4019,7 +4236,7 @@ The encoding is responsible for the correct character representation. Importing song %d of %d - + Voer lied %d van %d in @@ -4197,12 +4414,12 @@ The encoding is responsible for the correct character representation. You need to have an author for this song. - + Daar word 'n outeur benodig vir hierdie lied. You need to type some text in to the verse. - + Daar word teks benodig vir die vers. @@ -4228,82 +4445,82 @@ The encoding is responsible for the correct character representation. Song Export Wizard - + Lied Uitvoer Gids This wizard will help to export your songs to the open and free OpenLyrics worship song format. - + Hierdie gids sal help om die liedere na die oop en gratis OpenLyrics aanbiddigs-formaat uit te voer. Select Songs - + Kies Liedere Uncheck All - + Merk Alles Af Check All - + Merk Alles Aan Select Directory - + Kies Lêer-gids Select the directory you want the songs to be saved. - + Kies die gids waar die liedere gestoor moet word. Directory: - + Lêer Gids: Exporting - + Uitvoer Please wait while your songs are exported. - + Wag asseblief terwyl die liedere uitgevoer word. You need to add at least one Song to export. - + Ten minste een lied moet bygevoeg word om uit te voer. No Save Location specified - + Geen Stoor Ligging gespesifiseer nie Starting export... - + Uitvoer begin... Check the songs you want to export. - + Merk die liediere wat uitgevoer moet vord. You need to specify a directory. - + 'n Lêer gids moet gespesifiseer word. Select Destination Folder - + Kies Bestemming Lêer gids @@ -4371,42 +4588,42 @@ The encoding is responsible for the correct character representation. OpenLP 2.0 Databases - + OpenLP 2.0 Databasisse openlp.org v1.x Databases - + openlp.org v1.x Databasisse Words Of Worship Song Files - + Words Of Worship Lied Lêers Songs Of Fellowship Song Files - + Songs Of Fellowship Lied Lêers SongBeamer Files - + SongBeamer Lêers SongShow Plus Song Files - + SongShow Plus Lied Lêers You need to specify at least one document or presentation file to import from. - + Ten minste een document of aanbieding moet gespesifiseer word om vanaf in te voer. Foilpresenter Song Files - + Foilpresenter Lied Lêers @@ -4427,25 +4644,25 @@ The encoding is responsible for the correct character representation. Lirieke - + Delete Song(s)? Wis Lied(ere) uit? CCLI License: - + CCLI Lisensie: Entire Song - + Volledige Lied - + Are you sure you want to delete the %n selected song(s)? - - + + Wis regtig die %n geselekteerde lied(ere)? @@ -4455,7 +4672,7 @@ The encoding is responsible for the correct character representation. Importing song %d of %d. - + Voer lied %d van %d in @@ -4463,7 +4680,7 @@ The encoding is responsible for the correct character representation. Exporting "%s"... - + Uitvoer "%s"... @@ -4494,12 +4711,12 @@ The encoding is responsible for the correct character representation. Finished export. - + Uitvoer voltooi. Your song export failed. - + Die lied uitvoer het misluk. @@ -4613,17 +4830,17 @@ The encoding is responsible for the correct character representation. The author %s already exists. Would you like to make songs with author %s use the existing author %s? - + Die outeur %s bestaan alreeds. Moet liedere met die outeur %s die bestaande outeur %s gebruik? The topic %s already exists. Would you like to make songs with topic %s use the existing topic %s? - + Die onderwerp %s bestaan alreeds. Moet liedere met die onderwerp %s die bestaande onderwerp %s gebruik? The book %s already exists. Would you like to make songs with book %s use the existing book %s? - + Die boek %s bestaan reeds. Moed liedere met die doek %s gebruik maak van bestaande boek %s? @@ -4646,12 +4863,12 @@ The encoding is responsible for the correct character representation. Update service from song edit - + Opdateer diens van lied-redigering Add missing songs when opening service - + Voer vermisde liedere by wanneer die diens oopgemaak word diff --git a/resources/i18n/de.ts b/resources/i18n/de.ts index e3a09b405..9b628a52d 100644 --- a/resources/i18n/de.ts +++ b/resources/i18n/de.ts @@ -154,28 +154,28 @@ Do you want to continue anyway? BibleDB.Wizard - + Importing testaments... %s - + Importing testaments... done. - + Importing books... %s - + Importing verses from %s... Importing verses from <book name>... - + Importing verses... done. @@ -517,7 +517,7 @@ Changes do not affect verses already in the service. Übersetzung bereits vorhanden - + Your Bible import failed. Der Bibelimport ist fehlgeschlagen. @@ -537,12 +537,12 @@ Changes do not affect verses already in the service. Diese Bibel existiert bereit. Bitte geben Sie einen anderen Übersetzungsnamen an oder löschen Sie zuerst die Existierende. - + Starting Registering bible... Starte Erfassung der Bibel... - + Registered bible. Please note, that verses will be downloaded on demand and thus an internet connection is required. Erfassung abgeschlossen. @@ -666,7 +666,7 @@ Daher ist eine Verbindung zum Internet erforderlich. BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... %s %s wird importiert... @@ -675,12 +675,12 @@ Daher ist eine Verbindung zum Internet erforderlich. BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... Kodierung wird ermittelt (dies kann etwas dauern)... - + Importing %s %s... Importing <book name> <chapter>... %s %s wird importiert... @@ -1080,17 +1080,17 @@ Erkunden Sie OpenLP: http://openlp.org/ OpenLP wird von freiwiligen Helfern programmiert und gewartet. Wenn Sie sich mehr freie christliche Programme wünschen, ermutigen wir Sie, sich doch sich zu beteiligen und den Knopf weiter unten nutzen. - + Credits Danksagungen - + License Lizenz - + Contribute Mitmachen @@ -1100,7 +1100,25 @@ OpenLP wird von freiwiligen Helfern programmiert und gewartet. Wenn Sie sich meh build %s - + + Copyright © 2004-2011 Raoul Snyman +Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, +Meinert Jordan, Andreas Preikschat, Christian Richter, Philip +Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund + + + + + 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 below for more details. + + + + Project Lead %s @@ -1116,6 +1134,35 @@ Testers Packagers %s +Translators + Afrikaans (af) + %s + German (de) + %s + English, United Kingdom (en_GB) + %s + English, South Africa (en_ZA) + %s + Estonian (et) + %s + French (fr) + %s + Hungarian (hu) + %s + Japanese (ja) + %s + Norwegian Bokmål (nb) + %s + Dutch (nl) + %s + Portuguese, Brazil (pt_BR) + %s + Russian (ru) + %s + +Documentation + %s + Built With Python: http://www.python.org/ Qt4: http://qt.nokia.com/ @@ -1135,24 +1182,6 @@ Final Credit He has set us free. - - - Copyright © 2004-2011 Raoul Snyman -Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, -Meinert Jordan, Andreas Preikschat, Christian Richter, Philip -Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund - - - - - 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 below for more details. - - OpenLP.AdvancedTab @@ -1403,6 +1432,157 @@ Version: %s Datei kopieren + + OpenLP.FirstTimeLanguageForm + + + Initial Set up Language + + + + + Select the language you'd like to use in OpenLP. + + + + + OpenLP.FirstTimeWizard + + + Songs + Lieder + + + + Bibles + Bibeln + + + + Themes + + + + + Starting Updates + + + + + Downloading %s + + + + + First Time Wizard + + + + + Welcome to the First Time Wizard + + + + + This wizard will help you to configure OpenLP for initial use . Click the next button below to start the process of selection your initial options. + + + + + Activate required Plugins + + + + + Select the Plugins you wish to use. + + + + + Custom Text + + + + + Bible + Bibeltext + + + + Images + Bilder + + + + Presentations + Präsentationen + + + + Media (Audio and Video) + + + + + Allow remote access + + + + + Monitor Song Usage + + + + + Allow Alerts + + + + + Download Samples from OpenLP.org + + + + + Select samples to downlaod and install for use. + + + + + No Internet connection found so unable to download any default files. + + + + + Download Example Files + + + + + Default Settings + + + + + Set up default values to be used by OpenLP + + + + + Default output display + + + + + Select the default Theme + + + + + Press finish to apply all your changes and start OpenLP + + + OpenLP.GeneralTab @@ -1524,12 +1704,12 @@ Version: %s OpenLP.LanguageManager - + Language Sprache - + Please restart OpenLP to use your new language setting. Bitte starten Sie OpenLP neu, um die neue Spracheinstellung zu verwenden. @@ -1890,27 +2070,27 @@ Version: %s Die Ansicht für den Live-Betrieb optimieren. - + OpenLP Version Updated Neue OpenLP Version verfügbar - + OpenLP Main Display Blanked Hauptbildschirm abgedunkelt - + The Main Display has been blanked out Die Projektion ist momentan nicht aktiv. - + Default Theme: %s Standarddesign: %s - + Version %s of OpenLP is now available for download (you are currently running version %s). You can download the latest version from http://openlp.org/. @@ -1930,12 +2110,12 @@ Sie können die letzte Version auf http://openlp.org abrufen. &Tastenkürzel einrichten... - + Close OpenLP OpenLP beenden - + Are you sure you want to close OpenLP? Sind Sie sicher, dass OpenLP beendet werden soll? @@ -2258,17 +2438,17 @@ Der Inhalt ist nicht in UTF-8 kodiert. Die Datei ist keine gültige OpenLP Ablaufdatei. - + Missing Display Handler Fehlende Anzeigesteuerung - + Your item cannot be displayed as there is no handler to display it Dieses Element kann nicht angezeigt werden, da es keine Steuerung dafür gibt. - + Your item cannot be displayed as the plugin required to display it is missing or inactive Dieses Element kann nicht angezeigt werden, da die zugehörige Erweiterung fehlt oder inaktiv ist. @@ -2425,57 +2605,57 @@ Der Inhalt ist nicht in UTF-8 kodiert. OpenLP.SlideController - + Move to previous Vorherige Seite anzeigen - + Move to next Nächste Seite anzeigen - + Hide Verbergen - + Move to live Zur Live Ansicht verschieben - + Start continuous loop Endlosschleife starten - + Stop continuous loop Endlosschleife stoppen - + Delay between slides in seconds Pause zwischen den Folien in Sekunden - + Start playing media Abspielen - + Go To Gehe zu - + Edit and reload song preview Bearbeiten und Liedvorschau aktualisieren - + Blank Screen Anzeige abdunkeln @@ -2485,32 +2665,32 @@ Der Inhalt ist nicht in UTF-8 kodiert. Design leeren - + Show Desktop Desktop anzeigen - + Previous Slide - + Next Slide - + Previous Service - + Next Service - + Escape Item @@ -2632,69 +2812,69 @@ Der Inhalt ist nicht in UTF-8 kodiert. Als &globalen Standard setzen - + %s (default) %s (standard) - + You must select a theme to edit. Zum Bearbeiten muss ein Design ausgewählt sein. - + You are unable to delete the default theme. Es ist nicht möglich das Standarddesign zu entfernen. - + You have not selected a theme. Es ist kein Design ausgewählt. - + Save Theme - (%s) Speicherort für »%s« - + Theme Exported Design exportiert - + Your theme has been successfully exported. Das Design wurde erfolgreich exportiert. - + Theme Export Failed Designexport fehlgeschlagen - + Your theme could not be exported due to an error. Dieses Design konnte aufgrund eines Fehlers nicht exportiert werden. - + Select Theme Import File OpenLP Designdatei importieren - + File is not a valid theme. The content encoding is not UTF-8. Die Datei ist keine gültige OpenLP Designdatei. Sie ist nicht in UTF-8 kodiert. - + File is not a valid theme. Diese Datei ist keine gültige OpenLP Designdatei. - + Theme %s is used in the %s plugin. Das Design %s wird in der %s Erweiterung benutzt. @@ -2714,42 +2894,42 @@ Sie ist nicht in UTF-8 kodiert. Design &exportieren - + You must select a theme to rename. Es ist kein Design zur Umbenennung ausgewählt. - + Rename Confirmation Umbenennung bestätigen - + Rename %s theme? Soll das Design »%s« wirklich umbenennt werden? - + You must select a theme to delete. Es ist kein Design zum Löschen ausgewählt. - + Delete Confirmation Löschbestätigung - + Delete %s theme? Sott das Design »%s« wirklich gelöscht werden? - + Validation Error - + A theme with this name already exists. Ein Design mit diesem Namen existiert bereits. @@ -2779,7 +2959,7 @@ Sie ist nicht in UTF-8 kodiert. - + OpenLP Themes (*.theme *.otz) OpenLP Designs (*.theme *.otz) @@ -4423,7 +4603,7 @@ Usually you are fine with the preselected choice. Liedtext - + Delete Song(s)? Lied(er) löschen? @@ -4438,7 +4618,7 @@ Usually you are fine with the preselected choice. Ganzes Lied - + Are you sure you want to delete the %n selected song(s)? Sind Sie sicher, dass das Lied gelöscht werden soll? diff --git a/resources/i18n/en.ts b/resources/i18n/en.ts index 0dcfa3e8b..11ff4d7f3 100644 --- a/resources/i18n/en.ts +++ b/resources/i18n/en.ts @@ -153,28 +153,28 @@ Do you want to continue anyway? BibleDB.Wizard - + Importing testaments... %s - + Importing testaments... done. - + Importing books... %s - + Importing verses from %s... Importing verses from <book name>... - + Importing verses... done. @@ -529,7 +529,7 @@ Changes do not affect verses already in the service. - + Your Bible import failed. @@ -539,12 +539,12 @@ Changes do not affect verses already in the service. - + Starting Registering bible... - + Registered bible. Please note, that verses will be downloaded on demand and thus an internet connection is required. @@ -661,7 +661,7 @@ demand and thus an internet connection is required. BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... @@ -670,12 +670,12 @@ demand and thus an internet connection is required. BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... - + Importing %s %s... Importing <book name> <chapter>... @@ -1068,17 +1068,17 @@ OpenLP is written and maintained by volunteers. If you would like to see more fr - + Credits - + License - + Contribute @@ -1088,7 +1088,25 @@ OpenLP is written and maintained by volunteers. If you would like to see more fr - + + Copyright © 2004-2011 Raoul Snyman +Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, +Meinert Jordan, Andreas Preikschat, Christian Richter, Philip +Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund + + + + + 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 below for more details. + + + + Project Lead %s @@ -1104,6 +1122,35 @@ Testers Packagers %s +Translators + Afrikaans (af) + %s + German (de) + %s + English, United Kingdom (en_GB) + %s + English, South Africa (en_ZA) + %s + Estonian (et) + %s + French (fr) + %s + Hungarian (hu) + %s + Japanese (ja) + %s + Norwegian Bokmål (nb) + %s + Dutch (nl) + %s + Portuguese, Brazil (pt_BR) + %s + Russian (ru) + %s + +Documentation + %s + Built With Python: http://www.python.org/ Qt4: http://qt.nokia.com/ @@ -1123,24 +1170,6 @@ Final Credit He has set us free. - - - Copyright © 2004-2011 Raoul Snyman -Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, -Meinert Jordan, Andreas Preikschat, Christian Richter, Philip -Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund - - - - - 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 below for more details. - - OpenLP.AdvancedTab @@ -1389,6 +1418,157 @@ Version: %s + + OpenLP.FirstTimeLanguageForm + + + Initial Set up Language + + + + + Select the language you'd like to use in OpenLP. + + + + + OpenLP.FirstTimeWizard + + + Songs + + + + + Bibles + + + + + Themes + + + + + Starting Updates + + + + + Downloading %s + + + + + First Time Wizard + + + + + Welcome to the First Time Wizard + + + + + This wizard will help you to configure OpenLP for initial use . Click the next button below to start the process of selection your initial options. + + + + + Activate required Plugins + + + + + Select the Plugins you wish to use. + + + + + Custom Text + + + + + Bible + + + + + Images + + + + + Presentations + + + + + Media (Audio and Video) + + + + + Allow remote access + + + + + Monitor Song Usage + + + + + Allow Alerts + + + + + Download Samples from OpenLP.org + + + + + Select samples to downlaod and install for use. + + + + + No Internet connection found so unable to download any default files. + + + + + Download Example Files + + + + + Default Settings + + + + + Set up default values to be used by OpenLP + + + + + Default output display + + + + + Select the default Theme + + + + + Press finish to apply all your changes and start OpenLP + + + OpenLP.GeneralTab @@ -1510,12 +1690,12 @@ Version: %s OpenLP.LanguageManager - + Language - + Please restart OpenLP to use your new language setting. @@ -1876,29 +2056,29 @@ Version: %s - + Version %s of OpenLP is now available for download (you are currently running version %s). You can download the latest version from http://openlp.org/. - + OpenLP Version Updated - + OpenLP Main Display Blanked - + The Main Display has been blanked out - + Default Theme: %s @@ -1914,12 +2094,12 @@ You can download the latest version from http://openlp.org/. - + Close OpenLP - + Are you sure you want to close OpenLP? @@ -2246,17 +2426,17 @@ The content encoding is not UTF-8. - + Missing Display Handler - + Your item cannot be displayed as there is no handler to display it - + Your item cannot be displayed as the plugin required to display it is missing or inactive @@ -2408,57 +2588,57 @@ The content encoding is not UTF-8. OpenLP.SlideController - + Move to previous - + Move to next - + Hide - + Move to live - + Edit and reload song preview - + Start continuous loop - + Stop continuous loop - + Delay between slides in seconds - + Start playing media - + Go To - + Blank Screen @@ -2468,32 +2648,32 @@ The content encoding is not UTF-8. - + Show Desktop - + Previous Slide - + Next Slide - + Previous Service - + Next Service - + Escape Item @@ -2640,68 +2820,68 @@ The content encoding is not UTF-8. - + %s (default) - + You must select a theme to edit. - + You are unable to delete the default theme. - + Theme %s is used in the %s plugin. - + You have not selected a theme. - + Save Theme - (%s) - + Theme Exported - + Your theme has been successfully exported. - + Theme Export Failed - + Your theme could not be exported due to an error. - + Select Theme Import File - + File is not a valid theme. The content encoding is not UTF-8. - + File is not a valid theme. @@ -2721,47 +2901,47 @@ The content encoding is not UTF-8. - + You must select a theme to rename. - + Rename Confirmation - + Rename %s theme? - + You must select a theme to delete. - + Delete Confirmation - + Delete %s theme? - + Validation Error - + A theme with this name already exists. - + OpenLP Themes (*.theme *.otz) @@ -4404,7 +4584,7 @@ The encoding is responsible for the correct character representation. - + Delete Song(s)? @@ -4419,7 +4599,7 @@ The encoding is responsible for the correct character representation. - + Are you sure you want to delete the %n selected song(s)? diff --git a/resources/i18n/en_GB.ts b/resources/i18n/en_GB.ts index 9f8f7f560..8ed8984a9 100644 --- a/resources/i18n/en_GB.ts +++ b/resources/i18n/en_GB.ts @@ -153,28 +153,28 @@ Do you want to continue anyway? BibleDB.Wizard - + Importing testaments... %s - + Importing testaments... done. - + Importing books... %s - + Importing verses from %s... Importing verses from <book name>... - + Importing verses... done. @@ -520,7 +520,7 @@ Changes do not affect verses already in the service. Bible Exists - + Your Bible import failed. Your Bible import failed. @@ -535,12 +535,12 @@ Changes do not affect verses already in the service. This Bible already exists. Please import a different Bible or first delete the existing one. - + Starting Registering bible... - + Registered bible. Please note, that verses will be downloaded on demand and thus an internet connection is required. @@ -662,7 +662,7 @@ demand and thus an internet connection is required. BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... @@ -671,12 +671,12 @@ demand and thus an internet connection is required. BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... - + Importing %s %s... Importing <book name> <chapter>... @@ -1075,17 +1075,17 @@ Find out more about OpenLP: http://openlp.org/ OpenLP is written and maintained by volunteers. If you would like to see more free Christian software being written, please consider contributing by using the button below. - + Credits Credits - + License Licence - + Contribute Contribute @@ -1095,7 +1095,25 @@ OpenLP is written and maintained by volunteers. If you would like to see more fr build %s - + + Copyright © 2004-2011 Raoul Snyman +Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, +Meinert Jordan, Andreas Preikschat, Christian Richter, Philip +Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund + + + + + 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 below for more details. + + + + Project Lead %s @@ -1111,6 +1129,35 @@ Testers Packagers %s +Translators + Afrikaans (af) + %s + German (de) + %s + English, United Kingdom (en_GB) + %s + English, South Africa (en_ZA) + %s + Estonian (et) + %s + French (fr) + %s + Hungarian (hu) + %s + Japanese (ja) + %s + Norwegian Bokmål (nb) + %s + Dutch (nl) + %s + Portuguese, Brazil (pt_BR) + %s + Russian (ru) + %s + +Documentation + %s + Built With Python: http://www.python.org/ Qt4: http://qt.nokia.com/ @@ -1130,24 +1177,6 @@ Final Credit He has set us free. - - - Copyright © 2004-2011 Raoul Snyman -Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, -Meinert Jordan, Andreas Preikschat, Christian Richter, Philip -Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund - - - - - 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 below for more details. - - OpenLP.AdvancedTab @@ -1396,6 +1425,157 @@ Version: %s + + OpenLP.FirstTimeLanguageForm + + + Initial Set up Language + + + + + Select the language you'd like to use in OpenLP. + + + + + OpenLP.FirstTimeWizard + + + Songs + + + + + Bibles + + + + + Themes + + + + + Starting Updates + + + + + Downloading %s + + + + + First Time Wizard + + + + + Welcome to the First Time Wizard + + + + + This wizard will help you to configure OpenLP for initial use . Click the next button below to start the process of selection your initial options. + + + + + Activate required Plugins + + + + + Select the Plugins you wish to use. + + + + + Custom Text + + + + + Bible + + + + + Images + + + + + Presentations + + + + + Media (Audio and Video) + + + + + Allow remote access + + + + + Monitor Song Usage + + + + + Allow Alerts + + + + + Download Samples from OpenLP.org + + + + + Select samples to downlaod and install for use. + + + + + No Internet connection found so unable to download any default files. + + + + + Download Example Files + + + + + Default Settings + + + + + Set up default values to be used by OpenLP + + + + + Default output display + + + + + Select the default Theme + + + + + Press finish to apply all your changes and start OpenLP + + + OpenLP.GeneralTab @@ -1517,12 +1697,12 @@ Version: %s OpenLP.LanguageManager - + Language Language - + Please restart OpenLP to use your new language setting. Please restart OpenLP to use your new language setting. @@ -1883,7 +2063,7 @@ Version: %s Set the view mode to Live. - + Version %s of OpenLP is now available for download (you are currently running version %s). You can download the latest version from http://openlp.org/. @@ -1891,22 +2071,22 @@ You can download the latest version from http://openlp.org/. You can download the latest version from http://openlp.org/. - + OpenLP Version Updated OpenLP Version Updated - + OpenLP Main Display Blanked OpenLP Main Display Blanked - + The Main Display has been blanked out The Main Display has been blanked out - + Default Theme: %s Default Theme: %s @@ -1922,12 +2102,12 @@ You can download the latest version from http://openlp.org/. - + Close OpenLP - + Are you sure you want to close OpenLP? @@ -2250,17 +2430,17 @@ The content encoding is not UTF-8. File is not a valid service. - + Missing Display Handler Missing Display Handler - + Your item cannot be displayed as there is no handler to display it Your item cannot be displayed as there is no handler to display it - + Your item cannot be displayed as the plugin required to display it is missing or inactive Your item cannot be displayed as the plugin required to display it is missing or inactive @@ -2417,57 +2597,57 @@ The content encoding is not UTF-8. OpenLP.SlideController - + Move to previous Move to previous - + Move to next Move to next - + Hide Hide - + Move to live Move to live - + Start continuous loop Start continuous loop - + Stop continuous loop Stop continuous loop - + Delay between slides in seconds Delay between slides in seconds - + Start playing media Start playing media - + Go To Go To - + Edit and reload song preview Edit and reload song preview - + Blank Screen @@ -2477,32 +2657,32 @@ The content encoding is not UTF-8. - + Show Desktop - + Previous Slide - + Next Slide - + Previous Service - + Next Service - + Escape Item @@ -2649,69 +2829,69 @@ The content encoding is not UTF-8. Set As &Global Default - + %s (default) %s (default) - + You must select a theme to edit. You must select a theme to edit. - + You are unable to delete the default theme. You are unable to delete the default theme. - + You have not selected a theme. You have not selected a theme. - + Save Theme - (%s) Save Theme - (%s) - + Theme Exported Theme Exported - + Your theme has been successfully exported. Your theme has been successfully exported. - + Theme Export Failed Theme Export Failed - + Your theme could not be exported due to an error. Your theme could not be exported due to an error. - + Select Theme Import File Select Theme Import File - + File is not a valid theme. The content encoding is not UTF-8. File is not a valid theme. The content encoding is not UTF-8. - + File is not a valid theme. File is not a valid theme. - + Theme %s is used in the %s plugin. Theme %s is used in the %s plugin. @@ -2731,47 +2911,47 @@ The content encoding is not UTF-8. - + You must select a theme to rename. - + Rename Confirmation - + Rename %s theme? - + You must select a theme to delete. - + Delete Confirmation - + Delete %s theme? - + Validation Error - + A theme with this name already exists. - + OpenLP Themes (*.theme *.otz) @@ -4414,7 +4594,7 @@ The encoding is responsible for the correct character representation. Lyrics - + Delete Song(s)? Delete Song(s)? @@ -4429,7 +4609,7 @@ The encoding is responsible for the correct character representation. - + Are you sure you want to delete the %n selected song(s)? diff --git a/resources/i18n/en_ZA.ts b/resources/i18n/en_ZA.ts index 3b6dffb0d..bb54aba46 100644 --- a/resources/i18n/en_ZA.ts +++ b/resources/i18n/en_ZA.ts @@ -155,28 +155,28 @@ Do you want to continue anyway? BibleDB.Wizard - + Importing testaments... %s Importing testaments... %s - + Importing testaments... done. Importing testaments... done. - + Importing books... %s Importing books... %s - + Importing verses from %s... Importing verses from <book name>... Importing verses from %s... - + Importing verses... done. Importing verses... done. @@ -530,7 +530,7 @@ Changes do not affect verses already in the service. Bible Exists - + Your Bible import failed. Your Bible import failed. @@ -545,12 +545,12 @@ Changes do not affect verses already in the service. This Bible already exists. Please import a different Bible or first delete the existing one. - + Starting Registering bible... Starting Registering bible... - + Registered bible. Please note, that verses will be downloaded on demand and thus an internet connection is required. Registered bible. Please note, that verses will be downloaded on @@ -570,37 +570,37 @@ demand and thus an internet connection is required. Bibleserver - + Bibleserver Bible file: - + Bible file: Testaments file: - + Testaments file: Books file: - + Books file: Verses file: - + Verses file: You have not specified a testaments file. Do you want to proceed with the import? - + You have not specified a testaments file. Do you want to proceed with the import? openlp.org 1.x Bible Files - + openlp.org 1.x Bible Files @@ -668,30 +668,30 @@ demand and thus an internet connection is required. Scripture Reference - + Scripture Reference BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... - + Importing %s %s... BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... - + Detecting encoding (this may take a few minutes)... - + Importing %s %s... Importing <book name> <chapter>... - + Importing %s %s... @@ -905,7 +905,7 @@ demand and thus an internet connection is required. Select Attachment - + Select Attachment @@ -928,23 +928,24 @@ demand and thus an internet connection is required. Missing Image(s) - + Missing Image(s) The following image(s) no longer exist: %s - + The following image(s) no longer exist: %s The following image(s) no longer exist: %s Do you want to add the other images anyway? - + The following image(s) no longer exist: %s +Do you want to add the other images anyway? There was a problem replacing your background, the image file "%s" no longer exists. - + There was a problem replacing your background, the image file "%s" no longer exists. @@ -1023,12 +1024,12 @@ Do you want to add the other images anyway? Missing Media File - + Missing Media File The file %s no longer exists. - + The file %s no longer exists. @@ -1038,12 +1039,12 @@ Do you want to add the other images anyway? There was a problem replacing your background, the media file "%s" no longer exists. - + There was a problem replacing your background, the media file "%s" no longer exists. Videos (%s);;Audio (%s);;%s (*) - + Videos (%s);;Audio (%s);;%s (*) @@ -1087,17 +1088,17 @@ Find out more about OpenLP: http://openlp.org/ OpenLP is written and maintained by volunteers. If you would like to see more free Christian software being written, please consider contributing by using the button below. - + Credits Credits - + License License - + Contribute Contribute @@ -1107,7 +1108,28 @@ OpenLP is written and maintained by volunteers. If you would like to see more fr build %s - + + Copyright © 2004-2011 Raoul Snyman +Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, +Meinert Jordan, Andreas Preikschat, Christian Richter, Philip +Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund + Copyright © 2004-2011 Raoul Snyman +Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, +Meinert Jordan, Andreas Preikschat, Christian Richter, Philip +Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund + + + + 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 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 below for more details. + 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 below for more details. + + + Project Lead %s @@ -1123,6 +1145,35 @@ Testers Packagers %s +Translators + Afrikaans (af) + %s + German (de) + %s + English, United Kingdom (en_GB) + %s + English, South Africa (en_ZA) + %s + Estonian (et) + %s + French (fr) + %s + Hungarian (hu) + %s + Japanese (ja) + %s + Norwegian Bokmål (nb) + %s + Dutch (nl) + %s + Portuguese, Brazil (pt_BR) + %s + Russian (ru) + %s + +Documentation + %s + Built With Python: http://www.python.org/ Qt4: http://qt.nokia.com/ @@ -1142,24 +1193,6 @@ Final Credit He has set us free. - - - Copyright © 2004-2011 Raoul Snyman -Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, -Meinert Jordan, Andreas Preikschat, Christian Richter, Philip -Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund - - - - - 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 below for more details. - - OpenLP.AdvancedTab @@ -1191,37 +1224,37 @@ Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frod Enable application exit confirmation - + Enable application exit confirmation Mouse Cursor - + Mouse Cursor Hide mouse cursor when over display window - + Hide mouse cursor when over display window Default Image - + Default Image Background color: - Background color: + Background colour: Image file: - + Image file: Open File - + Open File @@ -1229,52 +1262,52 @@ Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frod Edit Selection - + Edit Selection Update - + Update Description - + Description Tag - + Tag Start tag - + Start tag End tag - + End tag Default - + Default Tag id - + Tag Id Start Html - + Start HTML End Html - + End HTML @@ -1282,17 +1315,17 @@ Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frod Update Error - + Update Error Tag "n" already defined. - + Tag "n" already defined. Tag %s already defined. - + Tag %s already defined. @@ -1310,28 +1343,29 @@ Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frod Send E-Mail - + Send E-Mail Save to File - + Save to File Please enter a description of what you were doing to cause this error (Minimum 20 characters) - + Please enter a description of what you were doing to cause this error +(Minimum 20 characters) Attach File - + Attach File Description characters to enter : %s - + Description characters to enter : %s @@ -1340,17 +1374,18 @@ Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frod Platform: %s - + Platform: %s + Save Crash Report - + Save Crash Report Text files (*.txt *.log *.text) - + Text files (*.txt *.log *.text) @@ -1368,7 +1403,20 @@ Version: %s --- Library Versions --- %s - + **OpenLP Bug Report** +Version: %s + +--- Details of the Exception. --- + +%s + + --- Exception Traceback --- +%s +--- System information --- +%s +--- Library Versions --- +%s + @@ -1387,7 +1435,20 @@ Version: %s %s Please add the information that bug reports are favoured written in English. - + *OpenLP Bug Report* +Version: %s + +--- Details of the Exception. --- + +%s + + --- Exception Traceback --- +%s +--- System information --- +%s +--- Library Versions --- +%s + @@ -1405,6 +1466,157 @@ Version: %s File Copy + File Copy + + + + OpenLP.FirstTimeLanguageForm + + + Initial Set up Language + + + + + Select the language you'd like to use in OpenLP. + + + + + OpenLP.FirstTimeWizard + + + Songs + + + + + Bibles + + + + + Themes + + + + + Starting Updates + + + + + Downloading %s + + + + + First Time Wizard + + + + + Welcome to the First Time Wizard + + + + + This wizard will help you to configure OpenLP for initial use . Click the next button below to start the process of selection your initial options. + + + + + Activate required Plugins + + + + + Select the Plugins you wish to use. + + + + + Custom Text + + + + + Bible + + + + + Images + + + + + Presentations + + + + + Media (Audio and Video) + + + + + Allow remote access + + + + + Monitor Song Usage + + + + + Allow Alerts + + + + + Download Samples from OpenLP.org + + + + + Select samples to downlaod and install for use. + + + + + No Internet connection found so unable to download any default files. + + + + + Download Example Files + + + + + Default Settings + + + + + Set up default values to be used by OpenLP + + + + + Default output display + + + + + Select the default Theme + + + + + Press finish to apply all your changes and start OpenLP @@ -1523,18 +1735,18 @@ Version: %s Check for updates to OpenLP - + Check for updates to OpenLP OpenLP.LanguageManager - + Language Language - + Please restart OpenLP to use your new language setting. Please restart OpenLP to use your new language setting. @@ -1544,7 +1756,7 @@ Version: %s OpenLP Display - + OpenLP Display @@ -1895,27 +2107,27 @@ Version: %s Set the view mode to Live. - + OpenLP Version Updated OpenLP Version Updated - + OpenLP Main Display Blanked OpenLP Main Display Blanked - + The Main Display has been blanked out The Main Display has been blanked out - + Default Theme: %s Default Theme: %s - + Version %s of OpenLP is now available for download (you are currently running version %s). You can download the latest version from http://openlp.org/. @@ -1935,39 +2147,39 @@ You can download the latest version from http://openlp.org/. Configure &Shortcuts... - + Close OpenLP - + Close OpenLP - + Are you sure you want to close OpenLP? - + Are you sure you want to close OpenLP? Print the current Service Order. - + Print the current Service Order. Ctrl+P - + Ctrl+P Open &Data Folder... - + Open &Data Folder... Open the folder where songs, bibles and other data resides. - + Open the folder where songs, Bibles and other data resides. &Configure Display Tags - + &Configure Display Tags @@ -2061,12 +2273,12 @@ You can download the latest version from http://openlp.org/. Fit Page - + Fit Page Fit Width - + Fit Width @@ -2074,62 +2286,62 @@ You can download the latest version from http://openlp.org/. Options - + Options Close - + Close Copy - + Copy Copy as HTML - + Copy as HTML Zoom In - + Zoom In Zoom Out - + Zoom Out Zoom Original - + Zoom Original Other Options - + Other Options Include slide text if available - + Include slide text if available Include service item notes - + Include service item notes Include play length of media items - + Include play length of media items Service Order Sheet - + Service Order Sheet @@ -2137,12 +2349,12 @@ You can download the latest version from http://openlp.org/. Screen - + Screen primary - + primary @@ -2263,17 +2475,17 @@ The content encoding is not UTF-8. File is not a valid service. - + Missing Display Handler Missing Display Handler - + Your item cannot be displayed as there is no handler to display it Your item cannot be displayed as there is no handler to display it - + Your item cannot be displayed as the plugin required to display it is missing or inactive Your item cannot be displayed as the plugin required to display it is missing or inactive @@ -2300,67 +2512,67 @@ The content encoding is not UTF-8. Open File - + Open File OpenLP Service Files (*.osz) - + OpenLP Service Files (*.osz) Moves the selection down the window. - + Moves the selection down the window. Move up - + Move up Moves the selection up the window. - + Moves the selection up the window. Go Live - + Go Live Send the selected item to Live. - + Send the selected item to Live. Modified Service - + Modified Service Notes: - + Notes: &Start Time - + &Start Time Show &Preview - + Show &Preview Show &Live - + Show &Live The current service has been modified. Would you like to save this service? - + The current service has been modified. Would you like to save this service? @@ -2424,63 +2636,63 @@ The content encoding is not UTF-8. Alternate - + Alternate OpenLP.SlideController - + Move to previous Move to previous - + Move to next Move to next - + Hide Hide - + Move to live Move to live - + Start continuous loop Start continuous loop - + Stop continuous loop Stop continuous loop - + Delay between slides in seconds Delay between slides in seconds - + Start playing media Start playing media - + Go To Go To - + Edit and reload song preview Edit and reload song preview - + Blank Screen Blank Screen @@ -2490,34 +2702,34 @@ The content encoding is not UTF-8. Blank to Theme - + Show Desktop Show Desktop - + Previous Slide - + Previous Slide - + Next Slide - + Next Slide - + Previous Service - + Previous Service - + Next Service - + Next Service - + Escape Item - + Escape Item @@ -2538,32 +2750,32 @@ The content encoding is not UTF-8. Item Start Time - + Item Start Time Hours: - + Hours: h - + h m - + m Minutes: - + Minutes: Seconds: - + Seconds: @@ -2662,69 +2874,69 @@ The content encoding is not UTF-8. Set As &Global Default - + %s (default) %s (default) - + You must select a theme to edit. You must select a theme to edit. - + You are unable to delete the default theme. You are unable to delete the default theme. - + You have not selected a theme. You have not selected a theme. - + Save Theme - (%s) Save Theme - (%s) - + Theme Exported Theme Exported - + Your theme has been successfully exported. Your theme has been successfully exported. - + Theme Export Failed Theme Export Failed - + Your theme could not be exported due to an error. Your theme could not be exported due to an error. - + Select Theme Import File Select Theme Import File - + File is not a valid theme. The content encoding is not UTF-8. File is not a valid theme. The content encoding is not UTF-8. - + File is not a valid theme. File is not a valid theme. - + Theme %s is used in the %s plugin. Theme %s is used in the %s plugin. @@ -2744,49 +2956,49 @@ The content encoding is not UTF-8. &Export Theme - + You must select a theme to rename. - + You must select a theme to rename. - + Rename Confirmation - + Rename Confirmation - + Rename %s theme? - + Rename %s theme? - + You must select a theme to delete. - + You must select a theme to delete. - + Delete Confirmation - + Delete Confirmation - + Delete %s theme? - + Delete %s theme? - + Validation Error - + Validation Error - + A theme with this name already exists. - + A theme with this name already exists. - + OpenLP Themes (*.theme *.otz) - + OpenLP Themes (*.theme *.otz) @@ -2829,7 +3041,7 @@ The content encoding is not UTF-8. Color: - Color: + Colour: @@ -2949,22 +3161,22 @@ The content encoding is not UTF-8. Output Area Locations - + Output Area Locations Allows you to change and move the main and footer areas. - + Allows you to change and move the main and footer areas. &Main Area - + &Main Area &Use default location - + &Use default location @@ -2999,37 +3211,37 @@ The content encoding is not UTF-8. Save and Preview - + Save and Preview View the theme and save it replacing the current one or change the name to create a new theme - + View the theme and save it replacing the current one or change the name to create a new theme Theme name: - + Theme name: This wizard will help you to create and edit your themes. Click the next button below to start the process by setting up your background. - + This wizard will help you to create and edit your themes. Click the next button below to start the process by setting up your background. Transitions: - + Transitions: &Footer Area - + &Footer Area Edit Theme - %s - + Edit Theme - %s @@ -3090,17 +3302,17 @@ The content encoding is not UTF-8. Delete the selected item. - + Delete the selected item. Move selection up one position. - + Move selection up one position. Move selection down one position. - + Move selection down one position. @@ -3135,7 +3347,7 @@ The content encoding is not UTF-8. Length %s - + Length %s @@ -3150,7 +3362,7 @@ The content encoding is not UTF-8. New - + New @@ -3185,7 +3397,7 @@ The content encoding is not UTF-8. Reset Background - + Reset Background @@ -3205,12 +3417,12 @@ The content encoding is not UTF-8. Start %s - + Start %s &Vertical Align: - + &Vertical Align: @@ -3240,7 +3452,7 @@ The content encoding is not UTF-8. Cancel - + Cancel @@ -3250,12 +3462,12 @@ The content encoding is not UTF-8. Empty Field - + Empty Field Export - + Export @@ -3271,12 +3483,12 @@ The content encoding is not UTF-8. Live Background Error - + Live Background Error Live Panel - + Live Panel @@ -3287,19 +3499,19 @@ The content encoding is not UTF-8. No File Selected Singular - + No File Selected No Files Selected Plural - + No Files Selected No Item Selected Singular - + No Item Selected @@ -3315,12 +3527,12 @@ The content encoding is not UTF-8. Preview Panel - + Preview Panel Print Service Order - + Print Service Order @@ -3363,7 +3575,7 @@ The content encoding is not UTF-8. Version - + Version @@ -3393,7 +3605,7 @@ The content encoding is not UTF-8. Select the import format and the location to import from. - + Select the import format and the location to import from. @@ -3403,7 +3615,7 @@ The content encoding is not UTF-8. Open %s File - + Open %s File @@ -3424,7 +3636,7 @@ The content encoding is not UTF-8. You need to specify at least one %s file to import from. A file type e.g. OpenSong - + You need to specify at least one %s file to import from. @@ -3434,7 +3646,7 @@ The content encoding is not UTF-8. Welcome to the Song Export Wizard - + Welcome to the Song Export Wizard @@ -3445,7 +3657,7 @@ The content encoding is not UTF-8. Author Singular - + Author @@ -3494,7 +3706,7 @@ The content encoding is not UTF-8. Configure Display Tags - + Configure Display Tags @@ -3507,27 +3719,27 @@ The content encoding is not UTF-8. Load a new Presentation - + Load a new Presentation Delete the selected Presentation - + Delete the selected Presentation Preview the selected Presentation - + Preview the selected Presentation Send the selected Presentation live - + Send the selected Presentation live Add the selected Presentation to the service - + Add the selected Presentation to the service @@ -3588,22 +3800,22 @@ The content encoding is not UTF-8. Presentations (%s) - + Presentations (%s) Missing Presentation - + Missing Presentation The Presentation %s no longer exists. - + The Presentation %s no longer exists. The Presentation %s is incomplete, please reload. - + The Presentation %s is incomplete, please reload. @@ -3621,7 +3833,7 @@ The content encoding is not UTF-8. %s (unavailable) - + %s (unavailable) @@ -3635,7 +3847,7 @@ The content encoding is not UTF-8. Remote name singular - + Remote @@ -3647,7 +3859,7 @@ The content encoding is not UTF-8. Remote container title - + Remote @@ -3714,19 +3926,19 @@ The content encoding is not UTF-8. SongUsage name singular - + SongUsage SongUsage name plural - + SongUsage SongUsage container title - + SongUsage @@ -3749,12 +3961,12 @@ The content encoding is not UTF-8. Deletion Successful - + Deletion Successful All requested data has been deleted successfully. - + All requested data has been deleted successfully. @@ -3787,19 +3999,21 @@ The content encoding is not UTF-8. usage_detail_%s_%s.txt - + usage_detail_%s_%s.txt Report Creation - + Report Creation Report %s has been successfully created. - + Report +%s +has been successfully created. @@ -3822,47 +4036,47 @@ has been successfully created. &Re-index Songs - + &Re-index Songs Re-index the songs database to improve searching and ordering. - + Re-index the songs database to improve searching and ordering. Reindexing songs... - + Reindexing songs... Add a new Song - + Add a new Song Edit the selected Song - + Edit the selected Song Delete the selected Song - + Delete the selected Song Preview the selected Song - + Preview the selected Song Send the selected Song live - + Send the selected Song live Add the selected Song to the service - + Add the selected Song to the service @@ -3885,95 +4099,98 @@ has been successfully created. Arabic (CP-1256) - + Arabic (CP-1256) Baltic (CP-1257) - + Baltic (CP-1257) Central European (CP-1250) - + Central European (CP-1250) Cyrillic (CP-1251) - + Cyrillic (CP-1251) Greek (CP-1253) - + Greek (CP-1253) Hebrew (CP-1255) - + Hebrew (CP-1255) Japanese (CP-932) - + Japanese (CP-932) Korean (CP-949) - + Korean (CP-949) Simplified Chinese (CP-936) - + Simplified Chinese (CP-936) Thai (CP-874) - + Thai (CP-874) Traditional Chinese (CP-950) - + Traditional Chinese (CP-950) Turkish (CP-1254) - + Turkish (CP-1254) Vietnam (CP-1258) - + Vietnam (CP-1258) Western European (CP-1252) - + Western European (CP-1252) Character Encoding - + Character Encoding The codepage setting is responsible for the correct character representation. Usually you are fine with the preselected choice. - + The codepage setting is responsible +for the correct character representation. +Usually you are fine with the preselected choice. Please choose the character encoding. The encoding is responsible for the correct character representation. - + Please choose the character encoding. +The encoding is responsible for the correct character representation. Exports songs using the export wizard. - + Exports songs using the export wizard. @@ -4019,7 +4236,7 @@ The encoding is responsible for the correct character representation. Importing song %d of %d - + Importing song %d of %d @@ -4197,12 +4414,12 @@ The encoding is responsible for the correct character representation. You need to have an author for this song. - + You need to have an author for this song. You need to type some text in to the verse. - + You need to type some text in to the verse. @@ -4228,82 +4445,82 @@ The encoding is responsible for the correct character representation. Song Export Wizard - + Song Export Wizard This wizard will help to export your songs to the open and free OpenLyrics worship song format. - + This wizard will help to export your songs to the open and free OpenLyrics worship song format. Select Songs - + Select Songs Uncheck All - + Uncheck All Check All - + Check All Select Directory - + Select Directory Select the directory you want the songs to be saved. - + Select the directory you want the songs to be saved. Directory: - + Directory: Exporting - + Exporting Please wait while your songs are exported. - + Please wait while your songs are exported. You need to add at least one Song to export. - + You need to add at least one Song to export. No Save Location specified - + No Save Location specified Starting export... - + Starting export... Check the songs you want to export. - + Check the songs you want to export. You need to specify a directory. - + You need to specify a directory. Select Destination Folder - + Select Destination Folder @@ -4371,42 +4588,42 @@ The encoding is responsible for the correct character representation. OpenLP 2.0 Databases - + OpenLP 2.0 Databases openlp.org v1.x Databases - + openlp.org v1.x Databases Words Of Worship Song Files - + Words Of Worship Song Files Songs Of Fellowship Song Files - + Songs Of Fellowship Song Files SongBeamer Files - + SongBeamer Files SongShow Plus Song Files - + SongShow Plus Song Files You need to specify at least one document or presentation file to import from. - + You need to specify at least one document or presentation file to import from. Foilpresenter Song Files - + Foilpresenter Song Files @@ -4427,26 +4644,26 @@ The encoding is responsible for the correct character representation. Lyrics - + Delete Song(s)? Delete Song(s)? CCLI License: - + CCLI License: Entire Song - + Entire Song - + Are you sure you want to delete the %n selected song(s)? - - - + + Are you sure you want to delete the %n selected song(s)? + Are you sure you want to delete the %n selected song(s)? @@ -4455,7 +4672,7 @@ The encoding is responsible for the correct character representation. Importing song %d of %d. - + Importing song %d of %d. @@ -4463,7 +4680,7 @@ The encoding is responsible for the correct character representation. Exporting "%s"... - + Exporting "%s"... @@ -4494,12 +4711,12 @@ The encoding is responsible for the correct character representation. Finished export. - + Finished export. Your song export failed. - + Your song export failed. @@ -4613,17 +4830,17 @@ The encoding is responsible for the correct character representation. The author %s already exists. Would you like to make songs with author %s use the existing author %s? - + The author %s already exists. Would you like to make songs with author %s use the existing author %s? The topic %s already exists. Would you like to make songs with topic %s use the existing topic %s? - + The topic %s already exists. Would you like to make songs with topic %s use the existing topic %s? The book %s already exists. Would you like to make songs with book %s use the existing book %s? - + The book %s already exists. Would you like to make songs with book %s use the existing book %s? @@ -4646,12 +4863,12 @@ The encoding is responsible for the correct character representation. Update service from song edit - + Update service from song edit Add missing songs when opening service - + Add missing songs when opening service diff --git a/resources/i18n/es.ts b/resources/i18n/es.ts index 7db94baba..4623ae889 100644 --- a/resources/i18n/es.ts +++ b/resources/i18n/es.ts @@ -154,28 +154,28 @@ Do you want to continue anyway? BibleDB.Wizard - + Importing testaments... %s - + Importing testaments... done. - + Importing books... %s - + Importing verses from %s... Importing verses from <book name>... - + Importing verses... done. @@ -520,7 +520,7 @@ Changes do not affect verses already in the service. Ya existe la Biblia - + Your Bible import failed. La importación de su Biblia falló. @@ -535,12 +535,12 @@ Changes do not affect verses already in the service. - + Starting Registering bible... - + Registered bible. Please note, that verses will be downloaded on demand and thus an internet connection is required. @@ -662,7 +662,7 @@ demand and thus an internet connection is required. BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... @@ -671,12 +671,12 @@ demand and thus an internet connection is required. BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... - + Importing %s %s... Importing <book name> <chapter>... @@ -1069,17 +1069,17 @@ OpenLP is written and maintained by volunteers. If you would like to see more fr - + Credits Créditos - + License Licencia - + Contribute Contribuir @@ -1089,7 +1089,25 @@ OpenLP is written and maintained by volunteers. If you would like to see more fr - + + Copyright © 2004-2011 Raoul Snyman +Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, +Meinert Jordan, Andreas Preikschat, Christian Richter, Philip +Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund + + + + + 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 below for more details. + + + + Project Lead %s @@ -1105,6 +1123,35 @@ Testers Packagers %s +Translators + Afrikaans (af) + %s + German (de) + %s + English, United Kingdom (en_GB) + %s + English, South Africa (en_ZA) + %s + Estonian (et) + %s + French (fr) + %s + Hungarian (hu) + %s + Japanese (ja) + %s + Norwegian Bokmål (nb) + %s + Dutch (nl) + %s + Portuguese, Brazil (pt_BR) + %s + Russian (ru) + %s + +Documentation + %s + Built With Python: http://www.python.org/ Qt4: http://qt.nokia.com/ @@ -1124,24 +1171,6 @@ Final Credit He has set us free. - - - Copyright © 2004-2011 Raoul Snyman -Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, -Meinert Jordan, Andreas Preikschat, Christian Richter, Philip -Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund - - - - - 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 below for more details. - - OpenLP.AdvancedTab @@ -1390,6 +1419,157 @@ Version: %s + + OpenLP.FirstTimeLanguageForm + + + Initial Set up Language + + + + + Select the language you'd like to use in OpenLP. + + + + + OpenLP.FirstTimeWizard + + + Songs + + + + + Bibles + + + + + Themes + + + + + Starting Updates + + + + + Downloading %s + + + + + First Time Wizard + + + + + Welcome to the First Time Wizard + + + + + This wizard will help you to configure OpenLP for initial use . Click the next button below to start the process of selection your initial options. + + + + + Activate required Plugins + + + + + Select the Plugins you wish to use. + + + + + Custom Text + + + + + Bible + + + + + Images + + + + + Presentations + + + + + Media (Audio and Video) + + + + + Allow remote access + + + + + Monitor Song Usage + + + + + Allow Alerts + + + + + Download Samples from OpenLP.org + + + + + Select samples to downlaod and install for use. + + + + + No Internet connection found so unable to download any default files. + + + + + Download Example Files + + + + + Default Settings + + + + + Set up default values to be used by OpenLP + + + + + Default output display + + + + + Select the default Theme + + + + + Press finish to apply all your changes and start OpenLP + + + OpenLP.GeneralTab @@ -1511,12 +1691,12 @@ Version: %s OpenLP.LanguageManager - + Language - + Please restart OpenLP to use your new language setting. @@ -1877,29 +2057,29 @@ Version: %s - + Version %s of OpenLP is now available for download (you are currently running version %s). You can download the latest version from http://openlp.org/. - + OpenLP Version Updated Versión de OpenLP Actualizada - + OpenLP Main Display Blanked Pantalla Principal de OpenLP en Blanco - + The Main Display has been blanked out La Pantalla Principal esta en negro - + Default Theme: %s @@ -1915,12 +2095,12 @@ You can download the latest version from http://openlp.org/. - + Close OpenLP - + Are you sure you want to close OpenLP? @@ -2242,17 +2422,17 @@ The content encoding is not UTF-8. - + Missing Display Handler - + Your item cannot be displayed as there is no handler to display it - + Your item cannot be displayed as the plugin required to display it is missing or inactive @@ -2409,57 +2589,57 @@ The content encoding is not UTF-8. OpenLP.SlideController - + Move to previous Regresar al anterior - + Move to next Ir al siguiente - + Hide - + Move to live Proyectar en vivo - + Start continuous loop Iniciar bucle continuo - + Stop continuous loop Detener el bucle - + Delay between slides in seconds Espera entre diapositivas en segundos - + Start playing media Iniciar la reproducción de medios - + Go To - + Edit and reload song preview - + Blank Screen @@ -2469,32 +2649,32 @@ The content encoding is not UTF-8. - + Show Desktop - + Previous Slide - + Next Slide - + Previous Service - + Next Service - + Escape Item @@ -2641,68 +2821,68 @@ The content encoding is not UTF-8. - + %s (default) - + You must select a theme to edit. - + You are unable to delete the default theme. - + You have not selected a theme. - + Save Theme - (%s) Guardar Tema - (%s) - + Theme Exported - + Your theme has been successfully exported. - + Theme Export Failed - + Your theme could not be exported due to an error. - + Select Theme Import File Seleccione el Archivo de Tema a Importar - + File is not a valid theme. The content encoding is not UTF-8. - + File is not a valid theme. - + Theme %s is used in the %s plugin. @@ -2722,47 +2902,47 @@ The content encoding is not UTF-8. - + You must select a theme to rename. - + Rename Confirmation - + Rename %s theme? - + You must select a theme to delete. - + Delete Confirmation - + Delete %s theme? - + Validation Error - + A theme with this name already exists. - + OpenLP Themes (*.theme *.otz) @@ -4405,7 +4585,7 @@ The encoding is responsible for the correct character representation. Letra - + Delete Song(s)? @@ -4420,7 +4600,7 @@ The encoding is responsible for the correct character representation. - + Are you sure you want to delete the %n selected song(s)? diff --git a/resources/i18n/et.ts b/resources/i18n/et.ts index 37b2170ab..18bcc29df 100644 --- a/resources/i18n/et.ts +++ b/resources/i18n/et.ts @@ -154,28 +154,28 @@ Do you want to continue anyway? BibleDB.Wizard - + Importing testaments... %s Testamentide importimine... %s - + Importing testaments... done. Testamentide importimine... valmis. - + Importing books... %s Raamatute importimine... %s - + Importing verses from %s... Importing verses from <book name>... Salmide importimine failist %s... - + Importing verses... done. Salmide importimine... valmis. @@ -539,17 +539,17 @@ Muudatused ei rakendu juba teenistusesse lisatud salmidele. See Piibel on juba olemas! Palun impordi mingi muu Piibel või kustuta enne olemasolev. - + Your Bible import failed. Piibli importimine nurjus. - + Starting Registering bible... Piibli registreerimise alustamine... - + Registered bible. Please note, that verses will be downloaded on demand and thus an internet connection is required. Piibel on registreeritud. Pane tähele, et salmid laaditakse alla @@ -672,7 +672,7 @@ vajadusel, seetõttu on vajalik internetiühendus. BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... %s %s. peatüki importimine... @@ -681,12 +681,12 @@ vajadusel, seetõttu on vajalik internetiühendus. BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... Kooditabeli tuvastamine (see võib võtta mõne minuti)... - + Importing %s %s... Importing <book name> <chapter>... %s %s. peatüki importimine... @@ -1068,17 +1068,17 @@ Do you want to add the other images anyway? OpenLP.AboutForm - + Credits Autorid - + License Litsents - + Contribute Aita kaasa @@ -1105,7 +1105,25 @@ OpenLP kohta võid lähemalt uurida aadressil: http://openlp.org/ OpenLP on kirjutatud vabatahtlike poolt. Kui sulle meeldiks näha rohkem kristlikku tarkvara, siis võid annetada, selleks klõpsa alumisele nupule. - + + Copyright © 2004-2011 Raoul Snyman +Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, +Meinert Jordan, Andreas Preikschat, Christian Richter, Philip +Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund + + + + + 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 below for more details. + + + + Project Lead %s @@ -1121,6 +1139,35 @@ Testers Packagers %s +Translators + Afrikaans (af) + %s + German (de) + %s + English, United Kingdom (en_GB) + %s + English, South Africa (en_ZA) + %s + Estonian (et) + %s + French (fr) + %s + Hungarian (hu) + %s + Japanese (ja) + %s + Norwegian Bokmål (nb) + %s + Dutch (nl) + %s + Portuguese, Brazil (pt_BR) + %s + Russian (ru) + %s + +Documentation + %s + Built With Python: http://www.python.org/ Qt4: http://qt.nokia.com/ @@ -1140,24 +1187,6 @@ Final Credit He has set us free. - - - Copyright © 2004-2011 Raoul Snyman -Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, -Meinert Jordan, Andreas Preikschat, Christian Richter, Philip -Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund - - - - - 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 below for more details. - - OpenLP.AdvancedTab @@ -1434,6 +1463,157 @@ Version: %s Faili kopeerimine + + OpenLP.FirstTimeLanguageForm + + + Initial Set up Language + + + + + Select the language you'd like to use in OpenLP. + + + + + OpenLP.FirstTimeWizard + + + Songs + Laulud + + + + Bibles + Piiblid + + + + Themes + Kujundused + + + + Starting Updates + + + + + Downloading %s + + + + + First Time Wizard + + + + + Welcome to the First Time Wizard + + + + + This wizard will help you to configure OpenLP for initial use . Click the next button below to start the process of selection your initial options. + + + + + Activate required Plugins + + + + + Select the Plugins you wish to use. + + + + + Custom Text + + + + + Bible + Piibel + + + + Images + Pildid + + + + Presentations + Esitlused + + + + Media (Audio and Video) + + + + + Allow remote access + + + + + Monitor Song Usage + + + + + Allow Alerts + + + + + Download Samples from OpenLP.org + + + + + Select samples to downlaod and install for use. + + + + + No Internet connection found so unable to download any default files. + + + + + Download Example Files + + + + + Default Settings + + + + + Set up default values to be used by OpenLP + + + + + Default output display + + + + + Select the default Theme + + + + + Press finish to apply all your changes and start OpenLP + + + OpenLP.GeneralTab @@ -1555,12 +1735,12 @@ Version: %s OpenLP.LanguageManager - + Language Keel - + Please restart OpenLP to use your new language setting. Uue keele kasutamiseks käivita OpenLP uuesti. @@ -1921,27 +2101,27 @@ Version: %s Vaate režiimiks ekraanivaate valimine. - + OpenLP Version Updated OpenLP uuendus - + OpenLP Main Display Blanked OpenLP peakuva on tühi - + The Main Display has been blanked out Peakuva on tühi - + Default Theme: %s Vaikimisi kujundus: %s - + Version %s of OpenLP is now available for download (you are currently running version %s). You can download the latest version from http://openlp.org/. @@ -1961,12 +2141,12 @@ Sa võid viimase versiooni alla laadida aadressilt http://openlp.org/.&Kiirklahvide seadistamine... - + Close OpenLP OpenLP sulgemine - + Are you sure you want to close OpenLP? Kas oled kindel, et tahad OpenLP sulgeda? @@ -2289,17 +2469,17 @@ Sisu ei ole UTF-8 kodeeringus. Fail pole sobiv teenistus. - + Missing Display Handler Puudub kuvakäsitleja - + Your item cannot be displayed as there is no handler to display it Seda elementi pole võimalik näidata ekraanil, kuna puudub seda käsitsev programm - + Your item cannot be displayed as the plugin required to display it is missing or inactive Seda elementi pole võimalik näidata ekraanil, kuna puudub seda käsitsev programm @@ -2456,57 +2636,57 @@ Sisu ei ole UTF-8 kodeeringus. OpenLP.SlideController - + Move to previous Eelmisele liikumine - + Move to next Järgmisele liikumine - + Hide Peida - + Move to live Tõsta ekraanile - + Edit and reload song preview Muuda ja kuva laulu eelvaade uuesti - + Start continuous loop Katkematu korduse alustamine - + Stop continuous loop Katkematu korduse lõpetamine - + Delay between slides in seconds Viivitus slaidide vahel sekundites - + Start playing media Meediaesituse alustamine - + Go To Liigu kohta - + Blank Screen Ekraani tühjendamine @@ -2516,32 +2696,32 @@ Sisu ei ole UTF-8 kodeeringus. Kujunduse tausta näitamine - + Show Desktop Töölaua näitamine - + Previous Slide Eelmine slaid - + Next Slide Järgmine slaid - + Previous Service Eelmine teenistus - + Next Service Järgmine teenistus - + Escape Item Kuva sulgemine @@ -2688,69 +2868,69 @@ Sisu ei ole UTF-8 kodeeringus. Määra &globaalseks vaikeväärtuseks - + %s (default) %s (vaikimisi) - + You must select a theme to edit. Pead valima kujunduse, mida muuta. - + You are unable to delete the default theme. Vaikimisi kujundust pole võimalik kustutada. - + Theme %s is used in the %s plugin. Kujundust %s kasutatakse pluginas %s. - + You have not selected a theme. Sa ei ole kujundust valinud. - + Save Theme - (%s) Salvesta kujundus - (%s) - + Theme Exported Kujundus eksporditud - + Your theme has been successfully exported. Sinu kujunduse on edukalt eksporditud. - + Theme Export Failed Kujunduse eksportimine nurjus - + Your theme could not be exported due to an error. Sinu kujundust polnud võimalik eksportida, kuna esines viga. - + Select Theme Import File Importimiseks kujunduse faili valimine - + File is not a valid theme. The content encoding is not UTF-8. See fail ei ole korrektne kujundus. Sisu kodeering ei ole UTF-8. - + File is not a valid theme. See fail ei ole sobilik kujundus. @@ -2770,47 +2950,47 @@ Sisu kodeering ei ole UTF-8. &Ekspordi kujundus - + You must select a theme to rename. Pead valima kujunduse, mida ümber nimetada. - + Rename Confirmation Ümbernimetamise kinnitus - + Rename %s theme? Kas anda kujundusele %s uus nimi? - + You must select a theme to delete. Pead valima kujunduse, mida tahad kustutada. - + Delete Confirmation Kustutamise kinnitus - + Delete %s theme? Kas kustutada kujundus %s? - + Validation Error Valideerimise viga - + A theme with this name already exists. Sellenimeline teema on juba olemas. - + OpenLP Themes (*.theme *.otz) OpenLP kujundused (*.theme *.otz) @@ -4457,7 +4637,7 @@ Kodeering on vajalik märkide õige esitamise jaoks. Laulusõnad - + Delete Song(s)? Kas kustutada laul(ud)? @@ -4472,7 +4652,7 @@ Kodeering on vajalik märkide õige esitamise jaoks. Kogu laulust - + Are you sure you want to delete the %n selected song(s)? diff --git a/resources/i18n/fr.ts b/resources/i18n/fr.ts index 0a58735f8..ecc5dba71 100644 --- a/resources/i18n/fr.ts +++ b/resources/i18n/fr.ts @@ -153,28 +153,28 @@ Do you want to continue anyway? BibleDB.Wizard - + Importing testaments... %s - + Importing testaments... done. - + Importing books... %s - + Importing verses from %s... Importing verses from <book name>... - + Importing verses... done. @@ -546,19 +546,19 @@ Les changement ne s'applique aux versets déjà un service. Fichier CSV - + Starting Registering bible... Commence l'enregistrement de la Bible... - + Registered bible. Please note, that verses will be downloaded on demand and thus an internet connection is required. Bible enregistrée. Veuillez noter que les verset vont être téléchargement a la demande, une connexion Interner fiable est donc nécessaire. - + Your Bible import failed. Votre import de Bible à échoué. @@ -664,7 +664,7 @@ a la demande, une connexion Interner fiable est donc nécessaire. BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... Import %s %s... @@ -673,12 +673,12 @@ a la demande, une connexion Interner fiable est donc nécessaire. BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... Détection de l'encodage (cela peut prendre quelque minutes)... - + Importing %s %s... Importing <book name> <chapter>... Import %s %s... @@ -1072,17 +1072,17 @@ OpenLP is written and maintained by volunteers. If you would like to see more fr - + Credits Crédits - + License Licence - + Contribute Contribuer @@ -1092,7 +1092,25 @@ OpenLP is written and maintained by volunteers. If you would like to see more fr - + + Copyright © 2004-2011 Raoul Snyman +Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, +Meinert Jordan, Andreas Preikschat, Christian Richter, Philip +Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund + + + + + 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 below for more details. + + + + Project Lead %s @@ -1108,6 +1126,35 @@ Testers Packagers %s +Translators + Afrikaans (af) + %s + German (de) + %s + English, United Kingdom (en_GB) + %s + English, South Africa (en_ZA) + %s + Estonian (et) + %s + French (fr) + %s + Hungarian (hu) + %s + Japanese (ja) + %s + Norwegian Bokmål (nb) + %s + Dutch (nl) + %s + Portuguese, Brazil (pt_BR) + %s + Russian (ru) + %s + +Documentation + %s + Built With Python: http://www.python.org/ Qt4: http://qt.nokia.com/ @@ -1127,24 +1174,6 @@ Final Credit He has set us free. - - - Copyright © 2004-2011 Raoul Snyman -Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, -Meinert Jordan, Andreas Preikschat, Christian Richter, Philip -Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund - - - - - 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 below for more details. - - OpenLP.AdvancedTab @@ -1394,6 +1423,157 @@ Version: %s Renomme le fichier + + OpenLP.FirstTimeLanguageForm + + + Initial Set up Language + + + + + Select the language you'd like to use in OpenLP. + + + + + OpenLP.FirstTimeWizard + + + Songs + + + + + Bibles + Bibles + + + + Themes + + + + + Starting Updates + + + + + Downloading %s + + + + + First Time Wizard + + + + + Welcome to the First Time Wizard + + + + + This wizard will help you to configure OpenLP for initial use . Click the next button below to start the process of selection your initial options. + + + + + Activate required Plugins + + + + + Select the Plugins you wish to use. + + + + + Custom Text + + + + + Bible + Bible + + + + Images + Images + + + + Presentations + Présentations + + + + Media (Audio and Video) + + + + + Allow remote access + + + + + Monitor Song Usage + + + + + Allow Alerts + + + + + Download Samples from OpenLP.org + + + + + Select samples to downlaod and install for use. + + + + + No Internet connection found so unable to download any default files. + + + + + Download Example Files + + + + + Default Settings + + + + + Set up default values to be used by OpenLP + + + + + Default output display + + + + + Select the default Theme + + + + + Press finish to apply all your changes and start OpenLP + + + OpenLP.GeneralTab @@ -1515,12 +1695,12 @@ Version: %s OpenLP.LanguageManager - + Language Langage - + Please restart OpenLP to use your new language setting. Veuillez redémarrer OpenLP pour utiliser votre nouvelle propriété de langue. @@ -1886,7 +2066,7 @@ Version: %s - + Version %s of OpenLP is now available for download (you are currently running version %s). You can download the latest version from http://openlp.org/. @@ -1895,32 +2075,32 @@ You can download the latest version from http://openlp.org/. Vous pouvez télécharger la dernière version depuis http://openlp.org/. - + OpenLP Version Updated Version d'OpenLP mis a jours - + OpenLP Main Display Blanked OpenLP affichage principale noirci - + The Main Display has been blanked out L'affichage principale a été noirci - + Close OpenLP Ferme OpenLP - + Are you sure you want to close OpenLP? Êtes vous sur de vouloir fermer OpenLP ? - + Default Theme: %s Thème par défaut : %s @@ -2299,17 +2479,17 @@ Le contenu n'est pas de l'UTF-8. Le fichier n'est pas un service valide. - + Missing Display Handler Délégué d'affichage manquent - + Your item cannot be displayed as there is no handler to display it Votre élément ne peut pas être affiché il n'y a pas de délégué pour l'afficher - + Your item cannot be displayed as the plugin required to display it is missing or inactive Votre élément ne peut pas être affiché le module nécessaire pour l'afficher est manquant ou inactif @@ -2416,32 +2596,32 @@ Le contenu n'est pas de l'UTF-8. OpenLP.SlideController - + Previous Slide Diapositive précédente - + Move to previous Aller au précédent - + Next Slide Aller au suivant - + Move to next Aller au suivant - + Hide Cache - + Blank Screen Écran noir @@ -2451,57 +2631,57 @@ Le contenu n'est pas de l'UTF-8. Thème vide - + Show Desktop Affiche le bureau - + Start continuous loop Démarre une boucle continue - + Stop continuous loop Arrête la boucle continue - + Delay between slides in seconds Délais entre les diapositives en secondes - + Move to live Déplace en direct - + Edit and reload song preview Édite et recharge le chant prévisualisé - + Start playing media Démarre la lecture de média - + Go To Aller à - + Previous Service Service précédent - + Next Service Service suivant - + Escape Item @@ -2663,114 +2843,114 @@ Le contenu n'est pas de l'UTF-8. &Exporte le thème - + %s (default) %s (défaut) - + You must select a theme to rename. Vous devez sélectionner a thème à renommer. - + Rename Confirmation Confirme le renommage - + Rename %s theme? Renomme le thème %s ? - + You must select a theme to edit. Vous devez sélectionner un thème a éditer. - + You must select a theme to delete. Vous devez sélectionner un thème à effacer. - + Delete Confirmation Confirmation d'effacement - + Delete %s theme? Efface le thème %s ? - + You have not selected a theme. Vous n'avez pas sélectionner de thème. - + Save Theme - (%s) Enregistre le thème - (%s) - + Theme Exported Thème exporté - + Your theme has been successfully exported. Votre thème a été exporter avec succès. - + Theme Export Failed L'export du thème a échoué - + Your theme could not be exported due to an error. Votre thème ne peut pas être exporter a cause d'une erreur. - + Select Theme Import File Select le fichier thème à importer - + File is not a valid theme. The content encoding is not UTF-8. Le fichier n'est pas un thème. Le contenu n'est pas de l'UTF-8. - + Validation Error Erreur de validation - + File is not a valid theme. Le fichier n'est pas un thème valide. - + A theme with this name already exists. Le thème avec ce nom existe déjà. - + You are unable to delete the default theme. Vous ne pouvez pas supprimer le thème par défaut. - + Theme %s is used in the %s plugin. Thème %s est utiliser par le module %s. - + OpenLP Themes (*.theme *.otz) @@ -4418,12 +4598,12 @@ The encoding is responsible for the correct character representation. - + Delete Song(s)? - + Are you sure you want to delete the %n selected song(s)? diff --git a/resources/i18n/hu.ts b/resources/i18n/hu.ts index 36d46c94c..7d571331a 100644 --- a/resources/i18n/hu.ts +++ b/resources/i18n/hu.ts @@ -153,28 +153,28 @@ Do you want to continue anyway? BibleDB.Wizard - + Importing testaments... %s - + Importing testaments... done. - + Importing books... %s - + Importing verses from %s... Importing verses from <book name>... - + Importing verses... done. @@ -520,7 +520,7 @@ A módosítások nem érintik a már a szolgálatban lévő verseket.Biblia létezik - + Your Bible import failed. A Biblia importálása nem sikerült. @@ -535,12 +535,12 @@ A módosítások nem érintik a már a szolgálatban lévő verseket.Ez a Biblia már létezik. Kérlek, importálj egy másik Bibliát vagy előbb töröld a meglévőt. - + Starting Registering bible... A Biblia regisztrálása elkezdődött... - + Registered bible. Please note, that verses will be downloaded on demand and thus an internet connection is required. Biblia regisztrálva. Megjegyzés: a versek csak kérésre lesznek letöltve és ekkor internet kapcsolat szükségeltetik. @@ -662,7 +662,7 @@ demand and thus an internet connection is required. BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... @@ -671,12 +671,12 @@ demand and thus an internet connection is required. BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... Kódolás észlelése (ez eltarthat pár percig)... - + Importing %s %s... Importing <book name> <chapter>... @@ -1075,17 +1075,17 @@ Többet az OpenLP-ről: http://openlp.org/ Az OpenLP-t önkéntesek készítették és tartják karban. Ha szeretnél több keresztény számítógépes programot, fontold meg a részvételt az alábbi gomb igénybevételével. - + Credits Közreműködők - + License Licenc - + Contribute Részvétel @@ -1095,7 +1095,25 @@ Az OpenLP-t önkéntesek készítették és tartják karban. Ha szeretnél több - + + Copyright © 2004-2011 Raoul Snyman +Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, +Meinert Jordan, Andreas Preikschat, Christian Richter, Philip +Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund + + + + + 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 below for more details. + + + + Project Lead %s @@ -1111,6 +1129,35 @@ Testers Packagers %s +Translators + Afrikaans (af) + %s + German (de) + %s + English, United Kingdom (en_GB) + %s + English, South Africa (en_ZA) + %s + Estonian (et) + %s + French (fr) + %s + Hungarian (hu) + %s + Japanese (ja) + %s + Norwegian Bokmål (nb) + %s + Dutch (nl) + %s + Portuguese, Brazil (pt_BR) + %s + Russian (ru) + %s + +Documentation + %s + Built With Python: http://www.python.org/ Qt4: http://qt.nokia.com/ @@ -1130,24 +1177,6 @@ Final Credit He has set us free. - - - Copyright © 2004-2011 Raoul Snyman -Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, -Meinert Jordan, Andreas Preikschat, Christian Richter, Philip -Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund - - - - - 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 below for more details. - - OpenLP.AdvancedTab @@ -1396,6 +1425,157 @@ Version: %s + + OpenLP.FirstTimeLanguageForm + + + Initial Set up Language + + + + + Select the language you'd like to use in OpenLP. + + + + + OpenLP.FirstTimeWizard + + + Songs + + + + + Bibles + + + + + Themes + + + + + Starting Updates + + + + + Downloading %s + + + + + First Time Wizard + + + + + Welcome to the First Time Wizard + + + + + This wizard will help you to configure OpenLP for initial use . Click the next button below to start the process of selection your initial options. + + + + + Activate required Plugins + + + + + Select the Plugins you wish to use. + + + + + Custom Text + + + + + Bible + + + + + Images + + + + + Presentations + + + + + Media (Audio and Video) + + + + + Allow remote access + + + + + Monitor Song Usage + + + + + Allow Alerts + + + + + Download Samples from OpenLP.org + + + + + Select samples to downlaod and install for use. + + + + + No Internet connection found so unable to download any default files. + + + + + Download Example Files + + + + + Default Settings + + + + + Set up default values to be used by OpenLP + + + + + Default output display + + + + + Select the default Theme + + + + + Press finish to apply all your changes and start OpenLP + + + OpenLP.GeneralTab @@ -1517,12 +1697,12 @@ Version: %s OpenLP.LanguageManager - + Language Nyelv - + Please restart OpenLP to use your new language setting. A nyelvi beállítások az OpenLP újraindítása után lépnek érvénybe. @@ -1883,7 +2063,7 @@ Version: %s Nézetmód váltása a Élő módra. - + Version %s of OpenLP is now available for download (you are currently running version %s). You can download the latest version from http://openlp.org/. @@ -1892,22 +2072,22 @@ You can download the latest version from http://openlp.org/. A legfrissebb verzió a http://openlp.org/ oldalról szerezhető be. - + OpenLP Version Updated OpenLP verziófrissítés - + OpenLP Main Display Blanked Sötét OpenLP fő képernyő - + The Main Display has been blanked out A fő képernyő el lett sötétítve - + Default Theme: %s Alapértelmezett téma: %s @@ -1923,12 +2103,12 @@ A legfrissebb verzió a http://openlp.org/ oldalról szerezhető be.Magyar - + Close OpenLP - + Are you sure you want to close OpenLP? @@ -2251,17 +2431,17 @@ A tartalom kódolása nem UTF-8. A fájl nem érvényes szolgálat. - + Missing Display Handler Hiányzó képernyő kezelő - + Your item cannot be displayed as there is no handler to display it Az elemet nem lehet megjeleníteni, mert nincs kezelő, amely megjelenítené - + Your item cannot be displayed as the plugin required to display it is missing or inactive Az elemet nem lehet megjeleníteni, mert a bővítmény, amely kezelné, hiányzik vagy inaktív @@ -2418,57 +2598,57 @@ A tartalom kódolása nem UTF-8. OpenLP.SlideController - + Move to previous Mozgatás az előzőre - + Move to next Mozgatás a következőre - + Hide Elrejtés - + Move to live Élő adásba küldés - + Start continuous loop Folyamatos vetítés indítása - + Stop continuous loop Folyamatos vetítés leállítása - + Delay between slides in seconds Diák közötti késleltetés másodpercben - + Start playing media Médialejátszás indítása - + Go To Ugrás erre - + Edit and reload song preview Szerkesztés és az dal előnézetének újraolvasása - + Blank Screen Üres képernyő @@ -2478,32 +2658,32 @@ A tartalom kódolása nem UTF-8. Üres téma - + Show Desktop Asztal megjelenítése - + Previous Slide - + Next Slide - + Previous Service - + Next Service - + Escape Item @@ -2650,69 +2830,69 @@ A tartalom kódolása nem UTF-8. Beállítás &globális alapértelmezetté - + %s (default) %s (alapértelmezett) - + You must select a theme to edit. Ki kell választani témát a szerkesztéshez. - + You are unable to delete the default theme. Az alapértelmezett témát nem lehet törölni. - + You have not selected a theme. Nincs kiválasztva egy téma sem. - + Save Theme - (%s) Téma mentése – (%s) - + Theme Exported Téma exportálva - + Your theme has been successfully exported. A téma sikeresen exportálásra került. - + Theme Export Failed A téma exportálása nem sikerült - + Your theme could not be exported due to an error. A témát nem sikerült exportálni egy hiba miatt. - + Select Theme Import File Importálandó téma fájl kiválasztása - + File is not a valid theme. The content encoding is not UTF-8. Nem érvényes témafájl. A tartalom kódolása nem UTF-8. - + File is not a valid theme. Nem érvényes témafájl. - + Theme %s is used in the %s plugin. A(z) %s témát a(z) %s bővítmény használja. @@ -2732,47 +2912,47 @@ A tartalom kódolása nem UTF-8. Téma e&xportálása - + You must select a theme to rename. - + Rename Confirmation - + Rename %s theme? - + You must select a theme to delete. - + Delete Confirmation - + Delete %s theme? - + Validation Error - + A theme with this name already exists. - + OpenLP Themes (*.theme *.otz) @@ -4415,7 +4595,7 @@ The encoding is responsible for the correct character representation. Dalszöveg - + Delete Song(s)? Törölhető(ek) a dal(ok)? @@ -4430,7 +4610,7 @@ The encoding is responsible for the correct character representation. - + Are you sure you want to delete the %n selected song(s)? diff --git a/resources/i18n/id.ts b/resources/i18n/id.ts index 8900300e6..de88d406a 100644 --- a/resources/i18n/id.ts +++ b/resources/i18n/id.ts @@ -154,28 +154,28 @@ Do you want to continue anyway? BibleDB.Wizard - + Importing testaments... %s - + Importing testaments... done. - + Importing books... %s - + Importing verses from %s... Importing verses from <book name>... - + Importing verses... done. @@ -531,7 +531,7 @@ Perubahan tidak akan mempengaruhi ayat yang kini tampil. - + Your Bible import failed. @@ -541,12 +541,12 @@ Perubahan tidak akan mempengaruhi ayat yang kini tampil. - + Starting Registering bible... - + Registered bible. Please note, that verses will be downloaded on demand and thus an internet connection is required. @@ -663,7 +663,7 @@ demand and thus an internet connection is required. BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... Mengimpor %s %s... @@ -672,12 +672,12 @@ demand and thus an internet connection is required. BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... - + Importing %s %s... Importing <book name> <chapter>... Mengimpor %s %s... @@ -1070,17 +1070,17 @@ OpenLP is written and maintained by volunteers. If you would like to see more fr - + Credits - + License - + Contribute @@ -1090,7 +1090,25 @@ OpenLP is written and maintained by volunteers. If you would like to see more fr - + + Copyright © 2004-2011 Raoul Snyman +Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, +Meinert Jordan, Andreas Preikschat, Christian Richter, Philip +Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund + + + + + 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 below for more details. + + + + Project Lead %s @@ -1106,6 +1124,35 @@ Testers Packagers %s +Translators + Afrikaans (af) + %s + German (de) + %s + English, United Kingdom (en_GB) + %s + English, South Africa (en_ZA) + %s + Estonian (et) + %s + French (fr) + %s + Hungarian (hu) + %s + Japanese (ja) + %s + Norwegian Bokmål (nb) + %s + Dutch (nl) + %s + Portuguese, Brazil (pt_BR) + %s + Russian (ru) + %s + +Documentation + %s + Built With Python: http://www.python.org/ Qt4: http://qt.nokia.com/ @@ -1125,24 +1172,6 @@ Final Credit He has set us free. - - - Copyright © 2004-2011 Raoul Snyman -Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, -Meinert Jordan, Andreas Preikschat, Christian Richter, Philip -Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund - - - - - 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 below for more details. - - OpenLP.AdvancedTab @@ -1391,6 +1420,157 @@ Version: %s + + OpenLP.FirstTimeLanguageForm + + + Initial Set up Language + + + + + Select the language you'd like to use in OpenLP. + + + + + OpenLP.FirstTimeWizard + + + Songs + + + + + Bibles + Alkitab + + + + Themes + + + + + Starting Updates + + + + + Downloading %s + + + + + First Time Wizard + + + + + Welcome to the First Time Wizard + + + + + This wizard will help you to configure OpenLP for initial use . Click the next button below to start the process of selection your initial options. + + + + + Activate required Plugins + + + + + Select the Plugins you wish to use. + + + + + Custom Text + + + + + Bible + Alkitab + + + + Images + + + + + Presentations + + + + + Media (Audio and Video) + + + + + Allow remote access + + + + + Monitor Song Usage + + + + + Allow Alerts + + + + + Download Samples from OpenLP.org + + + + + Select samples to downlaod and install for use. + + + + + No Internet connection found so unable to download any default files. + + + + + Download Example Files + + + + + Default Settings + + + + + Set up default values to be used by OpenLP + + + + + Default output display + + + + + Select the default Theme + + + + + Press finish to apply all your changes and start OpenLP + + + OpenLP.GeneralTab @@ -1512,12 +1692,12 @@ Version: %s OpenLP.LanguageManager - + Language - + Please restart OpenLP to use your new language setting. @@ -1878,29 +2058,29 @@ Version: %s - + Version %s of OpenLP is now available for download (you are currently running version %s). You can download the latest version from http://openlp.org/. - + OpenLP Version Updated - + OpenLP Main Display Blanked - + The Main Display has been blanked out - + Default Theme: %s @@ -1916,12 +2096,12 @@ You can download the latest version from http://openlp.org/. - + Close OpenLP - + Are you sure you want to close OpenLP? @@ -2248,17 +2428,17 @@ The content encoding is not UTF-8. - + Missing Display Handler - + Your item cannot be displayed as there is no handler to display it - + Your item cannot be displayed as the plugin required to display it is missing or inactive @@ -2410,57 +2590,57 @@ The content encoding is not UTF-8. OpenLP.SlideController - + Move to previous - + Move to next - + Hide - + Move to live - + Edit and reload song preview - + Start continuous loop - + Stop continuous loop - + Delay between slides in seconds - + Start playing media - + Go To - + Blank Screen @@ -2470,32 +2650,32 @@ The content encoding is not UTF-8. - + Show Desktop - + Previous Slide - + Next Slide - + Previous Service - + Next Service - + Escape Item @@ -2642,68 +2822,68 @@ The content encoding is not UTF-8. - + %s (default) - + You must select a theme to edit. - + You are unable to delete the default theme. - + Theme %s is used in the %s plugin. - + You have not selected a theme. - + Save Theme - (%s) - + Theme Exported - + Your theme has been successfully exported. - + Theme Export Failed - + Your theme could not be exported due to an error. - + Select Theme Import File - + File is not a valid theme. The content encoding is not UTF-8. - + File is not a valid theme. @@ -2723,47 +2903,47 @@ The content encoding is not UTF-8. - + You must select a theme to rename. - + Rename Confirmation - + Rename %s theme? - + You must select a theme to delete. - + Delete Confirmation - + Delete %s theme? - + Validation Error - + A theme with this name already exists. - + OpenLP Themes (*.theme *.otz) @@ -4406,7 +4586,7 @@ The encoding is responsible for the correct character representation. - + Delete Song(s)? @@ -4421,7 +4601,7 @@ The encoding is responsible for the correct character representation. - + Are you sure you want to delete the %n selected song(s)? diff --git a/resources/i18n/ja.ts b/resources/i18n/ja.ts index 4ea5843e4..841ac90b5 100644 --- a/resources/i18n/ja.ts +++ b/resources/i18n/ja.ts @@ -12,18 +12,19 @@ Do you want to continue anyway? No Parameter Found - + 引数が見つかりません No Placeholder Found - + プレースホルダーが見つかりません The alert text does not contain '<>'. Do you want to continue anyway? - + 警告テキストは、'<>'を含みません。 +処理を続けてもよろしいですか? @@ -154,28 +155,28 @@ Do you want to continue anyway? BibleDB.Wizard - + Importing testaments... %s 新旧訳を取込み中...%s - + Importing testaments... done. 新旧訳の取込み...完了。 - + Importing books... %s 書簡の取込み中...%s - + Importing verses from %s... Importing verses from <book name>... 節の取込み中 %s... - + Importing verses... done. 節の取込み....完了。 @@ -226,7 +227,7 @@ Do you want to continue anyway? <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display bible verses from different sources during the service. - <strong>聖書プラグイン</strong><br />聖書プラグインは、礼拝で様々な訳の御言葉を表示する機能を提供します。 + <strong>聖書プラグイン</strong><br />聖書プラグインは、礼拝プログラムで様々な訳の御言葉を表示する機能を提供します。 @@ -261,7 +262,7 @@ Do you want to continue anyway? Add the selected Bible to the service - 選択した聖書を礼拝に追加 + 選択した聖書を礼拝プログラムに追加 @@ -331,7 +332,14 @@ Book Chapter:Verse-Verse Book Chapter:Verse-Verse,Verse-Verse Book Chapter:Verse-Verse,Chapter:Verse-Verse Book Chapter:Verse-Chapter:Verse - + 参照聖句の形式が、OpenLPにサポートされていません。以下のパターンに準拠した参照聖句である事を確認下さい。 + +書 章 +書 章-章 +書 章:節-節 +書 章:節-節,節-節 +書 章:節-節,章:節-節 +書 章:節-章:節 @@ -405,7 +413,7 @@ Book Chapter:Verse-Chapter:Verse Note: Changes do not affect verses already in the service. - 注意: 既に礼拝に含まれる御言葉は変更されません。 + 注意: 既に礼拝プログラムに含まれる御言葉は変更されません。 @@ -531,17 +539,17 @@ Changes do not affect verses already in the service. すでにこの聖書データは取り込み済みです。他の聖書データを取り込むか既に取り込まれた聖書を削除してください。 - + Your Bible import failed. 聖書データの取り込みに失敗しました。 - + Starting Registering bible... 聖書を登録しています... - + Registered bible. Please note, that verses will be downloaded on demand and thus an internet connection is required. 聖書が登録されました。節ごとに必要に応じてダウンロードされますので、インターネットへの接続が要求される事を留意しておいてください。 @@ -657,13 +665,13 @@ demand and thus an internet connection is required. Scripture Reference - + 参照聖句 BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... %s %sをインポートしています... @@ -672,12 +680,12 @@ demand and thus an internet connection is required. BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... エンコードの検出中です(数分かかることがあります)... - + Importing %s %s... Importing <book name> <chapter>... %s %sをインポートしています... @@ -688,7 +696,7 @@ demand and thus an internet connection is required. <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way songs are. This plugin provides greater freedom over the songs plugin. - <strong>カスタムプラグイン</strong><br />カスタムプラグインは、カスタムのテキストを歌などと同様に表示する機能を提供します。 + <strong>カスタムプラグイン</strong><br />カスタムプラグインは、カスタムのテキストを賛美などと同様に表示する機能を提供します。 @@ -764,7 +772,7 @@ demand and thus an internet connection is required. &Credits: - + クレジット(&C): @@ -807,7 +815,7 @@ demand and thus an internet connection is required. Add the selected Custom to the service - 選択したカスタムを礼拝に追加 + 選択したカスタムを礼拝プログラムに追加 @@ -833,7 +841,7 @@ demand and thus an internet connection is required. <strong>Image Plugin</strong><br />The image plugin provides displaying of images.<br />One of the distinguishing features of this plugin is the ability to group a number of images together in the service manager, making the displaying of multiple images easier. This plugin can also make use of OpenLP's "timed looping" feature to create a slide show that runs automatically. In addition to this, images from the plugin can be used to override the current theme's background, which renders text-based items like songs with the selected image as a background instead of the background provided by the theme. - <strong>画像プラグイン</strong><br />画像プラグインは、画像を表示する機能を提供します。<br />礼拝マネージャで複数の画像をグループ化したり、複数の画像を簡単に表示することができます。タイムアウトループの機能を使用してスライドショーを自動的に表示することもできます。さらに、歌などのテキストベースの項目の背景を、テーマで指定されたものからこのプラグインの画像に変更することもできます。 + <strong>画像プラグイン</strong><br />画像プラグインは、画像を表示する機能を提供します。<br />礼拝プログラムで複数の画像をグループ化したり、複数の画像を簡単に表示することができます。タイムアウトループの機能を使用してスライドショーを自動的に表示することもできます。さらに、賛美などのテキストベースの項目の背景を、テーマで指定されたものからこのプラグインの画像に変更することもできます。 @@ -868,7 +876,7 @@ demand and thus an internet connection is required. Add the selected Image to the service - 選択した画像を礼拝に追加 + 選択した画像を礼拝プログラムに追加 @@ -977,7 +985,7 @@ Do you want to add the other images anyway? Add the selected Media to the service - 選択したメディアを礼拝に追加 + 選択したメディアを礼拝プログラムに追加 @@ -1033,7 +1041,7 @@ Do you want to add the other images anyway? Videos (%s);;Audio (%s);;%s (*) - + ビデオ (%s);;オーディオ (%s);;%s (*) @@ -1068,7 +1076,7 @@ OpenLP is free church presentation software, or lyrics projection software, used Find out more about OpenLP: http://openlp.org/ OpenLP is written and maintained by volunteers. If you would like to see more free Christian software being written, please consider contributing by using the button below. - OpenLPは、教会専用のフリー(無償及び利用に関して)のプレゼンテーション及び歌詞投射ソフトウェアです。 + OpenLPは、教会専用のフリー(無償及び利用に関して)のプレゼンテーション及び賛美詞投射ソフトウェアです。 パソコンとプロジェクターを用いて、聖書箇所、画像また他プレゼンテーションデータ(OpenOffice.orgやPowerPoint/Viewerが必要)をスライド表示する事ができます。 @@ -1077,17 +1085,17 @@ http://openlp.org/にて詳しくご紹介しております。 OpenLPは、ボランティアの手により開発保守されています。もっと多くのクリスチャンの手によるフリーのソフトウェア開発に興味がある方は、以下のボタンからどうぞ。 - + Credits 著作情報 - + License ライセンス - + Contribute 貢献する @@ -1097,7 +1105,17 @@ OpenLPは、ボランティアの手により開発保守されています。 ビルド %s - + + 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. + このプログラムは、フリーソフトです。あなたは、これを再配布したり、the Free Software Foundationが発行したGNU General Public Licenseバージョン2の元で改変する事が出来ます。 + + + + 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 below for more details. + このプログラムは、皆様のお役に立てると期待し、配布しています。しかし、完全に無保障である事を覚えて下さい。商品としての暗黙の保障としての商品適格性や特定の使用適合性もありません。詳しくは、以下の文をお読みください。 + + + Project Lead %s @@ -1113,6 +1131,35 @@ Testers Packagers %s +Translators + Afrikaans (af) + %s + German (de) + %s + English, United Kingdom (en_GB) + %s + English, South Africa (en_ZA) + %s + Estonian (et) + %s + French (fr) + %s + Hungarian (hu) + %s + Japanese (ja) + %s + Norwegian Bokmål (nb) + %s + Dutch (nl) + %s + Portuguese, Brazil (pt_BR) + %s + Russian (ru) + %s + +Documentation + %s + Built With Python: http://www.python.org/ Qt4: http://qt.nokia.com/ @@ -1133,23 +1180,13 @@ Final Credit - + Copyright © 2004-2011 Raoul Snyman Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund - - - 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 below for more details. - - OpenLP.AdvancedTab @@ -1176,7 +1213,7 @@ Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frod Expand new service items on creation - 礼拝の項目の作成時に展開する + 礼拝項目の作成時に展開する @@ -1191,27 +1228,27 @@ Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frod Hide mouse cursor when over display window - + ディスプレイウィンドウの上では、マウスカーソルを隠す Default Image - + 既定の画像 Background color: - 背景色: + 背景色: Image file: - + 画像ファイル: Open File - ファイルを開く + ファイルを開く @@ -1219,52 +1256,52 @@ Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frod Edit Selection - 選択項目を編集 + 選択項目を編集 Update - 更新 + 更新 Description - 説明 + 説明 Tag - タグ + タグ Start tag - 開始HTML + 開始タグ End tag - 終了HTML + 終了タグ Default - 初期設定 + 初期設定 Tag id - タグID + タグID Start Html - 開始HTML + 開始タグ End Html - 終了HTML + 終了タグ @@ -1425,6 +1462,157 @@ Version: %s ファイルをコピー + + OpenLP.FirstTimeLanguageForm + + + Initial Set up Language + + + + + Select the language you'd like to use in OpenLP. + + + + + OpenLP.FirstTimeWizard + + + Songs + 賛美 + + + + Bibles + 聖書 + + + + Themes + テーマ + + + + Starting Updates + + + + + Downloading %s + + + + + First Time Wizard + + + + + Welcome to the First Time Wizard + + + + + This wizard will help you to configure OpenLP for initial use . Click the next button below to start the process of selection your initial options. + + + + + Activate required Plugins + + + + + Select the Plugins you wish to use. + + + + + Custom Text + + + + + Bible + 聖書 + + + + Images + 画像 + + + + Presentations + プレゼンテーション + + + + Media (Audio and Video) + + + + + Allow remote access + + + + + Monitor Song Usage + + + + + Allow Alerts + + + + + Download Samples from OpenLP.org + + + + + Select samples to downlaod and install for use. + + + + + No Internet connection found so unable to download any default files. + + + + + Download Example Files + + + + + Default Settings + + + + + Set up default values to be used by OpenLP + + + + + Default output display + + + + + Select the default Theme + + + + + Press finish to apply all your changes and start OpenLP + + + OpenLP.GeneralTab @@ -1460,7 +1648,7 @@ Version: %s Automatically open the last service - 自動的に前回の礼拝を開く + 自動的に前回の礼拝プログラムを開く @@ -1475,7 +1663,7 @@ Version: %s Prompt to save before starting a new service - 新しい礼拝を開く前に保存を確認する + 新しい礼拝プログラムを開く前に保存を確認する @@ -1546,12 +1734,12 @@ Version: %s OpenLP.LanguageManager - + Language 言語 - + Please restart OpenLP to use your new language setting. 新しい言語設定を使用するために、OpenLPを再起動してください。 @@ -1619,7 +1807,7 @@ Version: %s Service Manager - 礼拝マネージャ + 礼拝プログラム @@ -1644,7 +1832,7 @@ Version: %s Open an existing service. - 存在する礼拝を開きます。 + 存在する礼拝プログラムを開きます。 @@ -1659,7 +1847,7 @@ Version: %s Save the current service to disk. - 現在の礼拝をディスクに保存します。 + 現在の礼拝プログラムをディスクに保存します。 @@ -1674,12 +1862,12 @@ Version: %s Save Service As - 名前をつけて礼拝を保存 + 名前をつけて礼拝プログラムを保存 Save the current service under a new name. - 現在の礼拝を新しい名前で保存します。 + 現在の礼拝プログラムを新しい名前で保存します。 @@ -1754,22 +1942,22 @@ Version: %s &Service Manager - 礼拝マネジャー(&S) + 礼拝プログラム(&S) Toggle Service Manager - 礼拝マネジャーを切り替え + 礼拝プログラムを切り替え Toggle the visibility of the service manager. - 礼拝マネジャーの可視性を切り替える。 + 礼拝プログラムの可視性を切り替える。 F9 - 礼拝マネジャー + 礼拝プログラム @@ -1912,7 +2100,7 @@ Version: %s 表示モードをライブにします。 - + Version %s of OpenLP is now available for download (you are currently running version %s). You can download the latest version from http://openlp.org/. @@ -1921,22 +2109,22 @@ You can download the latest version from http://openlp.org/. http://openlp.org/から最新版がダウンロード可能です。 - + OpenLP Version Updated OpenLPのバージョンアップ完了 - + OpenLP Main Display Blanked OpenLPのプライマリディスプレイがブランクです - + The Main Display has been blanked out OpenLPのプライマリディスプレイがブランクになりました - + Default Theme: %s 既定テーマ @@ -1952,19 +2140,19 @@ http://openlp.org/から最新版がダウンロード可能です。ショートカットの設定(&S)... - + Close OpenLP OpenLPの終了 - + Are you sure you want to close OpenLP? 本当にOpenLPを終了してもよろしいですか? Print the current Service Order. - 現在の礼拝順序を印刷します。 + 現在の礼拝プログラム順序を印刷します。 @@ -1974,17 +2162,17 @@ http://openlp.org/から最新版がダウンロード可能です。 &Configure Display Tags - + 表示タグを設定(&C) Open &Data Folder... - + データフォルダを開く(&D)... Open the folder where songs, bibles and other data resides. - + 賛美、聖書データなどのデータが含まれているフォルダを開く。 @@ -2078,12 +2266,12 @@ http://openlp.org/から最新版がダウンロード可能です。 Fit Page - + サイズをページに合わせる Fit Width - + サイズをページの横幅に合わせる @@ -2091,62 +2279,62 @@ http://openlp.org/から最新版がダウンロード可能です。 Options - + オプション Close - + 閉じる Copy - + コピー Copy as HTML - + HTMLとしてコピーする Zoom In - + ズームイン Zoom Out - + ズームアウト Zoom Original - + 既定のズームに戻す Other Options - + その他のオプション Include slide text if available - + 可能であれば、スライドテキストを含める Include service item notes - + 礼拝項目メモを含める Include play length of media items - + メディア項目の再生時間を含める Service Order Sheet - 礼拝順序シート + 礼拝プログラム順序シート @@ -2154,12 +2342,12 @@ http://openlp.org/から最新版がダウンロード可能です。 Screen - スクリーン + スクリーン primary - プライマリ + プライマリ @@ -2175,17 +2363,17 @@ http://openlp.org/から最新版がダウンロード可能です。 Load an existing service - 既存の礼拝を読み込む + 既存の礼拝プログラムを読み込む Save this service - 礼拝を保存 + 礼拝プログラムを保存 Select a theme for the service - 礼拝のテーマを選択 + 礼拝プログラムのテーマを選択 @@ -2235,7 +2423,7 @@ http://openlp.org/から最新版がダウンロード可能です。 Delete the selected item from the service. - 選択した項目を礼拝から削除する。 + 選択した項目を礼拝プログラムから削除する。 @@ -2271,26 +2459,26 @@ http://openlp.org/から最新版がダウンロード可能です。 File is not a valid service. The content encoding is not UTF-8. - 礼拝ファイルが有効でありません。 + 礼拝プログラムファイルが有効でありません。 エンコードがUTF-8でありません。 File is not a valid service. - 礼拝ファイルが有効でありません。 + 礼拝プログラムファイルが有効でありません。 - + Missing Display Handler ディスプレイハンドラが見つかりません - + Your item cannot be displayed as there is no handler to display it ディスプレイハンドラが見つからないため項目を表示する事ができません - + Your item cannot be displayed as the plugin required to display it is missing or inactive 必要なプラグインが見つからないか無効なため、項目を表示する事ができません @@ -2322,7 +2510,7 @@ The content encoding is not UTF-8. OpenLP Service Files (*.osz) - OpenLP 礼拝ファイル (*.osz) + OpenLP 礼拝プログラムファイル (*.osz) @@ -2352,7 +2540,7 @@ The content encoding is not UTF-8. Modified Service - 礼拝の編集 + 礼拝プログラムの編集 @@ -2362,22 +2550,22 @@ The content encoding is not UTF-8. &Start Time - + 開始時間(&S) Show &Preview - + プレビュー表示(&P) Show &Live - + ライブ表示(&L) The current service has been modified. Would you like to save this service? - + 現在の礼拝プログラムは、編集されています。保存しますか? @@ -2441,63 +2629,63 @@ The content encoding is not UTF-8. Alternate - + 代替 OpenLP.SlideController - + Move to previous 前へ移動 - + Move to next 次へ移動 - + Hide 隠す - + Move to live ライブへ移動 - + Edit and reload song preview 編集し再読み込み - + Start continuous loop 繰り返し再生を開始 - + Stop continuous loop 繰り返し再生を停止 - + Delay between slides in seconds 次のスライドまでの遅延 - + Start playing media メディア再生を開始 - + Go To - + Blank Screen スクリーンをブランク @@ -2507,32 +2695,32 @@ The content encoding is not UTF-8. テーマをブランク - + Show Desktop デスクトップを表示 - + Previous Slide 前スライド - + Next Slide 次スライド - + Previous Service - 前の礼拝 + 前の礼拝プログラム - + Next Service - 次の礼拝 + 次の礼拝プログラム - + Escape Item 項目をエスケープ @@ -2555,32 +2743,32 @@ The content encoding is not UTF-8. Item Start Time - + 項目開始時間 Hours: - + 時: h - + m - + Minutes: - + 分: Seconds: - + 秒: @@ -2679,68 +2867,68 @@ The content encoding is not UTF-8. 全体の既定として設定(&G)) - + %s (default) %s (既定) - + You must select a theme to edit. 編集するテーマを選択してください。 - + You are unable to delete the default theme. 既定のテーマを削除する事はできません。 - + Theme %s is used in the %s plugin. %s プラグインでこのテーマは利用されています。 - + You have not selected a theme. テーマの選択がありません。 - + Save Theme - (%s) テーマを保存 - (%s) - + Theme Exported テーマエキスポート - + Your theme has been successfully exported. テーマは正常にエキスポートされました。 - + Theme Export Failed テーマのエキスポート失敗 - + Your theme could not be exported due to an error. エラーが発生したためテーマは、エキスポートされませんでした。 - + Select Theme Import File インポート対象のテーマファイル選択 - + File is not a valid theme. The content encoding is not UTF-8. ファイルは無効なテーマです。文字コードがUTF-8ではありません。 - + File is not a valid theme. 無効なテーマファイルです。 @@ -2760,49 +2948,49 @@ The content encoding is not UTF-8. テーマのエキスポート(&E) - + You must select a theme to rename. 名前を変更するテーマを選択してください。 - + Rename Confirmation 名前変更確認 - + Rename %s theme? %sテーマの名前を変更します。宜しいですか? - + You must select a theme to delete. 削除するテーマを選択してください。 - + Delete Confirmation 削除確認 - + Delete %s theme? %s テーマを削除します。宜しいですか? - + Validation Error 検証エラー - + A theme with this name already exists. 同名のテーマが既に存在します。 - + OpenLP Themes (*.theme *.otz) - + OpenLP テーマ (*.theme *.otz) @@ -3063,22 +3251,22 @@ The content encoding is not UTF-8. S&ong Level - 歌レベル(&O) + 賛美レベル(&O) Use the theme from each song in the database. If a song doesn't have a theme associated with it, then use the service's theme. If the service doesn't have a theme, then use the global theme. - データベース内のそれぞれの歌のテーマを使用します。歌にテーマが設定されていない場合、礼拝のテーマを使用します。礼拝にテーマが設定されていなければ、全体設定のテーマを使用します。 + データベース内のそれぞれの賛美のテーマを使用します。賛美にテーマが設定されていない場合、礼拝プログラムのテーマを使用します。礼拝プログラムにテーマが設定されていなければ、全体設定のテーマを使用します。 &Service Level - 礼拝レベル(&S) + 礼拝プログラムレベル(&S) Use the theme from the service, overriding any of the individual songs' themes. If the service doesn't have a theme, then use the global theme. - 礼拝のテーマを用い、歌個々のテーマを上書きします。礼拝にテーマが設定されていなければ、全体設定のテーマを使用します。 + 礼拝プログラムのテーマを用い、賛美個々のテーマを上書きします。礼拝プログラムにテーマが設定されていなければ、全体設定のテーマを使用します。 @@ -3088,7 +3276,7 @@ The content encoding is not UTF-8. Use the global theme, overriding any themes associated with either the service or the songs. - 全体テーマを用い、すべての礼拝や歌に関連付けられたテーマを上書きします。 + 全体テーマを用い、すべての礼拝プログラムや賛美に関連付けられたテーマを上書きします。 @@ -3121,353 +3309,382 @@ The content encoding is not UTF-8. About - 情報 + ソフトウェア情報 &Add - 追加(&A) + 追加(&A) Advanced - + 詳細設定 All Files - 全てのファイル + 全てのファイル Bottom - + 下部 Browse... - 参照... + 参照... Cancel - キャンセル + キャンセル CCLI number: - CCLI番号: + CCLI番号: Create a new service. - 新規礼拝を作成します。 + 新規礼拝プログラムを作成します。 &Edit - 編集(&E) + 編集(&E) Empty Field - + 空のフィールド Export - + エキスポート pt Abbreviated font pointsize unit - + Image - 画像 + 画像 Import - インポート + インポート Length %s - + 長さ %s Live - ライブ + ライブ Live Background Error - ライブ背景エラー + ライブ背景エラー Live Panel - + ライブパネル Load - 読み込み + 読み込み Middle - + 中央部 New - 新規 + 新規 New Service - 新しい礼拝 + 新しい礼拝プログラム New Theme - 新しいテーマ + 新しいテーマ No File Selected Singular - + ファイルが選択されていません No Files Selected Plural - + ファイルが一つも選択されていません No Item Selected Singular - + 項目が選択されていません No Items Selected Plural - 項目の選択がありません + 一つの項目も選択されていません openlp.org 1.x - + OpenLP 2.0 - + Open Service - 礼拝を開く + 礼拝プログラムを開く Preview - プレビュー + プレビュー Preview Panel - + プレビューパネル Print Service Order - 礼拝順序を印刷 + 礼拝プログラム順序を印刷 Replace Background - + 背景を置換 Replace Live Background - ライブの背景を置換 + ライブの背景を置換 Reset Background - 背景をリセット + 背景をリセット Reset Live Background - ライブの背景をリセット + ライブの背景をリセット s The abbreviated unit for seconds - + Save && Preview - + 保存してプレビュー Search - 検索 + 検索 You must select an item to delete. - 削除する項目を選択してください。 + 削除する項目を選択して下さい。 You must select an item to edit. - 項目を編集してください。 + 編集する項目を選択して下さい。 Save Service - 礼拝の保存 + 礼拝プログラムの保存 Service - 礼拝 + 礼拝プログラム Start %s - + 開始 %s Theme Singular - テーマ + テーマ Themes Plural - テーマ + テーマ Top - + 上部 Version - + バージョン &Vertical Align: - + 垂直整列(&V): Finished import. - + インポートの完了。 Format: - 書式: + 書式: Importing - + インポート中 Importing "%s"... - "%s"をインポート中... + "%s"をインポート中... Select Import Source - + インポート元を選択 Select the import format and the location to import from. - + インポート形式とインポート元を選択して下さい。 The openlp.org 1.x importer has been disabled due to a missing Python module. If you want to use this importer, you will need to install the "python-sqlite" module. - The openlp.org 1.xの取込機能が、Pythonの拡張機能がないためオフになっています。取込機能をお使いになられる場合、python-sqlite拡張機能をインストール必要があります。 + The openlp.org 1.xの取込機能が、Pythonの拡張機能がないためオフになっています。取込機能をお使いになられる場合、python-sqlite拡張機能をインストール必要があります。 Open %s File - + %sファイルを開く %p% - + Ready. - 完了。 + 準備完了。 Starting import... - + インポートを開始しています.... You need to specify at least one %s file to import from. A file type e.g. OpenSong - + インポート元となる%sファイルを最低一つ選択する必要があります。 Welcome to the Bible Import Wizard - 選択した聖書を礼拝に追加へようこそ + 聖書インポートガイドへようこそ Welcome to the Song Export Wizard - + 賛美エキスポートガイドへようこそ Welcome to the Song Import Wizard - 歌インポートガイドへようこそ + 賛美インポートガイドへようこそ Author Singular - + アーティスト Authors Plural - アーティスト + アーティスト + + + + Song Book + Singular + アルバム + + + + Song Books + Plural + アルバム + + + + Song Maintenance + 賛美の保守 + + + + Topic + Singular + 題目 + + + + Topics + Plural + 題目 @@ -3475,42 +3692,13 @@ The content encoding is not UTF-8. Copyright symbol. - - - Song Book - Singular - アルバム - - - - Song Books - Plural - アルバム - - - - Song Maintenance - 歌の保守 - - - - Topic - Singular - 題目 - - - - Topics - Plural - 題目 - OpenLP.displayTagDialog Configure Display Tags - + 表示タグを設定 @@ -3543,7 +3731,7 @@ The content encoding is not UTF-8. Add the selected Presentation to the service - 選択したプレゼンテーションを礼拝に追加 + 選択したプレゼンテーションを礼拝プログラムに追加 @@ -3637,7 +3825,7 @@ The content encoding is not UTF-8. %s (unavailable) - + %s (利用不可) @@ -3689,7 +3877,7 @@ The content encoding is not UTF-8. &Song Usage Tracking - 歌の利用記録(&S) + 賛美の利用記録(&S) @@ -3719,12 +3907,12 @@ The content encoding is not UTF-8. Toggle the tracking of song usage. - 歌の利用記録の切り替える。 + 賛美の利用記録の切り替える。 <strong>SongUsage Plugin</strong><br />This plugin tracks the usage of songs in services. - <strong>SongUsage Plugin</strong><br />このプラグインは、歌の利用頻度を記録します。 + <strong>SongUsage Plugin</strong><br />このプラグインは、賛美の利用頻度を記録します。 @@ -3755,12 +3943,12 @@ The content encoding is not UTF-8. Delete Selected Song Usage Events? - 選択された歌の利用記録を削除しますか? + 選択された賛美の利用記録を削除しますか? Are you sure you want to delete selected Song Usage data? - 選択された歌の利用記録を削除します。よろしいですか? + 選択された賛美の利用記録を削除します。よろしいですか? @@ -3778,12 +3966,12 @@ The content encoding is not UTF-8. Song Usage Extraction - 歌利用記録の抽出 + 賛美利用記録の抽出 Select Date Range - 歌利用の期間 + 賛美利用の期間 @@ -3825,80 +4013,80 @@ has been successfully created. &Song - 歌(&S) + 賛美(&S) Import songs using the import wizard. - インポートウィザードを使用して歌をインポートします。 + インポートウィザードを使用して賛美をインポートします。 <strong>Songs Plugin</strong><br />The songs plugin provides the ability to display and manage songs. - <strong>歌プラグイン</strong><br />歌プラグインは、歌を表示し管理する機能を提供します。 + <strong>賛美プラグイン</strong><br />賛美プラグインは、賛美を表示し管理する機能を提供します。 &Re-index Songs - 歌のインデックスを再作成(&R) + 賛美のインデックスを再作成(&R) Re-index the songs database to improve searching and ordering. - 歌データベースのインデックスを再作成し、検索や並べ替えを速くします。 + 賛美データベースのインデックスを再作成し、検索や並べ替えを速くします。 Reindexing songs... - 歌のインデックスを再作成中... + 賛美のインデックスを再作成中... Add a new Song - 歌を追加 + 賛美を追加 Edit the selected Song - 選択した歌を編集 + 選択した賛美を編集 Delete the selected Song - 選択した歌を削除 + 選択した賛美を削除 Preview the selected Song - 選択した歌をプレビュー + 選択した賛美をプレビュー Send the selected Song live - 選択した歌をライブへ送る + 選択した賛美をライブへ送る Add the selected Song to the service - 選択した歌を礼拝に追加 + 選択した賛美を礼拝プログラムに追加 Song name singular - + 賛美 Songs name plural - + 賛美 Songs container title - + 賛美 @@ -3991,7 +4179,7 @@ The encoding is responsible for the correct character representation. Exports songs using the export wizard. - + エキスポートガイドを使って賛美をエキスポートする。 @@ -4037,7 +4225,7 @@ The encoding is responsible for the correct character representation. Importing song %d of %d - 歌(%d/%d)をインポートしています + 賛美(%d/%d)をインポートしています @@ -4060,7 +4248,7 @@ The encoding is responsible for the correct character representation. &Lyrics: - 歌詞(&L): + 賛美詞(&L): @@ -4075,12 +4263,12 @@ The encoding is responsible for the correct character representation. Title && Lyrics - タイトル && 歌詞 + タイトル && 賛美詞 &Add to Song - 歌に追加(&A) + 賛美に追加(&A) @@ -4095,7 +4283,7 @@ The encoding is responsible for the correct character representation. A&dd to Song - 歌に追加(&A) + 賛美に追加(&A) @@ -4155,7 +4343,7 @@ The encoding is responsible for the correct character representation. You have not selected a valid author. Either select an author from the list, or type in a new author and click the "Add Author to Song" button to add the new author. - 有効なアーティストを選択してください。一覧から選択するか新しいアーティストを入力し、"歌にアーティストを追加"をクリックしてください。 + 有効なアーティストを選択してください。一覧から選択するか新しいアーティストを入力し、"賛美にアーティストを追加"をクリックしてください。 @@ -4175,12 +4363,12 @@ The encoding is responsible for the correct character representation. You have not selected a valid topic. Either select a topic from the list, or type in a new topic and click the "Add Topic to Song" button to add the new topic. - 有効なトピックを選択してください。一覧から選択するか新しいトピックを入力し、"歌にトピックを追加"をクリックしてください。 + 有効なトピックを選択してください。一覧から選択するか新しいトピックを入力し、"賛美にトピックを追加"をクリックしてください。 You need to type in a song title. - 歌のタイトルを入力する必要があります。 + 賛美のタイトルを入力する必要があります。 @@ -4200,7 +4388,7 @@ The encoding is responsible for the correct character representation. You have not used %s anywhere in the verse order. Are you sure you want to save the song like this? - %sはバース順序で使われていません。本当にこの歌を保存しても宜しいですか? + %sはバース順序で使われていません。本当にこの賛美を保存しても宜しいですか? @@ -4246,82 +4434,82 @@ The encoding is responsible for the correct character representation. Song Export Wizard - + 賛美エキスポートガイド This wizard will help to export your songs to the open and free OpenLyrics worship song format. - + このガイドは、あなたの賛美がオープンなOpenLyrics worship song形式としてエキスポートする手伝いをします。 Select Songs - + 賛美を選択して下さい Check the songs you want to export. - + エキスポートしたい賛美をチェックして下さい。 Uncheck All - + すべてのチェックを外す Check All - + すべてをチェックする Select Directory - + フォルダを選択して下さい Select the directory you want the songs to be saved. - + 賛美を保存するフォルダを選択して下さい。 Directory: - + フォルダ: Exporting - + エキスポート中 Please wait while your songs are exported. - + 賛美をエキスポートしている間今しばらくお待ちください。 You need to add at least one Song to export. - + エキスポートする最低一つの賛美を選択する必要があります。 No Save Location specified - + 保存先が指定されていません Starting export... - + エキスポートを開始しています... You need to specify a directory. - + フォルダを選択して下さい。 Select Destination Folder - + 出力先フォルダを選択して下さい @@ -4334,12 +4522,12 @@ The encoding is responsible for the correct character representation. Song Import Wizard - 歌インポートガイド + 賛美インポートガイド This wizard will help you to import songs from a variety of formats. Click the next button below to start the process by selecting a format to import from. - このガイドは、様々なフォーマットの歌をインポートする手助けをします。次へをクリックし、インポートするファイルのフォーマットを選択してください。 + このガイドは、様々なフォーマットの賛美をインポートする手助けをします。次へをクリックし、インポートするファイルのフォーマットを選択してください。 @@ -4379,7 +4567,7 @@ The encoding is responsible for the correct character representation. Please wait while your songs are imported. - 歌がインポートされるまでしばらくお待ちください。 + 賛美がインポートされるまでしばらくお待ちください。 @@ -4404,27 +4592,27 @@ The encoding is responsible for the correct character representation. You need to specify at least one document or presentation file to import from. - + インポート対象となる最低一つのドキュメント又はプレゼンテーションファイルを選択する必要があります。 Songs Of Fellowship Song Files - + Songs Of Fellowship Song ファイル SongBeamer Files - + SongBeamerファイル SongShow Plus Song Files - + SongShow Plus Songファイル Foilpresenter Song Files - + Foilpresenter Song ファイル @@ -4442,12 +4630,12 @@ The encoding is responsible for the correct character representation. Lyrics - 歌詞 + 賛美詞 - + Delete Song(s)? - これらの歌を削除しますか? + これらの賛美を削除しますか? @@ -4457,13 +4645,13 @@ The encoding is responsible for the correct character representation. Entire Song - 歌全体 + 賛美全体 - + Are you sure you want to delete the %n selected song(s)? - 選択された%n件の歌を削除します。宜しいですか? + 選択された%n件の賛美を削除します。宜しいですか? @@ -4472,7 +4660,7 @@ The encoding is responsible for the correct character representation. Importing song %d of %d. - 歌(%d/%d)をインポートしています。 + 賛美(%d/%d)をインポートしています。 @@ -4480,7 +4668,7 @@ The encoding is responsible for the correct character representation. Exporting "%s"... - + 「%s」をエキスポートしています... @@ -4511,12 +4699,12 @@ The encoding is responsible for the correct character representation. Finished export. - + エキスポート完了。 Your song export failed. - + 賛美のエキスポートに失敗しました。 @@ -4532,7 +4720,7 @@ The encoding is responsible for the correct character representation. Your song import failed. - 歌のインポートに失敗しました。 + 賛美のインポートに失敗しました。 @@ -4595,7 +4783,7 @@ The encoding is responsible for the correct character representation. This author cannot be deleted, they are currently assigned to at least one song. - 最低一つの歌に割り振られているため、このアーティストを削除できませんでした。 + 最低一つの賛美に割り振られているため、このアーティストを削除できませんでした。 @@ -4610,7 +4798,7 @@ The encoding is responsible for the correct character representation. This topic cannot be deleted, it is currently assigned to at least one song. - 最低一つの歌に割り振られているため、このトピックを削除できませんでした。 + 最低一つの賛美に割り振られているため、このトピックを削除できませんでした。 @@ -4625,22 +4813,22 @@ The encoding is responsible for the correct character representation. This book cannot be deleted, it is currently assigned to at least one song. - 最低一つの歌に割り振られているため、このアルバムを削除できませんでした。 + 最低一つの賛美に割り振られているため、このアルバムを削除できませんでした。 The author %s already exists. Would you like to make songs with author %s use the existing author %s? - アーティスト%sは既に存在します。既存のアーティスト%sを用い、アーティスト%sで歌を作りますか? + アーティスト%sは既に存在します。既存のアーティスト%sを用い、アーティスト%sで賛美を作りますか? The topic %s already exists. Would you like to make songs with topic %s use the existing topic %s? - 題目%sは既に存在します。既存の題目%sを用い、題目%sで歌を作りますか? + 題目%sは既に存在します。既存の題目%sを用い、題目%sで賛美を作りますか? The book %s already exists. Would you like to make songs with book %s use the existing book %s? - アルバム%sは既に存在します。既存のアルバム%sを用い、アルバム%sで歌を作りますか? + アルバム%sは既に存在します。既存のアルバム%sを用い、アルバム%sで賛美を作りますか? @@ -4648,7 +4836,7 @@ The encoding is responsible for the correct character representation. Songs Mode - 歌モード + 賛美モード @@ -4663,12 +4851,12 @@ The encoding is responsible for the correct character representation. Update service from song edit - 編集後に礼拝を更新 + 編集後に礼拝プログラムを更新 Add missing songs when opening service - 礼拝を開いたときに存在しない歌を追加 + 礼拝プログラムを開いたときに存在しない賛美を追加 diff --git a/resources/i18n/ko.ts b/resources/i18n/ko.ts index 49645d279..106f9d685 100644 --- a/resources/i18n/ko.ts +++ b/resources/i18n/ko.ts @@ -153,28 +153,28 @@ Do you want to continue anyway? BibleDB.Wizard - + Importing testaments... %s - + Importing testaments... done. - + Importing books... %s - + Importing verses from %s... Importing verses from <book name>... - + Importing verses... done. @@ -520,7 +520,7 @@ Changes do not affect verses already in the service. - + Your Bible import failed. @@ -535,12 +535,12 @@ Changes do not affect verses already in the service. - + Starting Registering bible... - + Registered bible. Please note, that verses will be downloaded on demand and thus an internet connection is required. @@ -662,7 +662,7 @@ demand and thus an internet connection is required. BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... @@ -671,12 +671,12 @@ demand and thus an internet connection is required. BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... - + Importing %s %s... Importing <book name> <chapter>... @@ -1069,17 +1069,17 @@ OpenLP is written and maintained by volunteers. If you would like to see more fr - + Credits - + License - + Contribute @@ -1089,7 +1089,25 @@ OpenLP is written and maintained by volunteers. If you would like to see more fr - + + Copyright © 2004-2011 Raoul Snyman +Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, +Meinert Jordan, Andreas Preikschat, Christian Richter, Philip +Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund + + + + + 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 below for more details. + + + + Project Lead %s @@ -1105,6 +1123,35 @@ Testers Packagers %s +Translators + Afrikaans (af) + %s + German (de) + %s + English, United Kingdom (en_GB) + %s + English, South Africa (en_ZA) + %s + Estonian (et) + %s + French (fr) + %s + Hungarian (hu) + %s + Japanese (ja) + %s + Norwegian Bokmål (nb) + %s + Dutch (nl) + %s + Portuguese, Brazil (pt_BR) + %s + Russian (ru) + %s + +Documentation + %s + Built With Python: http://www.python.org/ Qt4: http://qt.nokia.com/ @@ -1124,24 +1171,6 @@ Final Credit He has set us free. - - - Copyright © 2004-2011 Raoul Snyman -Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, -Meinert Jordan, Andreas Preikschat, Christian Richter, Philip -Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund - - - - - 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 below for more details. - - OpenLP.AdvancedTab @@ -1390,6 +1419,157 @@ Version: %s + + OpenLP.FirstTimeLanguageForm + + + Initial Set up Language + + + + + Select the language you'd like to use in OpenLP. + + + + + OpenLP.FirstTimeWizard + + + Songs + + + + + Bibles + + + + + Themes + + + + + Starting Updates + + + + + Downloading %s + + + + + First Time Wizard + + + + + Welcome to the First Time Wizard + + + + + This wizard will help you to configure OpenLP for initial use . Click the next button below to start the process of selection your initial options. + + + + + Activate required Plugins + + + + + Select the Plugins you wish to use. + + + + + Custom Text + + + + + Bible + + + + + Images + + + + + Presentations + + + + + Media (Audio and Video) + + + + + Allow remote access + + + + + Monitor Song Usage + + + + + Allow Alerts + + + + + Download Samples from OpenLP.org + + + + + Select samples to downlaod and install for use. + + + + + No Internet connection found so unable to download any default files. + + + + + Download Example Files + + + + + Default Settings + + + + + Set up default values to be used by OpenLP + + + + + Default output display + + + + + Select the default Theme + + + + + Press finish to apply all your changes and start OpenLP + + + OpenLP.GeneralTab @@ -1511,12 +1691,12 @@ Version: %s OpenLP.LanguageManager - + Language - + Please restart OpenLP to use your new language setting. @@ -1877,29 +2057,29 @@ Version: %s - + Version %s of OpenLP is now available for download (you are currently running version %s). You can download the latest version from http://openlp.org/. - + OpenLP Version Updated - + OpenLP Main Display Blanked - + The Main Display has been blanked out - + Default Theme: %s @@ -1915,12 +2095,12 @@ You can download the latest version from http://openlp.org/. - + Close OpenLP - + Are you sure you want to close OpenLP? @@ -2242,17 +2422,17 @@ The content encoding is not UTF-8. - + Missing Display Handler - + Your item cannot be displayed as there is no handler to display it - + Your item cannot be displayed as the plugin required to display it is missing or inactive @@ -2409,57 +2589,57 @@ The content encoding is not UTF-8. OpenLP.SlideController - + Move to previous - + Move to next - + Hide - + Move to live - + Start continuous loop - + Stop continuous loop - + Delay between slides in seconds - + Start playing media - + Go To - + Edit and reload song preview - + Blank Screen @@ -2469,32 +2649,32 @@ The content encoding is not UTF-8. - + Show Desktop - + Previous Slide - + Next Slide - + Previous Service - + Next Service - + Escape Item @@ -2641,68 +2821,68 @@ The content encoding is not UTF-8. - + %s (default) - + You must select a theme to edit. - + You are unable to delete the default theme. - + You have not selected a theme. - + Save Theme - (%s) - + Theme Exported - + Your theme has been successfully exported. - + Theme Export Failed - + Your theme could not be exported due to an error. - + Select Theme Import File - + File is not a valid theme. The content encoding is not UTF-8. - + File is not a valid theme. - + Theme %s is used in the %s plugin. @@ -2722,47 +2902,47 @@ The content encoding is not UTF-8. - + You must select a theme to rename. - + Rename Confirmation - + Rename %s theme? - + You must select a theme to delete. - + Delete Confirmation - + Delete %s theme? - + Validation Error - + A theme with this name already exists. - + OpenLP Themes (*.theme *.otz) @@ -4405,7 +4585,7 @@ The encoding is responsible for the correct character representation. - + Delete Song(s)? @@ -4420,7 +4600,7 @@ The encoding is responsible for the correct character representation. - + Are you sure you want to delete the %n selected song(s)? diff --git a/resources/i18n/nb.ts b/resources/i18n/nb.ts index 5eea1673d..ae049959d 100644 --- a/resources/i18n/nb.ts +++ b/resources/i18n/nb.ts @@ -153,28 +153,28 @@ Do you want to continue anyway? BibleDB.Wizard - + Importing testaments... %s - + Importing testaments... done. - + Importing books... %s - + Importing verses from %s... Importing verses from <book name>... - + Importing verses... done. @@ -519,7 +519,7 @@ Changes do not affect verses already in the service. Bibelen eksisterer - + Your Bible import failed. Bibelimporteringen mislyktes. @@ -534,12 +534,12 @@ Changes do not affect verses already in the service. - + Starting Registering bible... - + Registered bible. Please note, that verses will be downloaded on demand and thus an internet connection is required. @@ -661,7 +661,7 @@ demand and thus an internet connection is required. BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... @@ -670,12 +670,12 @@ demand and thus an internet connection is required. BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... - + Importing %s %s... Importing <book name> <chapter>... @@ -1068,17 +1068,17 @@ OpenLP is written and maintained by volunteers. If you would like to see more fr - + Credits - + License Lisens - + Contribute @@ -1088,7 +1088,25 @@ OpenLP is written and maintained by volunteers. If you would like to see more fr - + + Copyright © 2004-2011 Raoul Snyman +Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, +Meinert Jordan, Andreas Preikschat, Christian Richter, Philip +Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund + + + + + 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 below for more details. + + + + Project Lead %s @@ -1104,6 +1122,35 @@ Testers Packagers %s +Translators + Afrikaans (af) + %s + German (de) + %s + English, United Kingdom (en_GB) + %s + English, South Africa (en_ZA) + %s + Estonian (et) + %s + French (fr) + %s + Hungarian (hu) + %s + Japanese (ja) + %s + Norwegian Bokmål (nb) + %s + Dutch (nl) + %s + Portuguese, Brazil (pt_BR) + %s + Russian (ru) + %s + +Documentation + %s + Built With Python: http://www.python.org/ Qt4: http://qt.nokia.com/ @@ -1123,24 +1170,6 @@ Final Credit He has set us free. - - - Copyright © 2004-2011 Raoul Snyman -Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, -Meinert Jordan, Andreas Preikschat, Christian Richter, Philip -Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund - - - - - 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 below for more details. - - OpenLP.AdvancedTab @@ -1389,6 +1418,157 @@ Version: %s + + OpenLP.FirstTimeLanguageForm + + + Initial Set up Language + + + + + Select the language you'd like to use in OpenLP. + + + + + OpenLP.FirstTimeWizard + + + Songs + + + + + Bibles + + + + + Themes + + + + + Starting Updates + + + + + Downloading %s + + + + + First Time Wizard + + + + + Welcome to the First Time Wizard + + + + + This wizard will help you to configure OpenLP for initial use . Click the next button below to start the process of selection your initial options. + + + + + Activate required Plugins + + + + + Select the Plugins you wish to use. + + + + + Custom Text + + + + + Bible + + + + + Images + + + + + Presentations + + + + + Media (Audio and Video) + + + + + Allow remote access + + + + + Monitor Song Usage + + + + + Allow Alerts + + + + + Download Samples from OpenLP.org + + + + + Select samples to downlaod and install for use. + + + + + No Internet connection found so unable to download any default files. + + + + + Download Example Files + + + + + Default Settings + + + + + Set up default values to be used by OpenLP + + + + + Default output display + + + + + Select the default Theme + + + + + Press finish to apply all your changes and start OpenLP + + + OpenLP.GeneralTab @@ -1510,12 +1690,12 @@ Version: %s OpenLP.LanguageManager - + Language - + Please restart OpenLP to use your new language setting. @@ -1876,29 +2056,29 @@ Version: %s - + Version %s of OpenLP is now available for download (you are currently running version %s). You can download the latest version from http://openlp.org/. - + OpenLP Version Updated OpenLP versjonen har blitt oppdatert - + OpenLP Main Display Blanked - + The Main Display has been blanked out - + Default Theme: %s @@ -1914,12 +2094,12 @@ You can download the latest version from http://openlp.org/. - + Close OpenLP - + Are you sure you want to close OpenLP? @@ -2241,17 +2421,17 @@ The content encoding is not UTF-8. - + Missing Display Handler - + Your item cannot be displayed as there is no handler to display it - + Your item cannot be displayed as the plugin required to display it is missing or inactive @@ -2408,57 +2588,57 @@ The content encoding is not UTF-8. OpenLP.SlideController - + Move to previous Flytt til forrige - + Move to next - + Hide - + Move to live - + Start continuous loop Start kontinuerlig løkke - + Stop continuous loop - + Delay between slides in seconds Forsinkelse mellom lysbilder i sekund - + Start playing media Start avspilling av media - + Go To - + Edit and reload song preview - + Blank Screen @@ -2468,32 +2648,32 @@ The content encoding is not UTF-8. - + Show Desktop - + Previous Slide - + Next Slide - + Previous Service - + Next Service - + Escape Item @@ -2640,68 +2820,68 @@ The content encoding is not UTF-8. - + %s (default) - + You must select a theme to edit. - + You are unable to delete the default theme. Du kan ikke slette det globale temaet - + You have not selected a theme. - + Save Theme - (%s) - + Theme Exported - + Your theme has been successfully exported. - + Theme Export Failed - + Your theme could not be exported due to an error. - + Select Theme Import File - + File is not a valid theme. The content encoding is not UTF-8. - + File is not a valid theme. Filen er ikke et gyldig tema. - + Theme %s is used in the %s plugin. @@ -2721,47 +2901,47 @@ The content encoding is not UTF-8. - + You must select a theme to rename. - + Rename Confirmation - + Rename %s theme? - + You must select a theme to delete. - + Delete Confirmation - + Delete %s theme? - + Validation Error - + A theme with this name already exists. - + OpenLP Themes (*.theme *.otz) @@ -4404,7 +4584,7 @@ The encoding is responsible for the correct character representation. - + Delete Song(s)? @@ -4419,7 +4599,7 @@ The encoding is responsible for the correct character representation. - + Are you sure you want to delete the %n selected song(s)? diff --git a/resources/i18n/nl.ts b/resources/i18n/nl.ts index 75f10b76f..c39446796 100644 --- a/resources/i18n/nl.ts +++ b/resources/i18n/nl.ts @@ -12,18 +12,19 @@ Toch doorgaan? No Parameter Found - + geen parameters gevonden No Placeholder Found - + niet gevonden The alert text does not contain '<>'. Do you want to continue anyway? - + De waarschuwing bevat geen '<>'. +Toch doorgaan? @@ -154,30 +155,30 @@ Do you want to continue anyway? BibleDB.Wizard - + Importing testaments... %s - + Testament importeren... %s - + Importing testaments... done. - + Importeren testamenten... klaar. - + Importing books... %s - + Importeren bijbelboeken... %s - + Importing verses from %s... Importing verses from <book name>... - + Importeren bijbelverzen uit %s... - + Importing verses... done. - + Importeren bijbelverzen... klaar. @@ -190,7 +191,7 @@ Do you want to continue anyway? Parse Error - Parse fout + Verwerkingsfout @@ -331,7 +332,14 @@ Book Chapter:Verse-Verse Book Chapter:Verse-Verse,Verse-Verse Book Chapter:Verse-Verse,Chapter:Verse-Verse Book Chapter:Verse-Chapter:Verse - + De opgegeven tekstverwijzing wordt niet herkend door OpenLP of is ongeldig. Gebruik een van onderstaande patronen: + +Boek Hoofdstuk +Boek Hoofdstuk-Hoofdstuk +Boek Hoofdstuk:Vers-Vers +Boek Hoofdstuk:Vers-Vers,Vers-Vers +Boek Hoofdstuk:Vers-Vers,Hoofdstuk:Vers-Vers +Boek Hoofdstuk:Vers-Hoofdstuk:Vers @@ -517,7 +525,7 @@ Deze wijzigingen hebben geen betrekking op bijbelverzen die al in de liturgie zi Deze bijbelvertaling bestaat reeds - + Your Bible import failed. Het importeren is mislukt. @@ -537,12 +545,12 @@ Deze wijzigingen hebben geen betrekking op bijbelverzen die al in de liturgie zi Deze bijbel bestaat reeds. Geef een andere naam of verwijder eerst het bestaande exemplaar. - + Starting Registering bible... Start registreren Bijbel... - + Registered bible. Please note, that verses will be downloaded on demand and thus an internet connection is required. Registratie afgerond. @@ -566,27 +574,27 @@ N.B. bijbelteksten worden gedownload indien nodig internetverbinding is dus nood Bible file: - + Bijbel bestand: Testaments file: - + Testamenten bestand: Books file: - + Bijbelboeken bestand: Verses file: - + Bijbelverzen bestand: You have not specified a testaments file. Do you want to proceed with the import? - + Geen testament bestand opgegeven. Toch importeren? @@ -659,13 +667,13 @@ N.B. bijbelteksten worden gedownload indien nodig internetverbinding is dus nood Scripture Reference - + Schriftverwijzing BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... %s %s wordt geïmporteerd... @@ -674,12 +682,12 @@ N.B. bijbelteksten worden gedownload indien nodig internetverbinding is dus nood BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... Tekstcodering detecteren (dat kan even duren)... - + Importing %s %s... Importing <book name> <chapter>... %s %s wordt geïmporteerd... @@ -896,7 +904,7 @@ N.B. bijbelteksten worden gedownload indien nodig internetverbinding is dus nood Select Attachment - + Selecteer bijlage @@ -1035,7 +1043,7 @@ De andere afbeeldingen alsnog toevoegen? Videos (%s);;Audio (%s);;%s (*) - + Video’s (%s);;Audio (%s);;%s (*) @@ -1070,7 +1078,7 @@ OpenLP is free church presentation software, or lyrics projection software, used Find out more about OpenLP: http://openlp.org/ OpenLP is written and maintained by volunteers. If you would like to see more free Christian software being written, please consider contributing by using the button below. - OpenLP <version><revision> - Open Source Lyrics Projection + OpenLP <version><revision> - Open Source Lyrics Projection OpenLP is free church presentation software, or lyrics projection software, used to display slides of songs, Bible verses, videos, images, and even presentations (if OpenOffice.org, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -1079,17 +1087,17 @@ Find out more about OpenLP: http://openlp.org/ OpenLP is written and maintained by volunteers. If you would like to see more free Christian software being written, please consider contributing by using the button below. - + Credits - Credits + Credits - + License Licentie - + Contribute Bijdragen @@ -1099,7 +1107,28 @@ OpenLP is written and maintained by volunteers. If you would like to see more fr build %s - + + Copyright © 2004-2011 Raoul Snyman +Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, +Meinert Jordan, Andreas Preikschat, Christian Richter, Philip +Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund + Copyright © 2004-2011 Raoul Snyman +Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, +Meinert Jordan, Andreas Preikschat, Christian Richter, Philip +Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund + + + + 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 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 below for more details. + 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 below for more details. + + + Project Lead %s @@ -1115,6 +1144,35 @@ Testers Packagers %s +Translators + Afrikaans (af) + %s + German (de) + %s + English, United Kingdom (en_GB) + %s + English, South Africa (en_ZA) + %s + Estonian (et) + %s + French (fr) + %s + Hungarian (hu) + %s + Japanese (ja) + %s + Norwegian Bokmål (nb) + %s + Dutch (nl) + %s + Portuguese, Brazil (pt_BR) + %s + Russian (ru) + %s + +Documentation + %s + Built With Python: http://www.python.org/ Qt4: http://qt.nokia.com/ @@ -1134,24 +1192,6 @@ Final Credit He has set us free. - - - Copyright © 2004-2011 Raoul Snyman -Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, -Meinert Jordan, Andreas Preikschat, Christian Richter, Philip -Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund - - - - - 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 below for more details. - - OpenLP.AdvancedTab @@ -1193,27 +1233,27 @@ Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frod Hide mouse cursor when over display window - + Verberg muisaanwijzer in het weergave venster Default Image - + standaard afbeelding Background color: - Achtergrondkleur: + Achtergrondkleur: Image file: - + Afbeeldingsbestand: Open File - Open bestand + Open bestand @@ -1221,52 +1261,52 @@ Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frod Edit Selection - Bewerk selectie + Bewerk selectie Update - Update + Update Description - Omschrijving + Omschrijving Tag - Tag + Tag Start tag - Start tag + Start tag End tag - Eind tag + Eind tag Default - Standaard + Standaard Tag id - Tag id + Tag id Start Html - Start Html + Start Html End Html - Eind Html + Eind Html @@ -1402,6 +1442,157 @@ Version: %s Bestand kopiëren + + OpenLP.FirstTimeLanguageForm + + + Initial Set up Language + + + + + Select the language you'd like to use in OpenLP. + + + + + OpenLP.FirstTimeWizard + + + Songs + + + + + Bibles + + + + + Themes + + + + + Starting Updates + + + + + Downloading %s + + + + + First Time Wizard + + + + + Welcome to the First Time Wizard + + + + + This wizard will help you to configure OpenLP for initial use . Click the next button below to start the process of selection your initial options. + + + + + Activate required Plugins + + + + + Select the Plugins you wish to use. + + + + + Custom Text + + + + + Bible + bijbeltekst + + + + Images + + + + + Presentations + + + + + Media (Audio and Video) + + + + + Allow remote access + + + + + Monitor Song Usage + + + + + Allow Alerts + + + + + Download Samples from OpenLP.org + + + + + Select samples to downlaod and install for use. + + + + + No Internet connection found so unable to download any default files. + + + + + Download Example Files + + + + + Default Settings + + + + + Set up default values to be used by OpenLP + + + + + Default output display + + + + + Select the default Theme + + + + + Press finish to apply all your changes and start OpenLP + + + OpenLP.GeneralTab @@ -1523,12 +1714,12 @@ Version: %s OpenLP.LanguageManager - + Language Taal - + Please restart OpenLP to use your new language setting. Start OpenLP opnieuw op om de nieuwe taalinstellingen te gebruiken. @@ -1889,27 +2080,27 @@ Version: %s Weergave modus naar Live. - + OpenLP Version Updated Nieuwe OpenLP versie beschikbaar - + OpenLP Main Display Blanked OpenLP projectie op zwart - + The Main Display has been blanked out Projectie is uitgeschakeld: scherm staat op zwart - + Default Theme: %s Standaardthema: %s - + Version %s of OpenLP is now available for download (you are currently running version %s). You can download the latest version from http://openlp.org/. @@ -1929,12 +2120,12 @@ U kunt de laatste versie op http://openlp.org/ downloaden. &Sneltoetsen instellen... - + Close OpenLP OpenLP afsluiten - + Are you sure you want to close OpenLP? OpenLP afsluiten? @@ -2257,17 +2448,17 @@ Tekst codering is geen UTF-8. Geen geldig liturgie bestand. - + Missing Display Handler Ontbrekende weergave regelaar - + Your item cannot be displayed as there is no handler to display it Dit onderdeel kan niet weergegeven worden, omdat er een regelaar ontbreekt - + Your item cannot be displayed as the plugin required to display it is missing or inactive Dit onderdeel kan niet weergegeven worden omdat de benodigde plugin ontbreekt of inactief is @@ -2424,57 +2615,57 @@ Tekst codering is geen UTF-8. OpenLP.SlideController - + Move to previous Naar vorige - + Move to next Naar volgende - + Hide Verbergen - + Move to live Naar Live - + Start continuous loop Start doorlopende diashow - + Stop continuous loop Stop doorlopende diashow - + Delay between slides in seconds Vertraging tussen dia's in seconden - + Start playing media Start afspelen media - + Go To Ga naar - + Edit and reload song preview Bewerk en lied voorbeeld opnieuw weergeven - + Blank Screen Zwart scherm @@ -2484,32 +2675,32 @@ Tekst codering is geen UTF-8. Zwart naar thema - + Show Desktop Toon bureaublad - + Previous Slide Vorige dia - + Next Slide Volgende dia - + Previous Service Vorige liturgie - + Next Service Volgende liturgie - + Escape Item Onderdeel annuleren @@ -2656,69 +2847,69 @@ Tekst codering is geen UTF-8. Instellen als al&gemene standaard - + %s (default) %s (standaard) - + You must select a theme to edit. Selecteer een thema om te bewerken. - + You are unable to delete the default theme. Het standaard thema kan niet worden verwijderd. - + You have not selected a theme. Selecteer een thema. - + Save Theme - (%s) Thema opslaan - (%s) - + Theme Exported Thema geëxporteerd - + Your theme has been successfully exported. Exporteren thema is gelukt. - + Theme Export Failed Exporteren thema is mislukt - + Your theme could not be exported due to an error. Thema kan niet worden geëxporteerd als gevolg van een fout. - + Select Theme Import File Selecteer te importeren thema bestand - + File is not a valid theme. The content encoding is not UTF-8. Geen geldig thema bestand. Tekst codering is geen UTF-8. - + File is not a valid theme. Geen geldig thema bestand. - + Theme %s is used in the %s plugin. Thema %s wordt gebruikt in de %s plugin. @@ -2738,47 +2929,47 @@ Tekst codering is geen UTF-8. &Exporteer thema - + You must select a theme to rename. Selecteer een thema om te hernoemen. - + Rename Confirmation Bevestig hernoemen - + Rename %s theme? %s thema hernoemen? - + You must select a theme to delete. Selecteer een thema om te verwijderen. - + Delete Confirmation Bevestig verwijderen - + Delete %s theme? %s thema verwijderen? - + Validation Error Validatie fout - + A theme with this name already exists. Er bestaat al een thema met deze naam. - + OpenLP Themes (*.theme *.otz) @@ -3124,7 +3315,7 @@ Tekst codering is geen UTF-8. Import - Import + Importeren @@ -3134,7 +3325,7 @@ Tekst codering is geen UTF-8. Live - Live + Live @@ -3154,7 +3345,7 @@ Tekst codering is geen UTF-8. OpenLP 2.0 - OpenLP 2.0 + OpenLP 2.0 @@ -3255,7 +3446,7 @@ Tekst codering is geen UTF-8. pt Abbreviated font pointsize unit - pt + pt @@ -3304,7 +3495,7 @@ Tekst codering is geen UTF-8. openlp.org 1.x - openlp.org 1.x + openlp.org 1.x @@ -3340,7 +3531,7 @@ Tekst codering is geen UTF-8. You must select an item to edit. - You must select an item to edit. + Selecteer iets om te bewerken. @@ -3377,7 +3568,7 @@ Tekst codering is geen UTF-8. Importing "%s"... - Importing "%s"... + Importeren "%s"... @@ -4149,37 +4340,37 @@ Meestal voldoet de suggestie van OpenLP. You have not used %s anywhere in the verse order. Are you sure you want to save the song like this? - You have not used %s anywhere in the verse order. Are you sure you want to save the song like this? + U heeft %s nergens in de vers volgorde gebruikt. Weet u zeker dat u dit lied zo wilt opslaan? Alt&ernate title: - Alt&ernate title: + Afwiss&elende titel: &Verse order: - &Verse order: + &Vers volgorde: &Manage Authors, Topics, Song Books - &Manage Authors, Topics, Song Books + &Beheer auteurs, onderwerpen, liedboeken Authors, Topics && Song Book - Authors, Topics && Song Book + Auteurs, onderwerpen && liedboeken This author is already in the list. - This author is already in the list. + Deze auteur staat al in de lijst. This topic is already in the list. - This topic is already in the list. + Dit onderwerp staat al in de lijst. @@ -4194,12 +4385,12 @@ Meestal voldoet de suggestie van OpenLP. You need to have an author for this song. - You need to have an author for this song. + Iemand heeft dit lied geschreven. You need to type some text in to the verse. - You need to type some text in to the verse. + Er moet toch een tekst zijn om te zingen. @@ -4225,82 +4416,82 @@ Meestal voldoet de suggestie van OpenLP. Song Export Wizard - + Lied Exporteer Assistent This wizard will help to export your songs to the open and free OpenLyrics worship song format. - + Deze assistent helpt u uw liederen te exporteren naar het openen vrije OpenLyrics worship lied bestand formaat. Select Songs - + Selecteer liederen Uncheck All - + Deselecteer alles Check All - + Selecteer alles Select Directory - + Selecteer map Select the directory you want the songs to be saved. - + Selecteer de map waar de liederen moet worden bewaard. Directory: - + Map: Exporting - + Exporteren Please wait while your songs are exported. - + Even wachten terwijl de liederen worden geëxporteerd. You need to add at least one Song to export. - + Kies minstens een lied om te exporteren. No Save Location specified - + Niet opgegeven waar bestand moet worden bewaard Starting export... - + Start exporteren... Check the songs you want to export. - + Selecteer de liederen die u wilt exporteren. You need to specify a directory. - + Geef aan waar het bestand moet worden opgeslagen. Select Destination Folder - + Selecteer een doelmap @@ -4308,12 +4499,12 @@ Meestal voldoet de suggestie van OpenLP. Song Import Wizard - Lied import assistent + Lied importeer assistent This wizard will help you to import songs from a variety of formats. Click the next button below to start the process by selecting a format to import from. - This wizard will help you to import songs from a variety of formats. Click the next button below to start the process by selecting a format to import from. + Deze assistent helpt liederen in verschillende bestandsformaten te importeren in OpenLP. Klik op volgende en kies daarna het bestandsformaat van het te importeren lied. @@ -4333,12 +4524,12 @@ Meestal voldoet de suggestie van OpenLP. Please wait while your songs are imported. - Please wait while your songs are imported. + Even geduld tijdens het importeren. Select Document/Presentation Files - Select Document/Presentation Files + Selecteer Documenten/Presentatie bestanden @@ -4424,7 +4615,7 @@ Meestal voldoet de suggestie van OpenLP. Liedtekst - + Delete Song(s)? Delete Song(s)? @@ -4439,10 +4630,10 @@ Meestal voldoet de suggestie van OpenLP. Gehele lied - + Are you sure you want to delete the %n selected song(s)? - - Are you sure you want to delete the %n selected song(s)? + + Weet u zeker dat u deze %n lied(eren) wilt verwijderen? diff --git a/resources/i18n/pt_BR.ts b/resources/i18n/pt_BR.ts index d12f18edc..a36e643a5 100644 --- a/resources/i18n/pt_BR.ts +++ b/resources/i18n/pt_BR.ts @@ -12,18 +12,19 @@ Ainda deseja continuar? No Parameter Found - + Nenhum Parâmetro Encontrado No Placeholder Found - + Nenhum Marcador de Posição Encontrado The alert text does not contain '<>'. Do you want to continue anyway? - + O texto de alerta não contém '<>'. +Você gostaria de continuar de qualquer maneira? @@ -154,28 +155,28 @@ Do you want to continue anyway? BibleDB.Wizard - + Importing testaments... %s Importando testamentos... %s - + Importing testaments... done. Importando testamentos... concluído. - + Importing books... %s Importando livros... %s - + Importing verses from %s... Importing verses from <book name>... Importando versículos de %s... - + Importing verses... done. Importando versículos... concluído. @@ -246,7 +247,7 @@ Do you want to continue anyway? Delete the selected Bible - Deletar a Bíblia selecionada + Excluir a Bíblia selecionada @@ -331,7 +332,14 @@ Book Chapter:Verse-Verse Book Chapter:Verse-Verse,Verse-Verse Book Chapter:Verse-Verse,Chapter:Verse-Verse Book Chapter:Verse-Chapter:Verse - + A sua referência das escrituras é inválida ou não é suportada pelo OpenLP. Por favor certifique-se que ela está de acordo com um dos seguintes padrões: + +Capítulo do Livro +Capítulo do Lívro-Capítulo +Capítulo do Livro:Versículo-Versículo +Capítulo do Livro:Versículo-Versículo,Versículo-Versículo +Capítulo do Livro:Versículo-Versículo,Capítulo:Versículo-Versículo +Capítulo do Livro:Versículo-Capítulo:Versículo @@ -406,7 +414,7 @@ Book Chapter:Verse-Chapter:Verse Note: Changes do not affect verses already in the service. Nota: -Mudanças não afetam os versículos que já estão no culto. +Mudanças não afetam os versículos que já estão na lista de exibição. @@ -522,7 +530,7 @@ Mudanças não afetam os versículos que já estão no culto. Bíblia Existe - + Your Bible import failed. A sua Importação da Bíblia falhou. @@ -537,12 +545,12 @@ Mudanças não afetam os versículos que já estão no culto. Esta Bíblia já existe. Importe uma Bíblia diferente ou apague a existente primeiro. - + Starting Registering bible... Registrando Bíblia... - + Registered bible. Please note, that verses will be downloaded on demand and thus an internet connection is required. Bíblia registrada. Note que os versos serão baixados de acordo @@ -566,7 +574,7 @@ com o uso, portanto uma conexão com a internet é necessária. Bible file: - Arquivo de Bíblia + Arquivo de Bíblia: @@ -654,18 +662,18 @@ com o uso, portanto uma conexão com a internet é necessária. Second: - Segundo: + Segundo: Scripture Reference - + Referência da Escritura BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... Importando %s %s... @@ -674,12 +682,12 @@ com o uso, portanto uma conexão com a internet é necessária. BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... Detectando codificação (isto pode levar alguns minutos)... - + Importing %s %s... Importing <book name> <chapter>... Importando %s %s... @@ -690,7 +698,7 @@ com o uso, portanto uma conexão com a internet é necessária. <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way songs are. This plugin provides greater freedom over the songs plugin. - <strong>Plugin Personalizado</strong><br />O plugin personalizado permite criar slides de texto que são apresentados da mesma maneira que as músicas. Este plugin permite mais liberdade do que o plugin de músicas. + <strong>Plugin Personalizado</strong><br />O plugin personalizado permite criar slides de texto que são apresentados da mesma maneira que as músicas. Este plugin permite mais liberdade do que o plugin de músicas. @@ -821,13 +829,13 @@ com o uso, portanto uma conexão com a internet é necessária. Customs name plural - + Customizados Custom container title - Customizado + Customizado @@ -835,7 +843,7 @@ com o uso, portanto uma conexão com a internet é necessária. <strong>Image Plugin</strong><br />The image plugin provides displaying of images.<br />One of the distinguishing features of this plugin is the ability to group a number of images together in the service manager, making the displaying of multiple images easier. This plugin can also make use of OpenLP's "timed looping" feature to create a slide show that runs automatically. In addition to this, images from the plugin can be used to override the current theme's background, which renders text-based items like songs with the selected image as a background instead of the background provided by the theme. - <strong>Plugin de Imagens</strong><br />O plugin de imagens fornece a exibição de imagens,<br />Uma das funcionalidades importantes deste plugin é a habilidade de agrupar várias imagens na Lista de Exibição, facilitando a exibição de várias imagens. Este plugin também pode usar a funcionalidade de "loop temporizado" do OpenLP para criar uma apresentação de slides que é executada automaticamente. Além disso, imagens do plugin podem ser usadas em sobreposição ao plano de fundo do tema atual, exibindo itens baseados em texto como músicas com a imagem selecionada ao fundo ao invés do plano de fundo fornecido pelo tema. + <strong>Plugin de Imagens</strong><br />O plugin de imagens fornece a exibição de imagens.<br />Uma das funcionalidades importantes deste plugin é a habilidade de agrupar várias imagens na Lista de Exibição, facilitando a exibição de várias imagens. Este plugin também pode usar a funcionalidade de "loop temporizado" do OpenLP para criar uma apresentação de slides que é executada automaticamente. Além disso, imagens do plugin podem ser usadas em sobreposição ao plano de fundo do tema atual, exibindo itens baseados em texto como músicas com a imagem selecionada ao fundo ao invés do plano de fundo fornecido pelo tema. @@ -855,12 +863,12 @@ com o uso, portanto uma conexão com a internet é necessária. Delete the selected Image - Deletar a Imagem selecionada + Excluir a Imagem selecionada Preview the selected Image - Pré-Visualizar a Imagem selecionada + Visualizar a Imagem selecionada @@ -1025,7 +1033,7 @@ Deseja continuar adicionando as outras imagens? You must select a media file to replace the background with. - Você precisa selecionar um arquivo de mídia para definir como plano de fundo. + Você precisa selecionar um arquivo de mídia para substituir o plano de fundo. @@ -1035,7 +1043,7 @@ Deseja continuar adicionando as outras imagens? Videos (%s);;Audio (%s);;%s (*) - + Vídeos (%s);;Áudio (%s);;%s (*) @@ -1043,7 +1051,7 @@ Deseja continuar adicionando as outras imagens? Media Display - Exibição de Mídia + Exibição de Mídia @@ -1079,17 +1087,17 @@ Conheça mais sobre o OpenLP: http://openlp.org/ O OpenLP é escrito e mantido por voluntários. Se você gostaria de contribuir para mais softwares livres Cristãos serem produzidos, considere contribuir usando o botão abaixo. - + Credits Créditos - + License Licença - + Contribute Contribuir @@ -1099,7 +1107,28 @@ O OpenLP é escrito e mantido por voluntários. Se você gostaria de contribuir compilação %s - + + Copyright © 2004-2011 Raoul Snyman +Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, +Meinert Jordan, Andreas Preikschat, Christian Richter, Philip +Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund + Direitos Autorais © 2004-2011 Raoul Snyman +Porções de Direitos Autorais © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, +Meinert Jordan, Andreas Preikschat, Christian Richter, Philip +Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund + + + + 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. + Este programa é um software livre; você pode redistribui-lo e/ou modifica-lo dentro dos termos da Licença Pública Geral GNU como publicada pela Fundação do Software Livre (FSF); na versão 2 da Licença. + + + + 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 below for more details. + Este programa é distribuido na esperança que será útil, mas SEM NENHUMA GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou ADEQUAÇÃO PARA UM DETERMINADO FIM. Veja abaixo para maiores detalhes. + + + Project Lead %s @@ -1115,6 +1144,35 @@ Testers Packagers %s +Translators + Afrikaans (af) + %s + German (de) + %s + English, United Kingdom (en_GB) + %s + English, South Africa (en_ZA) + %s + Estonian (et) + %s + French (fr) + %s + Hungarian (hu) + %s + Japanese (ja) + %s + Norwegian Bokmål (nb) + %s + Dutch (nl) + %s + Portuguese, Brazil (pt_BR) + %s + Russian (ru) + %s + +Documentation + %s + Built With Python: http://www.python.org/ Qt4: http://qt.nokia.com/ @@ -1134,24 +1192,6 @@ Final Credit He has set us free. - - - Copyright © 2004-2011 Raoul Snyman -Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, -Meinert Jordan, Andreas Preikschat, Christian Richter, Philip -Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund - - - - - 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 below for more details. - - OpenLP.AdvancedTab @@ -1183,7 +1223,7 @@ Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frod Enable application exit confirmation - Habilitar confirmação de saída do programa + Habilitar confirmação de saída do programa @@ -1193,27 +1233,27 @@ Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frod Hide mouse cursor when over display window - + Ocultar o cursor do mouse quando estiver sobre a tela de exibição Default Image - + Imagem Padrão Background color: - Cor do plano de fundo: + Cor do plano de fundo: Image file: - + Arquivo de Imagem: Open File - Abrir Arquivo + Abrir Arquivo @@ -1221,52 +1261,52 @@ Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frod Edit Selection - Editar Seleção + Editar Seleção Update - Update + Atualizar Description - Descrição + Descrição Tag - + Etiqueta Start tag - + Etiqueta Inicial End tag - + Etiqueta Final Default - Padrão + Padrão Tag id - + Id da Etiqueta Start Html - + Html Inicial End Html - + Html Final @@ -1279,12 +1319,12 @@ Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frod Tag "n" already defined. - + Etiqueta "n" já está definida. Tag %s already defined. - + Etiqueta %s já está definida. @@ -1429,6 +1469,157 @@ Agradecemos se for possível escrever seu relatório em inglês. Copiar arquivo + + OpenLP.FirstTimeLanguageForm + + + Initial Set up Language + + + + + Select the language you'd like to use in OpenLP. + + + + + OpenLP.FirstTimeWizard + + + Songs + Músicas + + + + Bibles + Bíblias + + + + Themes + Temas + + + + Starting Updates + + + + + Downloading %s + + + + + First Time Wizard + + + + + Welcome to the First Time Wizard + + + + + This wizard will help you to configure OpenLP for initial use . Click the next button below to start the process of selection your initial options. + + + + + Activate required Plugins + + + + + Select the Plugins you wish to use. + + + + + Custom Text + + + + + Bible + Bíblia + + + + Images + Imagens + + + + Presentations + Apresentações + + + + Media (Audio and Video) + + + + + Allow remote access + + + + + Monitor Song Usage + + + + + Allow Alerts + + + + + Download Samples from OpenLP.org + + + + + Select samples to downlaod and install for use. + + + + + No Internet connection found so unable to download any default files. + + + + + Download Example Files + + + + + Default Settings + + + + + Set up default values to be used by OpenLP + + + + + Default output display + + + + + Select the default Theme + + + + + Press finish to apply all your changes and start OpenLP + + + OpenLP.GeneralTab @@ -1550,12 +1741,12 @@ Agradecemos se for possível escrever seu relatório em inglês. OpenLP.LanguageManager - + Language Idioma - + Please restart OpenLP to use your new language setting. Por favor reinicie o OpenLP para usar a nova configuração de idioma. @@ -1763,7 +1954,7 @@ Agradecemos se for possível escrever seu relatório em inglês. Toggle Service Manager - Alternar para o Gerenciador de Lista de Exibição + Alternar a Lista de Exibição @@ -1788,7 +1979,7 @@ Agradecemos se for possível escrever seu relatório em inglês. Toggle the visibility of the preview panel. - Alternar a visibilidade da coluna de pré-visualização. + Alternar a visibilidade da coluna de pré-visualização. @@ -1916,7 +2107,7 @@ Agradecemos se for possível escrever seu relatório em inglês. Configurar o modo de visualização como Projeção. - + Version %s of OpenLP is now available for download (you are currently running version %s). You can download the latest version from http://openlp.org/. @@ -1925,22 +2116,22 @@ You can download the latest version from http://openlp.org/. Voce pode baixar a versão mais nova em http://openlp.org/. - + OpenLP Version Updated Versão do OpenLP Atualizada - + OpenLP Main Display Blanked Tela Principal do OpenLP em Branco - + The Main Display has been blanked out A Tela Principal foi apagada - + Default Theme: %s Tema padrão: %s @@ -1948,7 +2139,7 @@ Voce pode baixar a versão mais nova em http://openlp.org/. English Please add the name of your language here - Português + Português (Brasil) @@ -1956,19 +2147,19 @@ Voce pode baixar a versão mais nova em http://openlp.org/. Configurar &Atalhos... - + Close OpenLP Fechar o OpenLP - + Are you sure you want to close OpenLP? - Você tem certeza de que quer fechar o OpenLP? + Você tem certeza de que quer fechar o OpenLP? Print the current Service Order. - + Imprimir a Lista de Exibição atual. @@ -1978,17 +2169,17 @@ Voce pode baixar a versão mais nova em http://openlp.org/. &Configure Display Tags - + &Configurar Etiquetas de Exibição Open &Data Folder... - + Abrir Pasta de &Dados... Open the folder where songs, bibles and other data resides. - + Abrir a pasta na qual músicas, Bíblias e outros arquivos são armazenados. @@ -2011,7 +2202,7 @@ Voce pode baixar a versão mais nova em http://openlp.org/. You must select one or more items to send live. - Você precisa selecionar um ou mais itens para projetar. + Você precisa selecionar um ou mais itens para projetar. @@ -2026,12 +2217,12 @@ Voce pode baixar a versão mais nova em http://openlp.org/. Invalid Service Item - Item da Lista de Exibição inválido + Item da Lista de Exibição inválido You must select a %s service item. - Você precisa selecionar um item %s da Lista de Exibição. + Você precisa selecionar um item %s da Lista de Exibição. @@ -2082,12 +2273,12 @@ Voce pode baixar a versão mais nova em http://openlp.org/. Fit Page - + Ajustar na Página Fit Width - + Ajustar Largura @@ -2095,62 +2286,62 @@ Voce pode baixar a versão mais nova em http://openlp.org/. Options - + Opções Close - + Fechar Copy - + Copiar Copy as HTML - + Copiar como HTML Zoom In - + Aumentar o Zoom Zoom Out - + Diminuir o Zoom Zoom Original - + Zoom Original Other Options - + Outras Opções Include slide text if available - + Incluir texto do slide se disponível Include service item notes - + Incluir notas da lista de exibição Include play length of media items - + Incluir duração dos itens de mídia Service Order Sheet - + Folha de Ordem de Culto @@ -2158,12 +2349,12 @@ Voce pode baixar a versão mais nova em http://openlp.org/. Screen - Tela + Tela primary - primário + primário @@ -2234,12 +2425,12 @@ Voce pode baixar a versão mais nova em http://openlp.org/. &Delete From Service - &Deletar da Lista de Exibição + &Excluir da Lista de Exibição Delete the selected item from the service. - Deletar o item selecionado da Lista de Exibição. + Excluir o item selecionado da Lista de Exibição. @@ -2281,37 +2472,37 @@ A codificação do conteúdo não é UTF-8. File is not a valid service. - Arquivo não é uma Lista de Exibição válida. + Arquivo não é uma Lista de Exibição válida. - + Missing Display Handler - + Your item cannot be displayed as there is no handler to display it - + Your item cannot be displayed as the plugin required to display it is missing or inactive - O item não pode ser exibido porque o plugin necessário para visualizá-lo está faltando ou está inativo + O item não pode ser exibido porque o plugin necessário para visualizá-lo está faltando ou está inativo &Expand all - &Expandir todos + &Expandir todos Expand all the service items. - Expandir todos os itens da lista. + Expandir todos os itens da lista. &Collapse all - &Recolher todos + &Recolher todos @@ -2326,7 +2517,7 @@ A codificação do conteúdo não é UTF-8. OpenLP Service Files (*.osz) - Lista de Exibição do OpenLP (*.osz) + Listas de Exibição do OpenLP (*.osz) @@ -2336,7 +2527,7 @@ A codificação do conteúdo não é UTF-8. Move up - Mover para cima + Mover para cima @@ -2366,22 +2557,22 @@ A codificação do conteúdo não é UTF-8. &Start Time - + &Horário Inicial Show &Preview - + Exibir &Visualização Show &Live - + Exibir &Projeção The current service has been modified. Would you like to save this service? - + A lista de exibição atual foi modificada. Você gostaria de salvá-la? @@ -2389,7 +2580,7 @@ A codificação do conteúdo não é UTF-8. Service Item Notes - Item de Notas de Culto + Anotações do Item @@ -2425,12 +2616,12 @@ A codificação do conteúdo não é UTF-8. Custom: - Personalizado: + Personalizado: None - Nenhum + Nenhum @@ -2445,63 +2636,63 @@ A codificação do conteúdo não é UTF-8. Alternate - + Alternativo OpenLP.SlideController - + Move to previous Mover para o anterior - + Move to next Mover para o próximo - + Hide - Ocultar + Ocultar - + Move to live Mover para projeção - + Start continuous loop Iniciar repetição contínua - + Stop continuous loop Parar repetição contínua - + Delay between slides in seconds Intervalo entre slides em segundos - + Start playing media Iniciar a reprodução de mídia - + Go To Ir Para - + Edit and reload song preview Editar e recarregar pré-visualização da música - + Blank Screen Apagar Tela @@ -2511,32 +2702,32 @@ A codificação do conteúdo não é UTF-8. Apagar e deixar Fundo - + Show Desktop Mostrar a Área de Trabalho - + Previous Slide Slide Anterior - + Next Slide Próximo Slide - + Previous Service Lista Anterior - + Next Service Próxima Lista - + Escape Item @@ -2551,7 +2742,7 @@ A codificação do conteúdo não é UTF-8. Formatting Tags - + Tags de Formatação @@ -2559,32 +2750,32 @@ A codificação do conteúdo não é UTF-8. Item Start Time - + Horário Inicial do Item Hours: - + Horários: h - + h m - + m Minutes: - + Minutos: Seconds: - + Segundos: @@ -2597,7 +2788,7 @@ A codificação do conteúdo não é UTF-8. Theme Name Missing - Faltando Nome do Tema + Faltando Nome do Tema @@ -2612,7 +2803,7 @@ A codificação do conteúdo não é UTF-8. Invalid theme name. Please enter one. - O nome do tema é inválido. Por favor forneça um. + O nome do tema é inválido. Por favor forneça um. @@ -2683,69 +2874,69 @@ A codificação do conteúdo não é UTF-8. Definir como Padrão &Global - + %s (default) %s (padrão) - + You must select a theme to edit. Você precisa selecionar um tema para editar. - + You are unable to delete the default theme. Você não pode apagar o tema padrão. - + You have not selected a theme. Você não selecionou um tema. - + Save Theme - (%s) Salvar Tema - (%s) - + Theme Exported Tema Exportado - + Your theme has been successfully exported. Seu tema foi exportado com sucesso. - + Theme Export Failed Falha ao Exportar Tema - + Your theme could not be exported due to an error. O tema não pôde ser exportado devido a um erro. - + Select Theme Import File Selecionar Arquivo de Importação de Tema - + File is not a valid theme. The content encoding is not UTF-8. O arquivo não é um tema válido. A codificação do conteúdo não é UTF-8. - + File is not a valid theme. O arquivo não é um tema válido. - + Theme %s is used in the %s plugin. O tema %s é usado no plugin %s. @@ -2765,49 +2956,49 @@ A codificação do conteúdo não é UTF-8. &Exportar Tema - + You must select a theme to rename. Você precisa selecionar um tema para renomear. - + Rename Confirmation - Confirmar Renomeação + Confirmar Renomeação - + Rename %s theme? Renomear o tema %s? - + You must select a theme to delete. Você precisa selecionar um tema para apagar. - + Delete Confirmation - Confirmar Apagamento + Confirmar Exclusão - + Delete %s theme? Apagar o tema %s? - + Validation Error Erro de Validação - + A theme with this name already exists. Já existe um tema com este nome. - + OpenLP Themes (*.theme *.otz) - + Temas do OpenLP (*.theme *.otz) @@ -2825,7 +3016,7 @@ A codificação do conteúdo não é UTF-8. Set Up Background - Configurar Plano de Fundo + Configurar Plano de Fundo @@ -2840,7 +3031,7 @@ A codificação do conteúdo não é UTF-8. Solid Color - Cor Sólida + Cor Sólida @@ -2875,22 +3066,22 @@ A codificação do conteúdo não é UTF-8. Top Left - Bottom Right - Esquerda Superior - Direita Inferior + Esquerda Superior - Direita Inferior Bottom Left - Top Right - Esquerda Inferior - Direita Superior + Esquerda Inferior - Direita Superior Main Area Font Details - Detalhes da Fonte da Área Principal + Detalhes da Fonte da Área Principal Define the font and display characteristics for the Display text - + Definir a fonte de características de exibição para o texto Exibido @@ -2900,7 +3091,7 @@ A codificação do conteúdo não é UTF-8. Size: - Tamanho: + Tamanho: @@ -2935,17 +3126,17 @@ A codificação do conteúdo não é UTF-8. Define the font and display characteristics for the Footer text - Defina as características do texto do Rodapé + Defina as características do texto do Rodapé Text Formatting Details - Detalhes da Formatação da Fonte + Detalhes da Formatação da Fonte Allows additional display formatting information to be defined - Permite que formatações adicionais sejam feitas + Permite que formatações adicionais sejam feitas @@ -2965,12 +3156,12 @@ A codificação do conteúdo não é UTF-8. Center - Centralizar + Centralizado Output Area Locations - Localização da Área de Saída + Localização da Área de Saída @@ -3045,7 +3236,7 @@ A codificação do conteúdo não é UTF-8. &Footer Area - Área do &Rodapé + Área do &Rodapé @@ -3063,7 +3254,7 @@ A codificação do conteúdo não é UTF-8. Theme Level - Nível dos Temas + Nível dos Temas @@ -3073,12 +3264,12 @@ A codificação do conteúdo não é UTF-8. Use the theme from each song in the database. If a song doesn't have a theme associated with it, then use the service's theme. If the service doesn't have a theme, then use the global theme. - Use o tema de cada música na base de dados. Se uma música não tiver um tema associado com ela, então use o tema do culto. Se o culto não tiver um tema, então use o tema global. + Use o tema de cada música na base de dados. Se uma música não tiver um tema associado com ela, então use o tema da lista de exibição. Se a lista não tiver um tema, então use o tema global. &Service Level - Nível de &Lista de Exibição + Nível da &Lista de Exibição @@ -3106,7 +3297,7 @@ A codificação do conteúdo não é UTF-8. &Delete - &Apagar + &Excluir @@ -3116,98 +3307,98 @@ A codificação do conteúdo não é UTF-8. Move selection up one position. - Mover a seleção para cima em uma posição. + Mover a seleção para cima em uma posição. Move selection down one position. - Mover a seleção para baixo em uma posição. + Mover a seleção para baixo em uma posição. About - Sobre + Sobre &Add - &Adicionar + &Adicionar Advanced - Avançado + Avançado All Files - Todos os Arquivos + Todos os Arquivos Bottom - Rodapé + Rodapé Browse... - Procurar... + Procurar... Cancel - Cancelar + Cancelar CCLI number: - Número CCLI: + Número CCLI: Create a new service. - Criar uma nova Lista de Exibição. + Criar uma nova Lista de Exibição. &Edit - &Editar + &Editar Empty Field - + Campo Vazio Export - + Exportar pt Abbreviated font pointsize unit - pt + pt Image - Imagem + Imagem Import - Importar + Importar Length %s - + Comprimento %s Live - Projeção + Projeção @@ -3217,297 +3408,297 @@ A codificação do conteúdo não é UTF-8. Live Panel - + Painel de Projeção Load - Carregar + Carregar Middle - Meio + Meio New - Novo + Novo New Service - + Nova Lista de Exibição New Theme - Novo Tema + Novo Tema No File Selected Singular - + Nenhum Arquivo Selecionado No Files Selected Plural - + Nenhum Arquivo Selecionado No Item Selected Singular - + Nenhum Item Selecionado No Items Selected Plural - Nenhum Item Selecionado + Nenhum Item Selecionado openlp.org 1.x - openlp.org 1.x + openlp.org 1.x OpenLP 2.0 - OpenLP 2.0 + OpenLP 2.0 Open Service - Abrir Lista de Exibição + Abrir Lista de Exibição Preview - Pré-Visualização + Pré-Visualização Preview Panel - + Painel de Pré-Visualização Print Service Order - + Imprimir Ordem de Culto Replace Background - Substituir Plano de Fundo + Substituir Plano de Fundo Replace Live Background - Trocar Plano de Fundo da Projeção + Trocar Plano de Fundo da Projeção Reset Background - + Restabelecer o Plano de Fundo Reset Live Background - Restabelecer o Plano de Fundo da Projeção + Restabelecer o Plano de Fundo da Projeção s The abbreviated unit for seconds - s + s Save && Preview - Salvar && Pré-Visualizar + Salvar && Pré-Visualizar Search - Pesquisar + Pesquisar You must select an item to delete. - Você precisa selecionar um item para apagar. + Você precisa selecionar um item para excluir. You must select an item to edit. - Você precisa selecionar um item para editar. + Você precisa selecionar um item para editar. Save Service - Salvar Lista de Exibição + Salvar Lista de Exibição Service - Lista de Exibição + Lista de Exibição Start %s - + Início %s Theme Singular - Tema + Tema Themes Plural - Temas + Temas Top - Topo + Topo Version - + Versão &Vertical Align: - + Alinhamento &Vertical: Finished import. - + Importação concluída. Format: - Formato: + Formato: Importing - Importando + Importando Importing "%s"... - Importando "%s"... + Importando "%s"... Select Import Source - Selecionar Origem da Importação + Selecionar Origem da Importação Select the import format and the location to import from. - + Selecione o formato e a localização para a importação. The openlp.org 1.x importer has been disabled due to a missing Python module. If you want to use this importer, you will need to install the "python-sqlite" module. - O importador do openlp.org 1.x foi desabilitado devido à falta de um módulo Python. Se você deseja utilizar este importador, você precisa instalar o módulo "python-sqlite". + O importador do openlp.org 1.x foi desabilitado devido à falta de um módulo Python. Se você deseja utilizar este importador, você precisa instalar o módulo "python-sqlite". Open %s File - + Abrir o Arquivo %s %p% - %p% + %p% Ready. - Pronto. + Pronto. Starting import... - Iniciando importação... + Iniciando importação... You need to specify at least one %s file to import from. A file type e.g. OpenSong - + Você precisa especificar pelo menos um arquivo %s para importar. Welcome to the Bible Import Wizard - Bem Vindo ao assistente de Importação de Bíblias + Bem Vindo ao Assistente de Importação de Bíblias Welcome to the Song Export Wizard - + Bem Vindo ao Assistente de Exportação de Músicas Welcome to the Song Import Wizard - Bem-vindo ao Assistente de Importação de Música + Bem-vindo ao Assistente de Importação de Música Author Singular - + Autor Authors Plural - Autores + Autores © Copyright symbol. - © + © Song Book Singular - Livro de Músicas + Livro de Músicas Song Books Plural - Hinários + Hinários Song Maintenance - Gerenciamento de Músicas + Gerenciamento de Músicas Topic Singular - Tópico + Tópico Topics Plural - Tópicos + Tópicos @@ -3515,7 +3706,7 @@ A codificação do conteúdo não é UTF-8. Configure Display Tags - + Configurar Etiquetas de Exibição @@ -3523,17 +3714,17 @@ A codificação do conteúdo não é UTF-8. <strong>Presentation Plugin</strong><br />The presentation plugin provides the ability to show presentations using a number of different programs. The choice of available presentation programs is available to the user in a drop down box. - + <strong>Plugin de Apresentação</strong><br />O plugin de apresentação provê a habilidade de exibir apresentações utilizando um diferente número de programas. Os programas disponíveis são exibidos em uma caixa de seleção. Load a new Presentation - Carregar uma nova Apresentação + Carregar uma nova Apresentação Delete the selected Presentation - Apagar a Apresentação selecionada + Excluir a Apresentação selecionada @@ -3554,7 +3745,7 @@ A codificação do conteúdo não é UTF-8. Presentation name singular - Apresentação + Apresentação @@ -3589,7 +3780,7 @@ A codificação do conteúdo não é UTF-8. File Exists - O Arquivo já Existe + O Arquivo já Existe @@ -3609,12 +3800,12 @@ A codificação do conteúdo não é UTF-8. Presentations (%s) - Apresentações (%s) + Apresentações (%s) Missing Presentation - Apresentação Não Encontrada + Apresentação Não Encontrada @@ -3624,7 +3815,7 @@ A codificação do conteúdo não é UTF-8. The Presentation %s is incomplete, please reload. - A Apresentação %s está incompleta, por favor recarregue-a. + A Apresentação %s está incompleta, por favor recarregue-a. @@ -3637,12 +3828,12 @@ A codificação do conteúdo não é UTF-8. Allow presentation application to be overriden - Permitir que a aplicação de apresentações seja substituída + Permitir que a aplicação de apresentações seja substituída %s (unavailable) - + %s (indisponivel) @@ -3650,25 +3841,25 @@ A codificação do conteúdo não é UTF-8. <strong>Remote Plugin</strong><br />The remote plugin provides the ability to send messages to a running version of OpenLP on a different computer via a web browser or through the remote API. - + <strong>Plugin Remoto</strong><br />O plugin remoto provê a abilidade de enviar mensagens para uma versão do OpenLP em execução em um computador diferente através de um navegador de internet ou através da API remota. Remote name singular - + Remoto Remotes name plural - Remoto + Remotos Remote container title - Remoto + Remoto @@ -3676,7 +3867,7 @@ A codificação do conteúdo não é UTF-8. Serve on IP address: - Endereço IP do servidor: + Endereço IP do servidor: @@ -3694,60 +3885,60 @@ A codificação do conteúdo não é UTF-8. &Song Usage Tracking - + &Registro de Uso de Músicas &Delete Tracking Data - + &Excluir Dados de Registro Delete song usage data up to a specified date. - + Excluir registros de uso até uma data específica. &Extract Tracking Data - + &Extrair Dados de Registro Generate a report on song usage. - + Gerar um relatório sobre o uso das músicas. Toggle Tracking - + Alternar Registro Toggle the tracking of song usage. - + Alternar o registro de uso das músicas. <strong>SongUsage Plugin</strong><br />This plugin tracks the usage of songs in services. - + <strong>Plugin de Uso das Músicas</strong><br />Este plugin registra o uso das músicas nos cultos. SongUsage name singular - + Registro das Músicas SongUsage name plural - + Registro das Músicas SongUsage container title - + Registro das Músicas @@ -3755,27 +3946,27 @@ A codificação do conteúdo não é UTF-8. Delete Song Usage Data - + Excluir Dados de Registro das Músicas Delete Selected Song Usage Events? - + Deseja Excluir os Eventos de Registro das Músicas? Are you sure you want to delete selected Song Usage data? - + Você tem certeza que deseja excluir o registro selecionado? Deletion Successful - + Exclusão Bem Sucedida All requested data has been deleted successfully. - Todos os dados solicitados foram apagados com sucesso. + Todos os dados solicitados foram apagados com sucesso. @@ -3783,7 +3974,7 @@ A codificação do conteúdo não é UTF-8. Song Usage Extraction - + Extração de Uso das Músicas @@ -3808,12 +3999,12 @@ A codificação do conteúdo não é UTF-8. usage_detail_%s_%s.txt - + detalhe_uso_%s_%s.txt Report Creation - + Criação de Relatório @@ -3840,7 +4031,7 @@ foi criado com sucesso. <strong>Songs Plugin</strong><br />The songs plugin provides the ability to display and manage songs. - + <strong>Plugin de Músicas</strong><br />O plugin de músicas provê a habilidade de exibir e gerenciar músicas. @@ -3897,13 +4088,13 @@ foi criado com sucesso. Songs name plural - + Músicas Songs container title - Músicas + Músicas @@ -3918,7 +4109,7 @@ foi criado com sucesso. Central European (CP-1250) - Europeu Central (CP-1250) + Europeu Central (CP-1250) @@ -3953,7 +4144,7 @@ foi criado com sucesso. Thai (CP-874) - Tailandês (CP-874) + Tailandês (CP-874) @@ -3973,7 +4164,7 @@ foi criado com sucesso. Western European (CP-1252) - Europeu Ocidental (CP-1252) + Europeu Ocidental (CP-1252) @@ -3985,7 +4176,7 @@ foi criado com sucesso. The codepage setting is responsible for the correct character representation. Usually you are fine with the preselected choice. - O Código de páginas é responsável + O Código de páginas é responsável pela correta representação dos caracteres. Normalmente a opção pré-selecionada é segura. @@ -3999,7 +4190,7 @@ A codificação é responsável pela correta representação dos caracteres. Exports songs using the export wizard. - + Exportar músicas utilizando o assistente. @@ -4007,7 +4198,7 @@ A codificação é responsável pela correta representação dos caracteres. Author Maintenance - Manutenção de Autores + Gerenciamento de Autores @@ -4037,7 +4228,7 @@ A codificação é responsável pela correta representação dos caracteres. You have not set a display name for the author, combine the first and last names? - Você não definiu um nome de tela para o autor, combinar o nome e o sobrenome? + Você não definiu um nome de tela para o autor, combinar o nome e o sobrenome? @@ -4098,7 +4289,7 @@ A codificação é responsável pela correta representação dos caracteres. &Manage Authors, Topics, Song Books - &Gerenciar Autores, Assuntos, Hinários + &Gerenciar Autores, Assuntos, Hinários @@ -4123,7 +4314,7 @@ A codificação é responsável pela correta representação dos caracteres. Authors, Topics && Song Book - Autores, Assuntos && Hinários + Autores, Assuntos && Hinários @@ -4133,7 +4324,7 @@ A codificação é responsável pela correta representação dos caracteres. Copyright Information - Informação de Direitos Autorais + Direitos Autorais @@ -4163,7 +4354,7 @@ A codificação é responsável pela correta representação dos caracteres. You have not selected a valid author. Either select an author from the list, or type in a new author and click the "Add Author to Song" button to add the new author. - Você não selecionou um autor válido. Selecione um autor da list, ou digite um novo autor e clique em "Adicionar Autor à Música" para adicionar o novo autor. + Você não selecionou um autor válido. Selecione um autor da lista, ou digite um novo autor e clique em "Adicionar Autor à Música" para adicioná-lo. @@ -4198,7 +4389,7 @@ A codificação é responsável pela correta representação dos caracteres. Warning - Aviso + Aviso @@ -4213,12 +4404,12 @@ A codificação é responsável pela correta representação dos caracteres. Add Book - Adicionar Livro + Adicionar Livro This song book does not exist, do you want to add it? - Este hinário não existe, deseja adicioná-lo? + Este hinário não existe, deseja adicioná-lo? @@ -4228,7 +4419,7 @@ A codificação é responsável pela correta representação dos caracteres. You need to type some text in to the verse. - Você precisa digitar algum texto na estrofe. + Você precisa digitar algum texto na estrofe. @@ -4254,82 +4445,82 @@ A codificação é responsável pela correta representação dos caracteres. Song Export Wizard - + Assistente de Exportação de Músicas This wizard will help to export your songs to the open and free OpenLyrics worship song format. - + Este assistente irá ajudá-lo a exportar as suas músicas para o formato aberto e gratuito OpenLyrics. Select Songs - + Selecionar Músicas Check the songs you want to export. - + Selecione as músicas que você deseja exportar. Uncheck All - + Desmarcar Todas Check All - + Selecionar Todas Select Directory - + Selecionar Diretório Select the directory you want the songs to be saved. - + Selecionar o diretório que você deseja salvar as músicas. Directory: - + Diretório: Exporting - + Exportando Please wait while your songs are exported. - + Por favor aguarde enquanto as suas músicas são exportadas. You need to add at least one Song to export. - + Você precisa adicionar pelo menos uma Música para exportar. No Save Location specified - + Nenhum local para Salvar foi especificado Starting export... - + Iniciando a exportação... You need to specify a directory. - + Você precisa especificar um diretório. Select Destination Folder - + Selecione uma Pasta de Destino @@ -4337,7 +4528,7 @@ A codificação é responsável pela correta representação dos caracteres. Select Document/Presentation Files - Selecione Documentos/Apresentações + Selecione Documentos/Apresentações @@ -4352,7 +4543,7 @@ A codificação é responsável pela correta representação dos caracteres. Generic Document/Presentation - Documento/Apresentação Genérica + Documento/Apresentação Genérica @@ -4367,7 +4558,7 @@ A codificação é responsável pela correta representação dos caracteres. Remove File(s) - Remover Arquivos(s) + Remover Arquivos(s) @@ -4377,7 +4568,7 @@ A codificação é responsável pela correta representação dos caracteres. The generic document/presentation importer has been disabled because OpenLP cannot find OpenOffice.org on your computer. - O importador de documento/apresentação foi desabilitado porque o OpenOffice.org não foi encontrado. + O importador de documento/apresentação foi desabilitado porque o OpenOffice.org não foi encontrado no seu computador. @@ -4387,7 +4578,7 @@ A codificação é responsável pela correta representação dos caracteres. The OpenLyrics importer has not yet been developed, but as you can see, we are still intending to do so. Hopefully it will be in the next release. - + O importador para o formato OpenLyrics ainda não foi desenvolvido, mas como você pode ver, nós ainda pretendemos desenvolvê-lo. Possivelmente ele estará disponível na próxima versão. @@ -4412,27 +4603,27 @@ A codificação é responsável pela correta representação dos caracteres. You need to specify at least one document or presentation file to import from. - + Você precisa especificar pelo menos um documento ou apresentação para importar. Songs Of Fellowship Song Files - + Arquivos do Songs Of Fellowship SongBeamer Files - + Arquivos do SongBeamer SongShow Plus Song Files - + Arquivos do SongShow Plus Foilpresenter Song Files - + Arquivos do Folipresenter @@ -4440,7 +4631,7 @@ A codificação é responsável pela correta representação dos caracteres. Maintain the lists of authors, topics and books - Manter a lista de autores, tópicos e livros + Gerenciar a lista de autores, tópicos e livros @@ -4453,7 +4644,7 @@ A codificação é responsável pela correta representação dos caracteres.Letra - + Delete Song(s)? Apagar Música(s)? @@ -4468,7 +4659,7 @@ A codificação é responsável pela correta representação dos caracteres.Música Inteira - + Are you sure you want to delete the %n selected song(s)? Tem certeza de que quer apagar as %n música(s) selecionadas? @@ -4489,7 +4680,7 @@ A codificação é responsável pela correta representação dos caracteres. Exporting "%s"... - + Exportando "%s"... @@ -4497,7 +4688,7 @@ A codificação é responsável pela correta representação dos caracteres. Song Book Maintenance - Gerenciamento de Hinários + Gerenciamento de Hinários @@ -4520,12 +4711,12 @@ A codificação é responsável pela correta representação dos caracteres. Finished export. - + Exportação Finalizada. Your song export failed. - + A sua exportação falhou. @@ -4619,17 +4810,17 @@ A codificação é responsável pela correta representação dos caracteres. Delete Book - Apagar Livro + Apagar Hinário Are you sure you want to delete the selected book? - Tem certeza de que quer apagar o hinário selecionado? + Tem certeza de que quer excluir o hinário selecionado? This book cannot be deleted, it is currently assigned to at least one song. - Este hinário não pode ser apagado, pois está associado a ao menos uma música. + Este hinário não pode ser excluido, pois está associado a ao menos uma música. @@ -4649,7 +4840,7 @@ A codificação é responsável pela correta representação dos caracteres. The book %s already exists. Would you like to make songs with book %s use the existing book %s? - O livro %s já existe. Deseja que as músicas com o livro %s usem o livro %s existente? + O hinário %s já existe. Deseja que as músicas com o hinário %s usem o hinário %s existente? diff --git a/resources/i18n/ru.ts b/resources/i18n/ru.ts index 5780689e8..b9d77073b 100644 --- a/resources/i18n/ru.ts +++ b/resources/i18n/ru.ts @@ -154,28 +154,28 @@ Do you want to continue anyway? BibleDB.Wizard - + Importing testaments... %s Импорт заветов... %s - + Importing testaments... done. Импорт заветов... завершен. - + Importing books... %s Импорт книг... %s - + Importing verses from %s... Importing verses from <book name>... Импорт стихов из %s... - + Importing verses... done. Импорт стихов... завершен. @@ -551,18 +551,18 @@ Changes do not affect verses already in the service. - + Starting Registering bible... - + Registered bible. Please note, that verses will be downloaded on demand and thus an internet connection is required. - + Your Bible import failed. @@ -663,7 +663,7 @@ demand and thus an internet connection is required. BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... @@ -672,12 +672,12 @@ demand and thus an internet connection is required. BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... - + Importing %s %s... Importing <book name> <chapter>... @@ -1071,17 +1071,17 @@ OpenLP is written and maintained by volunteers. If you would like to see more fr - + Credits - + License Лицензия - + Contribute @@ -1091,7 +1091,25 @@ OpenLP is written and maintained by volunteers. If you would like to see more fr Билд %s - + + Copyright © 2004-2011 Raoul Snyman +Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, +Meinert Jordan, Andreas Preikschat, Christian Richter, Philip +Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund + + + + + 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 below for more details. + + + + Project Lead %s @@ -1107,6 +1125,35 @@ Testers Packagers %s +Translators + Afrikaans (af) + %s + German (de) + %s + English, United Kingdom (en_GB) + %s + English, South Africa (en_ZA) + %s + Estonian (et) + %s + French (fr) + %s + Hungarian (hu) + %s + Japanese (ja) + %s + Norwegian Bokmål (nb) + %s + Dutch (nl) + %s + Portuguese, Brazil (pt_BR) + %s + Russian (ru) + %s + +Documentation + %s + Built With Python: http://www.python.org/ Qt4: http://qt.nokia.com/ @@ -1126,24 +1173,6 @@ Final Credit He has set us free. - - - Copyright © 2004-2011 Raoul Snyman -Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, -Meinert Jordan, Andreas Preikschat, Christian Richter, Philip -Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund - - - - - 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 below for more details. - - OpenLP.AdvancedTab @@ -1392,6 +1421,157 @@ Version: %s + + OpenLP.FirstTimeLanguageForm + + + Initial Set up Language + + + + + Select the language you'd like to use in OpenLP. + + + + + OpenLP.FirstTimeWizard + + + Songs + Псалмы + + + + Bibles + Священное Писание + + + + Themes + + + + + Starting Updates + + + + + Downloading %s + + + + + First Time Wizard + + + + + Welcome to the First Time Wizard + + + + + This wizard will help you to configure OpenLP for initial use . Click the next button below to start the process of selection your initial options. + + + + + Activate required Plugins + + + + + Select the Plugins you wish to use. + + + + + Custom Text + + + + + Bible + Библия + + + + Images + Изображения + + + + Presentations + + + + + Media (Audio and Video) + + + + + Allow remote access + + + + + Monitor Song Usage + + + + + Allow Alerts + + + + + Download Samples from OpenLP.org + + + + + Select samples to downlaod and install for use. + + + + + No Internet connection found so unable to download any default files. + + + + + Download Example Files + + + + + Default Settings + + + + + Set up default values to be used by OpenLP + + + + + Default output display + + + + + Select the default Theme + + + + + Press finish to apply all your changes and start OpenLP + + + OpenLP.GeneralTab @@ -1513,12 +1693,12 @@ Version: %s OpenLP.LanguageManager - + Language - + Please restart OpenLP to use your new language setting. @@ -1894,39 +2074,39 @@ Version: %s - + Version %s of OpenLP is now available for download (you are currently running version %s). You can download the latest version from http://openlp.org/. - + OpenLP Version Updated - + OpenLP Main Display Blanked - + The Main Display has been blanked out - + Close OpenLP - + Are you sure you want to close OpenLP? - + Default Theme: %s @@ -2304,17 +2484,17 @@ The content encoding is not UTF-8. - + Missing Display Handler - + Your item cannot be displayed as there is no handler to display it - + Your item cannot be displayed as the plugin required to display it is missing or inactive @@ -2411,32 +2591,32 @@ The content encoding is not UTF-8. OpenLP.SlideController - + Previous Slide - + Move to previous - + Next Slide - + Move to next - + Hide - + Blank Screen @@ -2446,57 +2626,57 @@ The content encoding is not UTF-8. - + Show Desktop - + Start continuous loop - + Stop continuous loop - + Delay between slides in seconds - + Move to live - + Edit and reload song preview - + Start playing media - + Go To - + Previous Service - + Next Service - + Escape Item @@ -2658,113 +2838,113 @@ The content encoding is not UTF-8. - + %s (default) - + You must select a theme to rename. - + Rename Confirmation - + Rename %s theme? - + You must select a theme to edit. - + You must select a theme to delete. - + Delete Confirmation - + Delete %s theme? - + You have not selected a theme. - + Save Theme - (%s) - + Theme Exported - + Your theme has been successfully exported. - + Theme Export Failed - + Your theme could not be exported due to an error. - + Select Theme Import File - + File is not a valid theme. The content encoding is not UTF-8. - + Validation Error - + File is not a valid theme. - + A theme with this name already exists. - + You are unable to delete the default theme. - + Theme %s is used in the %s plugin. - + OpenLP Themes (*.theme *.otz) @@ -4412,12 +4592,12 @@ The encoding is responsible for the correct character representation. - + Delete Song(s)? - + Are you sure you want to delete the %n selected song(s)? diff --git a/resources/i18n/sv.ts b/resources/i18n/sv.ts index b421540fa..fc97c08a0 100644 --- a/resources/i18n/sv.ts +++ b/resources/i18n/sv.ts @@ -12,7 +12,7 @@ Vill du fortsätta ändå? No Parameter Found - + Inga parametrar hittades @@ -154,30 +154,30 @@ Do you want to continue anyway? BibleDB.Wizard - + Importing testaments... %s - + Importing testaments... done. - + Importing books... %s - + Importing verses from %s... Importing verses from <book name>... Importerar verser från %s... - + Importing verses... done. - + Importerar verser... klart. @@ -195,7 +195,7 @@ Do you want to continue anyway? There was a problem downloading your verse selection. Please check your Internet connection, and if this error continues to occur please consider reporting a bug. - + Det var problem med nerladdningen av versurvalet. Kontrollera internetuppkopplingen och om problemet återkommer fundera på att rapportera det som en bugg. @@ -522,7 +522,7 @@ Changes do not affect verses already in the service. Bibeln finns redan - + Your Bible import failed. Din bibelimport misslyckades. @@ -537,12 +537,12 @@ Changes do not affect verses already in the service. - + Starting Registering bible... - + Registered bible. Please note, that verses will be downloaded on demand and thus an internet connection is required. @@ -664,7 +664,7 @@ demand and thus an internet connection is required. BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... Importerar %s %s... @@ -673,12 +673,12 @@ demand and thus an internet connection is required. BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... Analyserar kodning (detta kan ta några minuter)... - + Importing %s %s... Importing <book name> <chapter>... Importerar %s %s... @@ -908,12 +908,12 @@ demand and thus an internet connection is required. You must select an image to delete. - + Du måste välja en bild som skall tas bort. You must select an image to replace the background with. - + Du måste välja en bild att ersätta bakgrundsbilden med. @@ -1072,17 +1072,17 @@ OpenLP is written and maintained by volunteers. If you would like to see more fr - + Credits Lista över medverkande - + License Licens - + Contribute Bidra @@ -1092,7 +1092,25 @@ OpenLP is written and maintained by volunteers. If you would like to see more fr - + + Copyright © 2004-2011 Raoul Snyman +Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, +Meinert Jordan, Andreas Preikschat, Christian Richter, Philip +Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund + + + + + 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 below for more details. + + + + Project Lead %s @@ -1108,6 +1126,35 @@ Testers Packagers %s +Translators + Afrikaans (af) + %s + German (de) + %s + English, United Kingdom (en_GB) + %s + English, South Africa (en_ZA) + %s + Estonian (et) + %s + French (fr) + %s + Hungarian (hu) + %s + Japanese (ja) + %s + Norwegian Bokmål (nb) + %s + Dutch (nl) + %s + Portuguese, Brazil (pt_BR) + %s + Russian (ru) + %s + +Documentation + %s + Built With Python: http://www.python.org/ Qt4: http://qt.nokia.com/ @@ -1127,24 +1174,6 @@ Final Credit He has set us free. - - - Copyright © 2004-2011 Raoul Snyman -Portions copyright © 2004-2011 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, -Meinert Jordan, Andreas Preikschat, Christian Richter, Philip -Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frode Woldsund - - - - - 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 below for more details. - - OpenLP.AdvancedTab @@ -1201,7 +1230,7 @@ Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frod Image file: - + Bildfil: @@ -1295,7 +1324,7 @@ Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, CarstennTinggaard, Frod Send E-Mail - + Skicka e-post @@ -1393,6 +1422,157 @@ Version: %s + + OpenLP.FirstTimeLanguageForm + + + Initial Set up Language + + + + + Select the language you'd like to use in OpenLP. + + + + + OpenLP.FirstTimeWizard + + + Songs + + + + + Bibles + + + + + Themes + + + + + Starting Updates + + + + + Downloading %s + + + + + First Time Wizard + + + + + Welcome to the First Time Wizard + + + + + This wizard will help you to configure OpenLP for initial use . Click the next button below to start the process of selection your initial options. + + + + + Activate required Plugins + + + + + Select the Plugins you wish to use. + + + + + Custom Text + + + + + Bible + Bibel + + + + Images + Bilder + + + + Presentations + + + + + Media (Audio and Video) + + + + + Allow remote access + + + + + Monitor Song Usage + + + + + Allow Alerts + + + + + Download Samples from OpenLP.org + + + + + Select samples to downlaod and install for use. + + + + + No Internet connection found so unable to download any default files. + + + + + Download Example Files + + + + + Default Settings + + + + + Set up default values to be used by OpenLP + + + + + Default output display + + + + + Select the default Theme + + + + + Press finish to apply all your changes and start OpenLP + + + OpenLP.GeneralTab @@ -1413,7 +1593,7 @@ Version: %s Display if a single screen - + Visa även på enkel skärm @@ -1514,12 +1694,12 @@ Version: %s OpenLP.LanguageManager - + Language Språk - + Please restart OpenLP to use your new language setting. Vänligen starta om OpenLP för att aktivera dina nya språkinställningar. @@ -1742,7 +1922,7 @@ Version: %s &Preview Panel - &Förhandsgranskning + &Förhandsgranskningpanel @@ -1837,7 +2017,7 @@ Version: %s Set the interface language to %s - + Sätt användargränssnittets språk till %s @@ -1880,29 +2060,29 @@ Version: %s - + Version %s of OpenLP is now available for download (you are currently running version %s). You can download the latest version from http://openlp.org/. - + OpenLP Version Updated OpenLP-versionen uppdaterad - + OpenLP Main Display Blanked OpenLPs huvuddisplay rensad - + The Main Display has been blanked out Huvuddisplayen har rensats - + Default Theme: %s Standardtema: %s @@ -1918,12 +2098,12 @@ You can download the latest version from http://openlp.org/. - + Close OpenLP - + Are you sure you want to close OpenLP? @@ -2026,17 +2206,17 @@ You can download the latest version from http://openlp.org/. %s (Inactive) - + %s (Inaktiv) %s (Active) - + %s (Aktiv) %s (Disabled) - + %s (Ej valbar) @@ -2044,12 +2224,12 @@ You can download the latest version from http://openlp.org/. Fit Page - + Passa sidan Fit Width - + Passa bredden @@ -2057,42 +2237,42 @@ You can download the latest version from http://openlp.org/. Options - + Alternativ Close - + Stäng Copy - + Kopiera Copy as HTML - + Kopiera som HTML Zoom In - + Zooma in Zoom Out - + Zooma ut Zoom Original - + Zooma original Other Options - + Andra alternativ @@ -2146,7 +2326,7 @@ You can download the latest version from http://openlp.org/. Save this service - Spara denna mötesplanering + Spara denna planering @@ -2156,7 +2336,7 @@ You can download the latest version from http://openlp.org/. Move to &top - Flytta till &toppen + Flytta högst &upp @@ -2196,7 +2376,7 @@ You can download the latest version from http://openlp.org/. &Delete From Service - &Ta bort från mötesplanering + &Ta bort från planeringen @@ -2245,17 +2425,17 @@ The content encoding is not UTF-8. - + Missing Display Handler - + Your item cannot be displayed as there is no handler to display it - + Your item cannot be displayed as the plugin required to display it is missing or inactive @@ -2412,57 +2592,57 @@ The content encoding is not UTF-8. OpenLP.SlideController - + Move to previous Flytta till föregående - + Move to next Flytta till nästa - + Hide - + Move to live Flytta till live - + Start continuous loop Börja oändlig loop - + Stop continuous loop Stoppa upprepad loop - + Delay between slides in seconds Fördröjning mellan bilder, i sekunder - + Start playing media Börja spela media - + Go To - + Edit and reload song preview - + Blank Screen @@ -2472,32 +2652,32 @@ The content encoding is not UTF-8. - + Show Desktop - + Previous Slide - + Next Slide - + Previous Service - + Next Service - + Escape Item @@ -2558,7 +2738,7 @@ The content encoding is not UTF-8. Theme Name Missing - + Temanamn saknas @@ -2644,68 +2824,68 @@ The content encoding is not UTF-8. - + %s (default) - + You must select a theme to edit. - + You are unable to delete the default theme. Du kan inte ta bort standardtemat. - + You have not selected a theme. Du har inte valt ett tema. - + Save Theme - (%s) Spara tema - (%s) - + Theme Exported - + Your theme has been successfully exported. - + Theme Export Failed - + Your theme could not be exported due to an error. - + Select Theme Import File Välj tema importfil - + File is not a valid theme. The content encoding is not UTF-8. - + File is not a valid theme. Filen är inte ett giltigt tema. - + Theme %s is used in the %s plugin. @@ -2725,47 +2905,47 @@ The content encoding is not UTF-8. - + You must select a theme to rename. - + Rename Confirmation - + Rename %s theme? - + You must select a theme to delete. - + Delete Confirmation - + Delete %s theme? - + Validation Error - + A theme with this name already exists. - + OpenLP Themes (*.theme *.otz) @@ -4408,7 +4588,7 @@ The encoding is responsible for the correct character representation. Sångtexter - + Delete Song(s)? @@ -4423,7 +4603,7 @@ The encoding is responsible for the correct character representation. - + Are you sure you want to delete the %n selected song(s)? diff --git a/resources/images/openlp-2.qrc b/resources/images/openlp-2.qrc index 794e006d9..0d3191eff 100644 --- a/resources/images/openlp-2.qrc +++ b/resources/images/openlp-2.qrc @@ -92,6 +92,7 @@ wizard_exportsong.bmp wizard_importsong.bmp wizard_importbible.bmp + wizard_firsttime.bmp wizard_createtheme.bmp diff --git a/resources/images/wizard_firsttime.bmp b/resources/images/wizard_firsttime.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f37de5be22567a21af39048a9f2672be85fe2cae GIT binary patch literal 172254 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ҭr?aAlWA%nX7LgxQj`FD<)2>l#k9? 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⁡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 literal 0 HcmV?d00001 From b609a8de03cc7b760c5ca8a75fe972fa8b2823c4 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Wed, 9 Mar 2011 19:37:25 +0200 Subject: [PATCH 55/90] Added a No Internet page to the wizard. --- openlp/core/ui/firsttimeform.py | 32 ++++++++++---- openlp/core/ui/firsttimewizard.py | 70 ++++++++++++++++++++++++------- 2 files changed, 79 insertions(+), 23 deletions(-) diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index 40f2a23e2..978fd05c7 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -32,11 +32,10 @@ import urllib from PyQt4 import QtCore, QtGui -from firsttimewizard import Ui_FirstTimeWizard - -from openlp.core.lib import translate, PluginStatus, check_directory_exists, \ +from openlp.core.lib import translate, PluginStatus, check_directory_exists, \ Receiver from openlp.core.utils import get_web_page, AppLocation +from firsttimewizard import Ui_FirstTimeWizard, FirstTimePage log = logging.getLogger(__name__) @@ -49,6 +48,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): def __init__(self, screens, parent=None): QtGui.QWizard.__init__(self, parent) + self.setupUi(self) # check to see if we have web access self.web = u'http://openlp.org/files/frw/' self.config = ConfigParser.ConfigParser() @@ -56,7 +56,6 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): if self.webAccess: files = self.webAccess.read() self.config.readfp(io.BytesIO(files)) - self.setupUi(self) for screen in screens.get_screen_list(): self.displaySelectionComboBox.addItem(screen) self.songsText = translate('OpenLP.FirstTimeWizard', 'Songs') @@ -85,7 +84,6 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): # Sort out internet access for downloads if self.webAccess: self.internetGroupBox.setVisible(True) - self.noInternetLabel.setVisible(False) # If songs database exists do not allow a copy songs = os.path.join(AppLocation.get_section_data_path(u'songs'), u'songs.sqlite') @@ -100,9 +98,9 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) treewidgetitem.setText(0, self.themesText) self._loadChild(treewidgetitem, u'themes', u'files', 'theme') - else: - self.internetGroupBox.setVisible(False) - self.noInternetLabel.setVisible(True) +# else: +# self.internetGroupBox.setVisible(False) +# self.noInternetLabel.setVisible(True) def _loadChild(self, tree, list, tag, root): files = self.config.get(list, tag) @@ -119,11 +117,27 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): child.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) + def nextId(self): + """ + Determine the next page in the Wizard to go to. + """ + if self.currentId() == FirstTimePage.Plugins: + if not self.webAccess: + return FirstTimePage.NoInternet + else: + return FirstTimePage.Songs + else: + return self.currentId() + 1 + def onCurrentIdChanged(self, pageId): """ Detects Page changes and updates as approprate. """ - if self.page(pageId) == self.DefaultsPage: + if pageId == FirstTimePage.NoInternet: + self.finishButton.setVisible(True) + self.finishButton.setEnabled(True) + self.nextButton.setVisible(False) + elif self.page(pageId) == self.DefaultsPage: self.themeSelectionComboBox.clear() listIterator = QtGui.QTreeWidgetItemIterator( self.selectionTreeWidget) diff --git a/openlp/core/ui/firsttimewizard.py b/openlp/core/ui/firsttimewizard.py index 299160b3f..ad4784d59 100644 --- a/openlp/core/ui/firsttimewizard.py +++ b/openlp/core/ui/firsttimewizard.py @@ -29,6 +29,15 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate from openlp.core.lib.ui import add_welcome_page +class FirstTimePage(object): + Welcome = 0 + Plugins = 1 + NoInternet = 2 + Songs = 3 + Bibles = 4 + Defaults = 5 + + class Ui_FirstTimeWizard(object): def setupUi(self, FirstTimeWizard): FirstTimeWizard.setObjectName(u'FirstTimeWizard') @@ -37,6 +46,9 @@ class Ui_FirstTimeWizard(object): FirstTimeWizard.setWizardStyle(QtGui.QWizard.ModernStyle) FirstTimeWizard.setOptions(QtGui.QWizard.IndependentPages| QtGui.QWizard.NoBackButtonOnStartPage) + self.finishButton = self.button(QtGui.QWizard.FinishButton) + self.cancelButton = self.button(QtGui.QWizard.CancelButton) + self.nextButton = self.button(QtGui.QWizard.NextButton) add_welcome_page(FirstTimeWizard, u':/wizards/wizard_firsttime.bmp') # The plugins page self.pluginPage = QtGui.QWizardPage() @@ -79,14 +91,28 @@ class Ui_FirstTimeWizard(object): self.alertCheckBox.setChecked(True) self.alertCheckBox.setObjectName(u'alertCheckBox') self.pluginLayout.addWidget(self.alertCheckBox) - FirstTimeWizard.addPage(self.pluginPage) - # The song samples page - self.downloadDefaultsPage = QtGui.QWizardPage() - self.downloadDefaultsPage.setObjectName(u'downloadDefaultsPage') - self.noInternetLabel = QtGui.QLabel(self.downloadDefaultsPage) - self.noInternetLabel.setGeometry(QtCore.QRect(20, 20, 461, 17)) + FirstTimeWizard.setPage(FirstTimePage.Plugins, self.pluginPage) + # The "you don't have an internet connection" page. + self.noInternetPage = QtGui.QWizardPage() + self.noInternetPage.setObjectName(u'noInternetPage') + self.noInternetLayout = QtGui.QVBoxLayout(self.noInternetPage) + self.noInternetLayout.setContentsMargins(50, 40, 50, 40) + self.noInternetLayout.setObjectName(u'noInternetLayout') + self.noInternetLabel = QtGui.QLabel(self.noInternetPage) + self.noInternetLabel.setWordWrap(True) self.noInternetLabel.setObjectName(u'noInternetLabel') - self.internetGroupBox = QtGui.QGroupBox(self.downloadDefaultsPage) + self.noInternetLayout.addWidget(self.noInternetLabel) + FirstTimeWizard.setPage(FirstTimePage.NoInternet, self.noInternetPage) + + # The song samples page + self.songsPage = QtGui.QWizardPage() + self.songsPage.setObjectName(u'songsPage') + FirstTimeWizard.setPage(FirstTimePage.Songs, self.songsPage) + + # download page + self.biblesPage = QtGui.QWizardPage() + self.biblesPage.setObjectName(u'biblesPage') + self.internetGroupBox = QtGui.QGroupBox(self.biblesPage) self.internetGroupBox.setGeometry(QtCore.QRect(20, 10, 501, 271)) self.internetGroupBox.setObjectName(u'internetGroupBox') self.pluginLayout_4 = QtGui.QVBoxLayout(self.internetGroupBox) @@ -100,7 +126,8 @@ class Ui_FirstTimeWizard(object): self.selectionTreeWidget.headerItem().setText(0, u'1') self.selectionTreeWidget.header().setVisible(False) self.pluginLayout_4.addWidget(self.selectionTreeWidget) - FirstTimeWizard.addPage(self.downloadDefaultsPage) + FirstTimeWizard.setPage(FirstTimePage.Bibles, self.biblesPage) + self.DefaultsPage = QtGui.QWizardPage() self.DefaultsPage.setObjectName(u'DefaultsPage') self.layoutWidget = QtGui.QWidget(self.DefaultsPage) @@ -133,7 +160,7 @@ class Ui_FirstTimeWizard(object): self.updateLabel = QtGui.QLabel(self.DefaultsPage) self.updateLabel.setGeometry(QtCore.QRect(60, 220, 351, 17)) self.updateLabel.setObjectName(u'updateLabel') - FirstTimeWizard.addPage(self.DefaultsPage) + FirstTimeWizard.setPage(FirstTimePage.Defaults, self.DefaultsPage) self.retranslateUi(FirstTimeWizard) QtCore.QMetaObject.connectSlotsByName(FirstTimeWizard) @@ -169,14 +196,29 @@ class Ui_FirstTimeWizard(object): 'Monitor Song Usage')) self.alertCheckBox.setText(translate('OpenLP.FirstTimeWizard', 'Allow Alerts')) - self.downloadDefaultsPage.setTitle(translate('OpenLP.FirstTimeWizard', + self.noInternetPage.setTitle(translate('OpenLP.FirstTimeWizard', + 'No Internet Connection')) + self.noInternetPage.setSubTitle(translate( + 'OpenLP.FirstTimeWizard', + 'Unable to detect an Internet connection.')) + self.noInternetLabel.setText(translate('OpenLP.FirstTimeWizard', + 'No Internet connection was found. The First Time Wizard needs an ' + 'Internet connection in order to be able to download sample ' + 'songs, Bibles and themes.\n\nTo re-run the First Time Wizard and ' + 'import this sample data at a later stage, press the cancel ' + 'button now, check your Internet connection, and restart OpenLP.' + '\n\nTo cancel the First Time Wizard completely, press the finish ' + 'button now.')) + self.songsPage.setTitle(translate('OpenLP.FirstTimeWizard', + 'Sample Songs')) + self.songsPage.setSubTitle(translate( + 'OpenLP.FirstTimeWizard', + 'Select and download public domain songs.')) + self.biblesPage.setTitle(translate('OpenLP.FirstTimeWizard', 'Download Samples from OpenLP.org')) - self.downloadDefaultsPage.setSubTitle(translate( + self.biblesPage.setSubTitle(translate( 'OpenLP.FirstTimeWizard', 'Select samples to downlaod and install for use.')) - self.noInternetLabel.setText(translate('OpenLP.FirstTimeWizard', - 'No Internet connection found so unable to download any default' - ' files.')) self.internetGroupBox.setTitle(translate('OpenLP.FirstTimeWizard', 'Download Example Files')) self.DefaultsPage.setTitle(translate('OpenLP.FirstTimeWizard', From f710746a5597ce77c09aef668c65ead4a9c8aeb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Wed, 9 Mar 2011 20:02:21 +0200 Subject: [PATCH 56/90] Returns now done right. Commented out dialog part, which needs more work --- openlp/core/ui/servicemanager.py | 35 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 703c5ebc4..ff7c077e2 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -413,6 +413,7 @@ class ServiceManager(QtGui.QWidget): """ Save the current Service file. """ + success = True if not self.fileName(): return self.saveFileAs() path_file_name = unicode(self.fileName()) @@ -440,21 +441,21 @@ class ServiceManager(QtGui.QWidget): continue file_size = os.path.getsize(path_from) size_limit = 52428800 # 50MiB - if file_size > size_limit: - # File exeeds size_limit bytes, ask user - message = unicode(translate('OpenLP.ServiceManager', - 'Do you want to include \n%.1f MB file "%s"\n' - 'into the service file?\nThis may take some time.\n\n' - 'Please note that you need to\ntake care of that file ' - 'yourself,\nif you leave it out.')) % \ - (file_size/1048576, os.path.split(path_from)[1]) - ans = QtGui.QMessageBox.question(self.mainwindow, - translate('OpenLP.ServiceManager', 'Including Large ' - 'File'), message, QtGui.QMessageBox.StandardButtons( - QtGui.QMessageBox.Ok|QtGui.QMessageBox.Cancel), - QtGui.QMessageBox.Ok) - if ans == QtGui.QMessageBox.Cancel: - continue + #if file_size > size_limit: + # # File exeeds size_limit bytes, ask user + # message = unicode(translate('OpenLP.ServiceManager', + # 'Do you want to include \n%.1f MB file "%s"\n' + # 'into the service file?\nThis may take some time.\n\n' + # 'Please note that you need to\ntake care of that file' + # ' yourself,\nif you leave it out.')) % \ + # (file_size/1048576, os.path.split(path_from)[1]) + # ans = QtGui.QMessageBox.question(self.mainwindow, + # translate('OpenLP.ServiceManager', 'Including Large ' + # 'File'), message, QtGui.QMessageBox.StandardButtons( + # QtGui.QMessageBox.Ok|QtGui.QMessageBox.Cancel), + # QtGui.QMessageBox.Ok) + # if ans == QtGui.QMessageBox.Cancel: + # continue write_list.append(path_from) total_size += file_size log.debug(u'ServiceManager.saveFile - ZIP contents size is %i bytes' % @@ -477,12 +478,12 @@ class ServiceManager(QtGui.QWidget): zip.write(path_from, path_from.encode(u'utf-8')) except IOError: log.exception(u'Failed to save service to disk') + success = False finally: zip.close() self.mainwindow.addRecentFile(path_file_name) self.setModified(False) - return True - return False + return success def saveFileAs(self): """ From 32034dea950bd0840c23c8b961a82f456779455e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Wed, 9 Mar 2011 20:08:06 +0200 Subject: [PATCH 57/90] Just to make more sense. --- openlp/core/ui/servicemanager.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index ff7c077e2..fb3664769 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -482,6 +482,7 @@ class ServiceManager(QtGui.QWidget): finally: zip.close() self.mainwindow.addRecentFile(path_file_name) + if success: self.setModified(False) return success From 674e9713e7418d35453fedf90c065050daa8c157 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 9 Mar 2011 19:14:50 +0100 Subject: [PATCH 58/90] serach comments --- openlp/core/ui/maindisplay.py | 3 --- openlp/plugins/songs/lib/mediaitem.py | 19 ++++++++++--------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 357eb655a..72ebe422a 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -516,9 +516,6 @@ class AudioPlayer(QtCore.QObject): ``parent`` The parent widget. - - ``screens`` - The list of screens. """ log.debug(u'AudioPlayer Initialisation started') QtCore.QObject.__init__(self, parent) diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 4c267dd3c..c16516eb7 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -159,15 +159,15 @@ class SongMediaItem(MediaManagerItem): def onSearchTextButtonClick(self): search_keywords = unicode(self.searchTextEdit.displayText()) search_results = [] - # search_type = self.searchTypeComboBox.currentIndex() search_type = self.searchTextEdit.currentSearchType() if search_type == SongSearch.Entire: log.debug(u'Entire Song Search') search_results = self.parent.manager.get_all_objects(Song, or_(Song.search_title.like(u'%' + self.whitespace.sub(u' ', search_keywords.lower()) + u'%'), - Song.search_lyrics.like(u'%' + search_keywords.lower() + \ - u'%')), Song.search_title.asc()) + Song.search_lyrics.like(u'%' + search_keywords.lower() + u'%'), + Song.comments.like(u'%' + search_keywords.lower() + u'%')), + Song.search_title.asc()) self.displayResultsSong(search_results) elif search_type == SongSearch.Titles: log.debug(u'Titles Search') @@ -253,11 +253,13 @@ class SongMediaItem(MediaManagerItem): if self.searchAsYouType: search_length = 1 if self.searchTextEdit.currentSearchType() == SongSearch.Entire: - search_length = 3 - elif self.searchTextEdit.currentSearchType() == SongSearch.Lyrics: search_length = 7 + elif self.searchTextEdit.currentSearchType() == SongSearch.Lyrics: + search_length = 3 if len(text) > search_length: self.onSearchTextButtonClick() + elif len(text) == 0: + self.onClearTextButtonClick() def onImportClick(self): if not hasattr(self, u'import_wizard'): @@ -446,10 +448,9 @@ class SongMediaItem(MediaManagerItem): add_song = False editId = song.id break - if add_song: - if self.addSongFromService: - editId = self.openLyrics.xml_to_song(item.xml_version) - self.onSearchTextButtonClick() + if add_song and self.addSongFromService: + editId = self.openLyrics.xml_to_song(item.xml_version) + self.onSearchTextButtonClick() # Update service with correct song id. if editId: Receiver.send_message(u'service_item_update', From 89187ffadecc48d0bd4d10c72dd7480f00119fc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Wed, 9 Mar 2011 20:22:07 +0200 Subject: [PATCH 59/90] Neater again. --- openlp/core/ui/servicemanager.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index fb3664769..9951c8295 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -413,7 +413,6 @@ class ServiceManager(QtGui.QWidget): """ Save the current Service file. """ - success = True if not self.fileName(): return self.saveFileAs() path_file_name = unicode(self.fileName()) @@ -478,13 +477,13 @@ class ServiceManager(QtGui.QWidget): zip.write(path_from, path_from.encode(u'utf-8')) except IOError: log.exception(u'Failed to save service to disk') - success = False + zip.close() + return False finally: zip.close() self.mainwindow.addRecentFile(path_file_name) - if success: self.setModified(False) - return success + return True def saveFileAs(self): """ From d8c6db418322b21c45a8c6b5695fc8578b8f81c3 Mon Sep 17 00:00:00 2001 From: "John Cegalis jseagull1@hotmail.com" Date: Wed, 9 Mar 2011 13:36:20 -0500 Subject: [PATCH 60/90] cleaned up grammar --- documentation/manual/source/dualmonitors.rst | 28 +++++------ documentation/manual/source/glossary.rst | 12 ++--- documentation/manual/source/songs.rst | 50 ++++++++++---------- 3 files changed, 45 insertions(+), 45 deletions(-) diff --git a/documentation/manual/source/dualmonitors.rst b/documentation/manual/source/dualmonitors.rst index ee4bc90a2..72384fe52 100644 --- a/documentation/manual/source/dualmonitors.rst +++ b/documentation/manual/source/dualmonitors.rst @@ -4,11 +4,11 @@ Dual Monitor Setup The first step in getting OpenLP working on your system is to setup your computer properly for dual monitors. This is not very difficult, but the steps -do vary depending on operating system. +will vary depending on operating system. -Most modern computers do have the ability for dual monitors. To be certain +Most modern computers have the ability for dual monitors. To be certain, check your computer's documentation. A typical desktop computer capable of dual -monitors will have two of, or a combination of the two connectors below. +monitors will have two of, or a combination of the two, connectors below. **VGA** @@ -18,8 +18,8 @@ monitors will have two of, or a combination of the two connectors below. .. image:: pics/dvi.png -A laptop computer setup only varies slightly, generally you will need only one -of outputs pictured above since your laptops screen serves as one of the +A laptop computer setup only varies slightly. Generally you will need only one +of the outputs pictured above since your laptop screen serves as one of the monitors. Sometimes with older laptops a key stroke generally involving the :kbd:`Fn` key and another key is required to enable the second monitor on laptops. @@ -27,9 +27,9 @@ laptops. Some computers also incorporate the use of :abbr:`S-Video (Separate Video)` or :abbr:`HDMI (High-Definition Multimedia Interface)` connections. -A typical OpenLP set up consist of your normal single monitor setup, with your -projector setup as the second monitor. With the option of extending your -desktop across the second monitor, or your operating system's equivalent. +A typical OpenLP setup consist of your normal single monitor, with your +projector hooked up to your computer as the second monitor. With the option of +extending your desktop across the second monitor, or your operating system's equivalent. Microsoft Windows ----------------- @@ -46,7 +46,7 @@ press :kbd:`Windows+P`. The more traditional way is also fairly straight forward. Go to :guilabel:`Control Panel` and click on :guilabel:`Display`. This will open up -the :guilabel:`Display` dialog. You can also bypass this step by right click on +the :guilabel:`Display` dialog. You may also bypass this step by a right click on a blank area on your desktop and selecting :guilabel:`Resolution`. .. image:: pics/winsevendisplay.png @@ -66,7 +66,7 @@ a blank place on the desktop and click :guilabel:`Personalization`. .. image:: pics/vistapersonalize.png From the :guilabel:`Personalization` window click on :guilabel:`Display -Settings`. Then enable the montior that represents your projector and make sure +Settings`. Click on the montior that represents your projector and make sure you have checked :guilabel:`Extend the desktop onto this monitor`. .. image:: pics/vistadisplaysettings.png @@ -77,7 +77,7 @@ Windows XP From :guilabel:`Control Panel` select :guilabel:`Display`, or right click on a blank area of the desktop and select :guilabel:`Properties`. From the :guilabel:`Display Properties` window click on the :guilabel:`Settings` tab. -Then click on the monitor that represents your projector and make sure you have +Click on the monitor that represents your projector and make sure you have checked :guilabel:`Extend my Windows desktop onto this monitor`. .. image:: pics/xpdisplaysettings.png @@ -87,7 +87,7 @@ Linux Due to the vast varieties of hardware, distributions, desktops, and drivers this is not an exhaustive guide to dual monitor setup on Linux. This guide -assumes that you have properly set up any proprietary drivers if needed. You +assumes you have properly set up any proprietary drivers if needed. You should seek out your distributions documentation if this general guide does not work. @@ -166,7 +166,7 @@ After clicking :guilabel:`Configure`, select :guilabel:`TwinView`. Then click .. image:: pics/twinview.png -Then click :guilabel:`Apply` and if you are happy with the way things look click +Click :guilabel:`Apply` and if you are happy with the way things look click :guilabel:`Keep` to keep your new settings. Don't worry if all goes wrong the settings will return back to the previous settings in 15 seconds without any action. nVidia Settings should take care of selecting your optimum resolution @@ -175,6 +175,6 @@ on :guilabel:`Save to X Configuration File`. .. image:: pics/xorgwrite.png -Then click :guilabel:`Save` and you should be set. You may want to restart X or +Click :guilabel:`Save` and you should be set. You may want to restart X or your machine just to make sure all the settings carry over the next time you log in. diff --git a/documentation/manual/source/glossary.rst b/documentation/manual/source/glossary.rst index 6f4ebcdd6..ab6c7880e 100644 --- a/documentation/manual/source/glossary.rst +++ b/documentation/manual/source/glossary.rst @@ -18,7 +18,7 @@ The Main Window contains all the tools and plugins that make OpenLP function Media Manager ------------- -The Media Manager contains a number of tabs that plugins supply to OpenLP. +The Media Manager contains a number of tabs the plugins supply to OpenLP. Each tab in the Media Manager is called a **Media Item** .. image:: pics/mediamanager.png @@ -36,20 +36,20 @@ with them. Service File ------------ -A service file, is the file that is created when you save your work on OpenLP. +A service file is the file that is created when you save your service in OpenLP. The service file consist of **Service Items** Service Item ------------ -A service item are the **media items** that are in the **service manager** +Service items are the **media items** that are in the **service manager** Service Manger -------------- The service manager contains the media items in your service file. This is the -area from which your media items go live, and you can also save, open, and edit -services files. +area where your media items go live. You can also save, open, and edit +services files from here. .. image:: pics/servicemanager.png @@ -65,6 +65,6 @@ Theme Manager ------------- The theme manager is where themes are created and edited. Themes are the text -styles backgrounds that you use to personalize your services. +styles and backgrounds that you use to personalize your services. .. image:: pics/thememanager.png diff --git a/documentation/manual/source/songs.rst b/documentation/manual/source/songs.rst index 678a6206c..53db50242 100644 --- a/documentation/manual/source/songs.rst +++ b/documentation/manual/source/songs.rst @@ -8,26 +8,26 @@ converters provided to get data from other formats into OpenLP. Song Importer ============= -If you are using an earlier version of OpenLP or come from another software +If you are using an earlier version of OpenLP or, come from another software package, you may be able to convert your existing database to work in OpenLP -2.0. To access the Song Importer :menuselection:`File --> Import --> Song`. -You will then see the Song Importer window, then click :guilabel:`Next`. +2.0. To access the Song Importer click :menuselection:`File --> Import --> Song`. +You will see the Song Importer window, then click :guilabel:`Next`. .. image:: pics/songimporter.png -After choosing :guilabel:`Next` you can then select from the various types of +After choosing :guilabel:`Next` you can select from the various types of software that OpenLP will convert songs from. .. image:: pics/songimporterchoices.png -Then click on the file folder icon to choose the file of the song database you +Click on the file folder icon to choose the file of the song database you want to import. See the following sections for information on the different formats that OpenLP will import. Importing from OpenLP Version 1 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Converting from OpenLP Version 1 is a pretty simple process. You will first +Converting from OpenLP Version 1 is a simple process. First you will need to locate your version 1 database file. Windows XP:: @@ -38,33 +38,33 @@ Windows Vista / Windows 7:: C:\ProgramData\openlp.org\Data\songs.olp -After clicking :guilabel:`Next` your conversion should be complete. +After clicking :guilabel:`Next` your conversion will be complete. .. image:: pics/finishedimport.png -Then press :guilabel:`Finish` and you should now be ready to use your OpenLP -version one songs. +Press :guilabel:`Finish` and you will now be ready to use your OpenLP +version 1 songs. Importing from OpenSong ^^^^^^^^^^^^^^^^^^^^^^^ -Converting from OpenSong you will need to locate your songs database. In the +Converting from OpenSong, you will need to locate your songs database. In the later versions of OpenSong you are asked to define the location of this. The -songs will be located in a folder named :guilabel:`Songs`. This folder should -contain files with all your songs in them without a file extension. (file.xxx). -When you have located this folder you will then need to select the songs from +songs will be located in a folder named :guilabel:`Songs`. This folder will +contain files with all your songs in them, without a file extension. (file.xxx). +When you have located this folder you will need to select the songs from the folder. .. image:: pics/selectsongs.png -On most operating systems to select all the songs, first select the first song -in the lest then press shift and select the last song in the list. After this -press :guilabel:`Next` and you should see that your import has been successful. +On most operating systems, to select all the songs, first select the first song +in the list, press the shift key, and select the last song in the list. After this +press :guilabel:`Next` and you will see that your import has been successful. .. image:: pics/finishedimport.png -Press :guilabel:`Finish` and you will now be ready to use your songs imported -from OpenSong. +Press :guilabel:`Finish` and OpenLP will be ready to use your songs that you +imported from OpenSong. Importing from CCLI Song Select ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -79,22 +79,22 @@ Then search for your desired song. For this example we will be adding the song .. image:: pics/songselectsongsearch.png -For the song you are searching for select `lyrics` This should take you to a -page displaying the lyrics and copyright info for your song. +For the song you are searching for, select `lyrics` This will take you to a +page displaying the lyrics and copyright information for your song. .. image:: pics/songselectlyrics.png -Next, hover over the :guilabel:`Lyrics` menu from the upper right corner. Then -choose either the .txt or .usr file. You will then be asked to chose a download +Next, hover over the :guilabel:`Lyrics` menu from the upper right corner. +Choose either the .txt or .usr file. You will be asked to chose a download location if your browser does not automatically select that for you. Select this file from the OpenLP import window and then click :guilabel:`Next` You can also select multiple songs for import at once on most operating systems by -selecting the first item in the list then holding shift select the last item in -the list. When finished you should see that your import has completed. +selecting the first item in the list then holding the shift key and select the last +item in the list. When finished, you will see that your import has completed. .. image:: pics/finishedimport.png -Press :guilabel:`Finish` and you will now be ready to use your songs imported +Press :guilabel:`Finish` and OpenLP will be ready to use your songs imported from CCLI SongSelect. From d668060cf9593b84c6a48a26116cad9b7fe7c028 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 9 Mar 2011 19:43:50 +0100 Subject: [PATCH 61/90] fixed search_length --- openlp/plugins/songs/lib/mediaitem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index c16516eb7..46c027316 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -255,7 +255,7 @@ class SongMediaItem(MediaManagerItem): if self.searchTextEdit.currentSearchType() == SongSearch.Entire: search_length = 7 elif self.searchTextEdit.currentSearchType() == SongSearch.Lyrics: - search_length = 3 + search_length = 6 if len(text) > search_length: self.onSearchTextButtonClick() elif len(text) == 0: From f1174469543a36b3e6860bc4b36b8339e2bf2cfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Wed, 9 Mar 2011 21:22:52 +0200 Subject: [PATCH 62/90] I hope it finally is right. --- openlp/core/ui/servicemanager.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 9951c8295..73ca4b9ca 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -465,6 +465,7 @@ class ServiceManager(QtGui.QWidget): allow_zip_64 = (total_size > 2147483648 + len(service_content)) log.debug(u'ServiceManager.saveFile - allowZip64 is %s' % allow_zip_64) + zip = None try: zip = zipfile.ZipFile(path_file_name, 'w', zipfile.ZIP_STORED, allow_zip_64) @@ -477,13 +478,13 @@ class ServiceManager(QtGui.QWidget): zip.write(path_from, path_from.encode(u'utf-8')) except IOError: log.exception(u'Failed to save service to disk') - zip.close() return False finally: - zip.close() - self.mainwindow.addRecentFile(path_file_name) - self.setModified(False) - return True + if zip: + zip.close() + self.mainwindow.addRecentFile(path_file_name) + self.setModified(False) + return True def saveFileAs(self): """ From fbb15aae913be4eec8554e0b9edf077404f74d74 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Wed, 9 Mar 2011 23:24:06 +0200 Subject: [PATCH 63/90] More updates. --- openlp/core/ui/firsttimewizard.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/openlp/core/ui/firsttimewizard.py b/openlp/core/ui/firsttimewizard.py index ad4784d59..4db1b71f9 100644 --- a/openlp/core/ui/firsttimewizard.py +++ b/openlp/core/ui/firsttimewizard.py @@ -96,7 +96,7 @@ class Ui_FirstTimeWizard(object): self.noInternetPage = QtGui.QWizardPage() self.noInternetPage.setObjectName(u'noInternetPage') self.noInternetLayout = QtGui.QVBoxLayout(self.noInternetPage) - self.noInternetLayout.setContentsMargins(50, 40, 50, 40) + self.noInternetLayout.setContentsMargins(50, 30, 50, 40) self.noInternetLayout.setObjectName(u'noInternetLayout') self.noInternetLabel = QtGui.QLabel(self.noInternetPage) self.noInternetLabel.setWordWrap(True) @@ -107,6 +107,11 @@ class Ui_FirstTimeWizard(object): # The song samples page self.songsPage = QtGui.QWizardPage() self.songsPage.setObjectName(u'songsPage') + self.songsLayout = QtGui.QVBoxLayout(self.songsPage) + self.songsLayout.setContentsMargins(50, 20, 50, 20) + self.songsLayout.setObjectName(u'songsLayout') + self.songsListWidget = QtGui.QListWidget(self.songsPage) + self.songsListWidget.setObjectName(u'songsListWidget') FirstTimeWizard.setPage(FirstTimePage.Songs, self.songsPage) # download page From 8d33f6d360eea31e1cbd5c9a38e0404a47bfbcb9 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Thu, 10 Mar 2011 15:15:49 +0200 Subject: [PATCH 64/90] Some more updates to the wizard. --- openlp/core/ui/firsttimeform.py | 175 +++++++++++++++--------------- openlp/core/ui/firsttimewizard.py | 140 ++++++++++++------------ openlp/core/utils/__init__.py | 1 + 3 files changed, 161 insertions(+), 155 deletions(-) diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index 978fd05c7..6e8de827c 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -24,11 +24,12 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -import ConfigParser import io import logging import os import urllib +from random import randint +from ConfigParser import SafeConfigParser from PyQt4 import QtCore, QtGui @@ -51,13 +52,13 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): self.setupUi(self) # check to see if we have web access self.web = u'http://openlp.org/files/frw/' - self.config = ConfigParser.ConfigParser() - self.webAccess = get_web_page(u'%s%s' % (self.web, u'download.cfg')) + self.config = SafeConfigParser() + self.webAccess = get_web_page(u'%s%s' % (self.web, u'download.cfg?%s' % randint(0, 20))) if self.webAccess: files = self.webAccess.read() self.config.readfp(io.BytesIO(files)) for screen in screens.get_screen_list(): - self.displaySelectionComboBox.addItem(screen) + self.displayComboBox.addItem(screen) self.songsText = translate('OpenLP.FirstTimeWizard', 'Songs') self.biblesText = translate('OpenLP.FirstTimeWizard', 'Bibles') self.themesText = translate('OpenLP.FirstTimeWizard', 'Themes') @@ -83,39 +84,47 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): self.restart() # Sort out internet access for downloads if self.webAccess: - self.internetGroupBox.setVisible(True) - # If songs database exists do not allow a copy - songs = os.path.join(AppLocation.get_section_data_path(u'songs'), - u'songs.sqlite') - if not os.path.exists(songs): - treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) - treewidgetitem.setText(0, self.songsText) - self._loadChild(treewidgetitem, u'songs', u'languages', u'songs') - treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) - treewidgetitem.setText(0, self.biblesText) - self._loadChild(treewidgetitem, u'bibles', u'translations', - u'bible') - treewidgetitem = QtGui.QTreeWidgetItem(self.selectionTreeWidget) - treewidgetitem.setText(0, self.themesText) - self._loadChild(treewidgetitem, u'themes', u'files', 'theme') -# else: -# self.internetGroupBox.setVisible(False) -# self.noInternetLabel.setVisible(True) - - def _loadChild(self, tree, list, tag, root): - files = self.config.get(list, tag) - files = files.split(u',') - for file in files: - if file: - child = QtGui.QTreeWidgetItem(tree) - child.setText(0, self.config.get(u'%s_%s' - % (root, file), u'title')) - child.setData(0, QtCore.Qt.UserRole, - QtCore.QVariant(self.config.get(u'%s_%s' - % (root, file), u'filename'))) - child.setCheckState(0, QtCore.Qt.Unchecked) - child.setFlags(QtCore.Qt.ItemIsUserCheckable | - QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) + songs = self.config.get(u'songs', u'languages') + songs = songs.split(u',') + for song in songs: + title = unicode(self.config.get( + u'songs_%s' % song, u'title'), u'utf8') + filename = unicode(self.config.get( + u'songs_%s' % song, u'filename'), u'utf8') + item = QtGui.QListWidgetItem(title, self.songsListWidget) + item.setData(QtCore.Qt.UserRole, QtCore.QVariant(filename)) + item.setCheckState(QtCore.Qt.Unchecked) + item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable) + bible_languages = self.config.get(u'bibles', u'languages') + bible_languages = bible_languages.split(u',') + for lang in bible_languages: + language = unicode(self.config.get( + u'bibles_%s' % lang, u'title'), u'utf8') + langItem = QtGui.QTreeWidgetItem( + self.biblesTreeWidget, QtCore.QStringList(language)) + bibles = self.config.get(u'bibles_%s' % lang, u'translations') + bibles = bibles.split(u',') + for bible in bibles: + title = unicode(self.config.get( + u'bible_%s' % bible, u'title'), u'utf8') + filename = unicode(self.config.get( + u'bible_%s' % bible, u'filename')) + item = QtGui.QTreeWidgetItem( + langItem, QtCore.QStringList(title)) + item.setData(0, QtCore.Qt.UserRole, QtCore.QVariant(filename)) + item.setCheckState(0, QtCore.Qt.Unchecked) + item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable) + self.biblesTreeWidget.expandAll() + themes = self.config.get(u'themes', u'files') + themes = themes.split(u',') + for theme in themes: + title = self.config.get(u'theme_%s' % theme, u'title') + filename = self.config.get(u'theme_%s' % theme, u'filename') + screenshot = self.config.get(u'theme_%s' % theme, u'screenshot') + item = QtGui.QListWidgetItem(title, self.themesListWidget) + item.setData(QtCore.Qt.UserRole, QtCore.QVariant(filename)) + item.setCheckState(QtCore.Qt.Unchecked) + item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable) def nextId(self): """ @@ -137,16 +146,16 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): self.finishButton.setVisible(True) self.finishButton.setEnabled(True) self.nextButton.setVisible(False) - elif self.page(pageId) == self.DefaultsPage: - self.themeSelectionComboBox.clear() + elif pageId == FirstTimePage.Defaults: + self.themeComboBox.clear() listIterator = QtGui.QTreeWidgetItemIterator( self.selectionTreeWidget) while listIterator.value(): parent = listIterator.value().parent() - if parent and listIterator.value().checkState(0) \ - == QtCore.Qt.Checked: + if parent and \ + listIterator.value().checkState(0) == QtCore.Qt.Checked: if unicode(parent.text(0)) == self.themesText: - self.themeSelectionComboBox.addItem( + self.themeComboBox.addItem( listIterator.value().text(0)) listIterator += 1 @@ -164,55 +173,47 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): self._pluginStatus(self.songUsageCheckBox, u'songusage/status') self._pluginStatus(self.alertCheckBox, u'alerts/status') # Build directories for downloads - songsDestination = AppLocation.get_section_data_path(u'songs') - check_directory_exists(songsDestination) - bibleDestination = AppLocation.get_section_data_path(u'bibles') - check_directory_exists(bibleDestination) - themeDestination = AppLocation.get_section_data_path(u'themes') - check_directory_exists(themeDestination) - # Install Selected Items looping through them - listIterator = QtGui.QTreeWidgetItemIterator(self.selectionTreeWidget) - while listIterator.value(): - type = listIterator.value().parent() - if listIterator.value().parent(): - if listIterator.value().checkState(0) == QtCore.Qt.Checked: - # Install items as theu have been selected - item = unicode(listIterator.value().text(0)) - # Download Song database if selected - if unicode(type.text(0)) == self.songsText: - songs = unicode(listIterator.value().data(0, - QtCore.Qt.UserRole).toString()) - message = self.downloading % item - self._updateMessage(message) - # Song database is a fixed file name - urllib.urlretrieve(u'%s%s' % (self.web, songs), - os.path.join(songsDestination, u'songs.sqlite')) - # Download and selected Bibles - if unicode(type.text(0)) == self.biblesText: - bible = unicode(listIterator.value().data(0, - QtCore.Qt.UserRole).toString()) - message = self.downloading % item - self._updateMessage(message) - urllib.urlretrieve(u'%s%s' % (self.web, bible), - os.path.join(bibleDestination, bible)) - # Download any themes - if unicode(type.text(0)) == self.themesText: - theme = unicode(listIterator.value().data(0, - QtCore.Qt.UserRole).toString()) - message = self.downloading % item - self._updateMessage(message) - urllib.urlretrieve(u'%s%s' % (self.web, theme), - os.path.join(themeDestination, theme)) - listIterator += 1 + destination = AppLocation.get_temp_path() + check_directory_exists(destination) + bibles_destination = AppLocation.get_section_data_path(u'bibles') + check_directory_exists(bibles_destination) + themes_destination = AppLocation.get_section_data_path(u'themes') + check_directory_exists(destination) + # Install songs + songs_iterator = QtGui.QListWidgetItemIterator(self.songsListWidget) + while songs_iterator.value(): + item = songs_iterator.value() + if item.checkState() == QtCore.Qt.Checked: + filename = item.data(QtCore.Qt.UserRole).toString() + urllib.urlretrieve(u'%s%s' % (self.web, filename), + os.path.join(destination, filename)) + #importer = SongImporter() + songs_iterator += 1 + # Install Bibles + bibles_iterator = QtGui.QTreeWidgetItemIterator(self.biblesTreeWidget) + while bibles_iterator.value(): + item = bibles_iterator.value() + if item.parent() and item.checkState(0) == QtCore.Qt.Checked: + bible = unicode(item.data(0, QtCore.Qt.UserRole).toString()) + urllib.urlretrieve(u'%s%s' % (self.web, bible), + os.path.join(bibles_destination, bible)) + bibles_iterator += 1 + themes_iterator = QtGui.QListWidgetItemIterator(self.themesListWidget) + while themes_iterator.value(): + item = themes_iterator.value() + if item.checkState() == QtCore.Qt.Checked: + theme = unicode(item.data(QtCore.Qt.UserRole).toString()) + urllib.urlretrieve(u'%s%s' % (self.web, theme), + os.path.join(theme_destination, theme)) + themes_iterator += 1 # Set Default Display - if self.displaySelectionComboBox.currentIndex() != -1: + if self.displayComboBox.currentIndex() != -1: QtCore.QSettings().setValue(u'General/monitor', - QtCore.QVariant(self.displaySelectionComboBox. - currentIndex())) + QtCore.QVariant(self.displayComboBox.currentIndex())) # Set Global Theme - if self.themeSelectionComboBox.currentIndex() != -1: + if self.themeComboBox.currentIndex() != -1: QtCore.QSettings().setValue(u'themes/global theme', - QtCore.QVariant(self.themeSelectionComboBox.currentText())) + QtCore.QVariant(self.themeComboBox.currentText())) QtCore.QSettings().setValue(u'general/first time', QtCore.QVariant(False)) Receiver.send_message(u'cursor_normal') diff --git a/openlp/core/ui/firsttimewizard.py b/openlp/core/ui/firsttimewizard.py index ad4784d59..08dbe83b0 100644 --- a/openlp/core/ui/firsttimewizard.py +++ b/openlp/core/ui/firsttimewizard.py @@ -35,7 +35,8 @@ class FirstTimePage(object): NoInternet = 2 Songs = 3 Bibles = 4 - Defaults = 5 + Themes = 5 + Defaults = 6 class Ui_FirstTimeWizard(object): @@ -103,65 +104,70 @@ class Ui_FirstTimeWizard(object): self.noInternetLabel.setObjectName(u'noInternetLabel') self.noInternetLayout.addWidget(self.noInternetLabel) FirstTimeWizard.setPage(FirstTimePage.NoInternet, self.noInternetPage) - # The song samples page self.songsPage = QtGui.QWizardPage() self.songsPage.setObjectName(u'songsPage') + self.songsLayout = QtGui.QVBoxLayout(self.songsPage) + self.songsLayout.setContentsMargins(50, 20, 50, 20) + self.songsLayout.setObjectName(u'songsLayout') + self.songsListWidget = QtGui.QListWidget(self.songsPage) + self.songsListWidget.setAlternatingRowColors(True) + self.songsListWidget.setObjectName(u'songsListWidget') + self.songsLayout.addWidget(self.songsListWidget) FirstTimeWizard.setPage(FirstTimePage.Songs, self.songsPage) - - # download page + # The Bible samples page self.biblesPage = QtGui.QWizardPage() self.biblesPage.setObjectName(u'biblesPage') - self.internetGroupBox = QtGui.QGroupBox(self.biblesPage) - self.internetGroupBox.setGeometry(QtCore.QRect(20, 10, 501, 271)) - self.internetGroupBox.setObjectName(u'internetGroupBox') - self.pluginLayout_4 = QtGui.QVBoxLayout(self.internetGroupBox) - self.pluginLayout_4.setObjectName(u'pluginLayout_4') - self.selectionTreeWidget = QtGui.QTreeWidget(self.internetGroupBox) - self.selectionTreeWidget.setHorizontalScrollBarPolicy( - QtCore.Qt.ScrollBarAlwaysOff) - self.selectionTreeWidget.setProperty(u'showDropIndicator', False) - self.selectionTreeWidget.setAlternatingRowColors(True) - self.selectionTreeWidget.setObjectName(u'selectionTreeWidget') - self.selectionTreeWidget.headerItem().setText(0, u'1') - self.selectionTreeWidget.header().setVisible(False) - self.pluginLayout_4.addWidget(self.selectionTreeWidget) + self.biblesLayout = QtGui.QVBoxLayout(self.biblesPage) + self.biblesLayout.setContentsMargins(50, 20, 50, 20) + self.biblesLayout.setObjectName(u'biblesLayout') + self.biblesTreeWidget = QtGui.QTreeWidget(self.biblesPage) + self.biblesTreeWidget.setAlternatingRowColors(True) + self.biblesTreeWidget.header().setVisible(False) + self.biblesTreeWidget.setObjectName(u'biblesTreeWidget') + self.biblesLayout.addWidget(self.biblesTreeWidget) FirstTimeWizard.setPage(FirstTimePage.Bibles, self.biblesPage) - - self.DefaultsPage = QtGui.QWizardPage() - self.DefaultsPage.setObjectName(u'DefaultsPage') - self.layoutWidget = QtGui.QWidget(self.DefaultsPage) - self.layoutWidget.setGeometry(QtCore.QRect(20, 20, 491, 113)) - self.layoutWidget.setObjectName(u'layoutWidget') - self.gridLayout = QtGui.QGridLayout(self.layoutWidget) - self.gridLayout.setMargin(0) - self.gridLayout.setObjectName(u'gridLayout') - self.displaySelectionLabel = QtGui.QLabel(self.layoutWidget) - self.displaySelectionLabel.setObjectName(u'displaySelectionLabel') - self.gridLayout.addWidget(self.displaySelectionLabel, 0, 0, 1, 1) - self.displaySelectionComboBox = QtGui.QComboBox(self.layoutWidget) - self.displaySelectionComboBox.setEditable(False) - self.displaySelectionComboBox.setInsertPolicy(QtGui.QComboBox.NoInsert) - self.displaySelectionComboBox.setSizeAdjustPolicy( + # The theme samples page + self.themesPage = QtGui.QWizardPage() + self.themesPage.setObjectName(u'themesPage') + self.themesLayout = QtGui.QVBoxLayout(self.themesPage) + self.themesLayout.setContentsMargins(20, 50, 20, 50) + self.themesLayout.setObjectName(u'themesLayout') + self.themesListWidget = QtGui.QListWidget(self.themesPage) + self.themesListWidget.setFlow(QtGui.QListView.LeftToRight) + self.themesListWidget.setViewMode(QtGui.QListView.IconMode) + self.themesListWidget.setMovement(QtGui.QListView.Static) + self.themesListWidget.setSpacing(4) + self.themesListWidget.setUniformItemSizes(True) + self.themesListWidget.setObjectName(u'themesListWidget') + self.themesLayout.addWidget(self.themesListWidget) + FirstTimeWizard.setPage(FirstTimePage.Themes, self.themesPage) + # the default settings page + self.defaultsPage = QtGui.QWizardPage() + self.defaultsPage.setObjectName(u'defaultsPage') + self.defaultsLayout = QtGui.QFormLayout(self.defaultsPage) + self.defaultsLayout.setContentsMargins(50, 20, 50, 20) + self.defaultsLayout.setObjectName(u'defaultsLayout') + self.displayLabel = QtGui.QLabel(self.defaultsPage) + self.displayLabel.setObjectName(u'displayLabel') + self.displayComboBox = QtGui.QComboBox(self.defaultsPage) + self.displayComboBox.setEditable(False) + self.displayComboBox.setInsertPolicy(QtGui.QComboBox.NoInsert) + self.displayComboBox.setSizeAdjustPolicy( QtGui.QComboBox.AdjustToContents) - self.displaySelectionComboBox.setObjectName(u'displaySelectionComboBox') - self.gridLayout.addWidget(self.displaySelectionComboBox, 0, 1, 1, 1) - self.themeSelectionLabel = QtGui.QLabel(self.layoutWidget) - self.themeSelectionLabel.setObjectName(u'themeSelectionLabel') - self.gridLayout.addWidget(self.themeSelectionLabel, 1, 0, 1, 1) - self.themeSelectionComboBox = QtGui.QComboBox(self.layoutWidget) - self.themeSelectionComboBox.setSizeAdjustPolicy( + self.displayComboBox.setObjectName(u'displayComboBox') + self.defaultsLayout.addRow(self.displayLabel, self.displayComboBox) + self.themeLabel = QtGui.QLabel(self.defaultsPage) + self.themeLabel.setObjectName(u'themeLabel') + self.themeComboBox = QtGui.QComboBox(self.defaultsPage) + self.themeComboBox.setEditable(False) + self.themeComboBox.setInsertPolicy(QtGui.QComboBox.NoInsert) + self.themeComboBox.setSizeAdjustPolicy( QtGui.QComboBox.AdjustToContents) - self.themeSelectionComboBox.setObjectName(u'themeSelectionComboBox') - self.gridLayout.addWidget(self.themeSelectionComboBox, 1, 1, 1, 1) - self.messageLabel = QtGui.QLabel(self.DefaultsPage) - self.messageLabel.setGeometry(QtCore.QRect(60, 160, 471, 17)) - self.messageLabel.setObjectName(u'messageLabel') - self.updateLabel = QtGui.QLabel(self.DefaultsPage) - self.updateLabel.setGeometry(QtCore.QRect(60, 220, 351, 17)) - self.updateLabel.setObjectName(u'updateLabel') - FirstTimeWizard.setPage(FirstTimePage.Defaults, self.DefaultsPage) - + self.themeComboBox.setObjectName(u'themeComboBox') + self.defaultsLayout.addRow(self.themeLabel, self.themeComboBox) + FirstTimeWizard.setPage(FirstTimePage.Defaults, self.defaultsPage) + self.retranslateUi(FirstTimeWizard) QtCore.QMetaObject.connectSlotsByName(FirstTimeWizard) @@ -211,23 +217,21 @@ class Ui_FirstTimeWizard(object): 'button now.')) self.songsPage.setTitle(translate('OpenLP.FirstTimeWizard', 'Sample Songs')) - self.songsPage.setSubTitle(translate( - 'OpenLP.FirstTimeWizard', + self.songsPage.setSubTitle(translate('OpenLP.FirstTimeWizard', 'Select and download public domain songs.')) self.biblesPage.setTitle(translate('OpenLP.FirstTimeWizard', - 'Download Samples from OpenLP.org')) - self.biblesPage.setSubTitle(translate( - 'OpenLP.FirstTimeWizard', - 'Select samples to downlaod and install for use.')) - self.internetGroupBox.setTitle(translate('OpenLP.FirstTimeWizard', - 'Download Example Files')) - self.DefaultsPage.setTitle(translate('OpenLP.FirstTimeWizard', + 'Sample Bibles')) + self.biblesPage.setSubTitle(translate('OpenLP.FirstTimeWizard', + 'Select and download free Bibles.')) + self.themesPage.setTitle(translate('OpenLP.FirstTimeWizard', + 'Sample Themes')) + self.themesPage.setSubTitle(translate('OpenLP.FirstTimeWizard', + 'Select and download sample themes.')) + self.defaultsPage.setTitle(translate('OpenLP.FirstTimeWizard', 'Default Settings')) - self.DefaultsPage.setSubTitle(translate('OpenLP.FirstTimeWizard', - 'Set up default values to be used by OpenLP')) - self.displaySelectionLabel.setText(translate('OpenLP.FirstTimeWizard', - 'Default output display')) - self.themeSelectionLabel.setText(translate('OpenLP.FirstTimeWizard', - 'Select the default Theme')) - self.messageLabel.setText(translate('OpenLP.FirstTimeWizard', - 'Press finish to apply all your changes and start OpenLP')) + self.defaultsPage.setSubTitle(translate('OpenLP.FirstTimeWizard', + 'Set up default settings to be used by OpenLP.')) + self.displayLabel.setText(translate('OpenLP.FirstTimeWizard', + 'Default output display:')) + self.themeLabel.setText(translate('OpenLP.FirstTimeWizard', + 'Select default theme:')) diff --git a/openlp/core/utils/__init__.py b/openlp/core/utils/__init__.py index 70b994653..f3dacee88 100644 --- a/openlp/core/utils/__init__.py +++ b/openlp/core/utils/__init__.py @@ -337,6 +337,7 @@ def get_web_page(url, header=None, update_openlp=False): return None if update_openlp: Receiver.send_message(u'openlp_process_events') + log.debug(page) return page def file_is_unicode(filename): From 3298fa1e15f0d110210391a92812ac219accf817 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 10 Mar 2011 17:05:12 +0100 Subject: [PATCH 65/90] reverted changed, due to database problems --- openlp/core/lib/__init__.py | 12 ------------ openlp/plugins/bibles/lib/db.py | 18 ++++++++++++++++-- openlp/plugins/songs/lib/openlyricsexport.py | 10 ++++++---- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index e92b9c64a..dc60a5a65 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -29,7 +29,6 @@ OpenLP work. """ import logging import os.path -import re import types from PyQt4 import QtCore, QtGui @@ -321,17 +320,6 @@ def check_directory_exists(dir): if not os.path.exists(dir): os.makedirs(dir) -def clean_file_name(path): - """ - Removes not supported characters from the given path. - - ``path`` - The path to clean. - """ - if not isinstance(path, unicode): - path = unicode(path, u'utf-8') - return re.sub(r'[/\\?*|<>\[\]":<>+%]+', u'_', path).strip(u'_') - from listwidgetwithdnd import ListWidgetWithDnD from displaytags import DisplayTags from spelltextedit import SpellTextEdit diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 2021afa40..5cf000ee1 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -26,13 +26,14 @@ import logging import chardet +import re from PyQt4 import QtCore from sqlalchemy import Column, ForeignKey, or_, Table, types from sqlalchemy.orm import class_mapper, mapper, relation from sqlalchemy.orm.exc import UnmappedClassError -from openlp.core.lib import clean_file_name, Receiver, translate +from openlp.core.lib import Receiver, translate from openlp.core.lib.db import BaseModel, init_db, Manager from openlp.core.lib.ui import critical_error_message_box @@ -154,7 +155,7 @@ class BibleDB(QtCore.QObject, Manager): self.name = kwargs[u'name'] if not isinstance(self.name, unicode): self.name = unicode(self.name, u'utf-8') - self.file = clean_file_name(self.name) + u'.sqlite' + self.file = self.clean_filename(self.name) if u'file' in kwargs: self.file = kwargs[u'file'] Manager.__init__(self, u'bibles', init_schema, self.file) @@ -182,6 +183,19 @@ class BibleDB(QtCore.QObject, Manager): self.name = None return self.name + def clean_filename(self, old_filename): + """ + Clean up the version name of the Bible and convert it into a valid + file name. + + ``old_filename`` + The "dirty" file name or version name. + """ + if not isinstance(old_filename, unicode): + old_filename = unicode(old_filename, u'utf-8') + old_filename = re.sub(r'[^\w]+', u'_', old_filename).strip(u'_') + return old_filename + u'.sqlite' + def register(self, wizard): """ This method basically just initialialises the database. It is called diff --git a/openlp/plugins/songs/lib/openlyricsexport.py b/openlp/plugins/songs/lib/openlyricsexport.py index f4fdd769a..42410a7e0 100644 --- a/openlp/plugins/songs/lib/openlyricsexport.py +++ b/openlp/plugins/songs/lib/openlyricsexport.py @@ -29,11 +29,11 @@ songs from the database to the OpenLyrics format. """ import logging import os +import re from lxml import etree -from openlp.core.lib import check_directory_exists, clean_file_name, Receiver, \ - translate +from openlp.core.lib import check_directory_exists, Receiver, translate from openlp.plugins.songs.lib import OpenLyrics log = logging.getLogger(__name__) @@ -69,8 +69,10 @@ class OpenLyricsExport(object): song.title) xml = openLyrics.song_to_xml(song) tree = etree.ElementTree(etree.fromstring(xml)) - filename = clean_file_name(u'%s (%s).xml' % (song.title, - u', '.join([author.display_name for author in song.authors]))) + filename = u'%s (%s).xml' % (song.title, + u', '.join([author.display_name for author in song.authors])) + filename = re.sub( + r'[/\\?*|<>\[\]":<>+%]+', u'_', filename).strip(u'_') tree.write(os.path.join(self.save_path, filename), encoding=u'utf-8', xml_declaration=True, pretty_print=True) return True From 0070488784fc0047d4fc7b21167af5c0195fea5b Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 10 Mar 2011 18:56:42 +0100 Subject: [PATCH 66/90] clean up --- openlp/plugins/bibles/lib/mediaitem.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 690564182..2b2f6597e 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -449,8 +449,7 @@ class BibleMediaItem(MediaManagerItem): if restore: old_text = unicode(combo.currentText()) combo.clear() - for i in range(range_from, range_to + 1): - combo.addItem(unicode(i)) + combo.addItems([unicode(i) for i in range(range_from, range_to + 1)]) if restore and combo.findText(old_text) != -1: combo.setCurrentIndex(combo.findText(old_text)) @@ -704,8 +703,7 @@ class BibleMediaItem(MediaManagerItem): service_item.theme = None else: service_item.theme = self.settings.bible_theme - for slide in raw_slides: - service_item.add_from_text(slide[:30], slide) + [service_item.add_from_text(slide[:30], slide) for slide in raw_slides] return True def formatTitle(self, start_item, old_item): @@ -744,8 +742,7 @@ class BibleMediaItem(MediaManagerItem): else: verse_range = start_chapter + verse_separator + start_verse + \ range_separator + old_chapter + verse_separator + old_verse - title = u'%s %s (%s)' % (start_book, verse_range, bibles) - return title + return u'%s %s (%s)' % (start_book, verse_range, bibles) def checkTitle(self, item, old_item): """ From 010adf3f254e9779b2b83116362aa5f2ea9ce2fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Thu, 10 Mar 2011 20:31:34 +0200 Subject: [PATCH 67/90] Improve readability a bit, as Meths suggested. --- openlp/core/ui/servicemanager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 73ca4b9ca..fa2bc50f5 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -417,7 +417,7 @@ class ServiceManager(QtGui.QWidget): return self.saveFileAs() path_file_name = unicode(self.fileName()) (path, file_name) = os.path.split(path_file_name) - basename = file_name[0:file_name.rfind(u'.')-1] + (basename, extension) = os.path.splitext(file_name) service_file_name = basename + '.osd' log.debug(u'ServiceManager.saveFile - %s' % path_file_name) SettingsManager.set_last_dir(self.mainwindow.serviceSettingsSection, From 8374c2d449be28fcd3417ad066ad7feb7a3f70e6 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 10 Mar 2011 20:17:05 +0100 Subject: [PATCH 68/90] redundant code --- openlp/core/lib/__init__.py | 3 +-- openlp/core/lib/plugin.py | 9 ++++----- openlp/plugins/alerts/alertsplugin.py | 2 +- openlp/plugins/bibles/bibleplugin.py | 2 +- openlp/plugins/custom/customplugin.py | 2 +- openlp/plugins/images/imageplugin.py | 3 +-- openlp/plugins/media/mediaplugin.py | 2 +- openlp/plugins/presentations/presentationplugin.py | 2 +- openlp/plugins/remotes/remoteplugin.py | 2 +- openlp/plugins/songs/songsplugin.py | 3 +-- openlp/plugins/songusage/songusageplugin.py | 2 +- 11 files changed, 14 insertions(+), 18 deletions(-) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index dc60a5a65..1fb842361 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -248,9 +248,8 @@ def resize_image(image, width, height, background=QtCore.Qt.black): ``height`` The new image height. - ``background`` + ``background`` The background colour defaults to black. - """ log.debug(u'resize_image - start') if isinstance(image, QtGui.QImage): diff --git a/openlp/core/lib/plugin.py b/openlp/core/lib/plugin.py index c1ff30281..6195cb248 100644 --- a/openlp/core/lib/plugin.py +++ b/openlp/core/lib/plugin.py @@ -114,8 +114,8 @@ class Plugin(QtCore.QObject): """ log.info(u'loaded') - def __init__(self, name, version=None, pluginHelpers=None, - mediaItemClass=None, settingsTabClass=None): + def __init__(self, name, pluginHelpers=None, mediaItemClass=None, + settingsTabClass=None, version=None): """ This is the constructor for the plugin object. This provides an easy way for descendent plugins to populate common data. This method *must* @@ -123,7 +123,7 @@ class Plugin(QtCore.QObject): class MyPlugin(Plugin): def __init__(self): - Plugin.__init__(self, u'MyPlugin', u'0.1') + Plugin.__init__(self, u'MyPlugin', version=u'0.1') ``name`` Defaults to *None*. The name of the plugin. @@ -145,8 +145,7 @@ class Plugin(QtCore.QObject): self.textStrings = {} self.setPluginTextStrings() self.nameStrings = self.textStrings[StringContent.Name] - if version: - self.version = version + self.version = version if version else u'1.9.4' self.settingsSection = self.name.lower() self.icon = None self.mediaItemClass = mediaItemClass diff --git a/openlp/plugins/alerts/alertsplugin.py b/openlp/plugins/alerts/alertsplugin.py index 1d9bd4c61..256e78916 100644 --- a/openlp/plugins/alerts/alertsplugin.py +++ b/openlp/plugins/alerts/alertsplugin.py @@ -40,7 +40,7 @@ class AlertsPlugin(Plugin): log.info(u'Alerts Plugin loaded') def __init__(self, plugin_helpers): - Plugin.__init__(self, u'Alerts', u'1.9.4', plugin_helpers, + Plugin.__init__(self, u'Alerts', plugin_helpers, settingsTabClass=AlertsTab) self.weight = -3 self.icon = build_icon(u':/plugins/plugin_alerts.png') diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index 73a9b7e1d..61bca84aa 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -37,7 +37,7 @@ class BiblePlugin(Plugin): log.info(u'Bible Plugin loaded') def __init__(self, plugin_helpers): - Plugin.__init__(self, u'Bibles', u'1.9.4', plugin_helpers, + Plugin.__init__(self, u'Bibles', plugin_helpers, BibleMediaItem, BiblesTab) self.weight = -9 self.icon_path = u':/plugins/plugin_bibles.png' diff --git a/openlp/plugins/custom/customplugin.py b/openlp/plugins/custom/customplugin.py index c6c129e68..79064b53c 100644 --- a/openlp/plugins/custom/customplugin.py +++ b/openlp/plugins/custom/customplugin.py @@ -47,7 +47,7 @@ class CustomPlugin(Plugin): log.info(u'Custom Plugin loaded') def __init__(self, plugin_helpers): - Plugin.__init__(self, u'Custom', u'1.9.4', plugin_helpers, + Plugin.__init__(self, u'Custom', plugin_helpers, CustomMediaItem, CustomTab) self.weight = -5 self.manager = Manager(u'custom', init_schema) diff --git a/openlp/plugins/images/imageplugin.py b/openlp/plugins/images/imageplugin.py index 84d7a71cc..ae7f56e1d 100644 --- a/openlp/plugins/images/imageplugin.py +++ b/openlp/plugins/images/imageplugin.py @@ -35,8 +35,7 @@ class ImagePlugin(Plugin): log.info(u'Image Plugin loaded') def __init__(self, plugin_helpers): - Plugin.__init__(self, u'Images', u'1.9.4', plugin_helpers, - ImageMediaItem) + Plugin.__init__(self, u'Images', plugin_helpers, ImageMediaItem) self.weight = -7 self.icon_path = u':/plugins/plugin_images.png' self.icon = build_icon(self.icon_path) diff --git a/openlp/plugins/media/mediaplugin.py b/openlp/plugins/media/mediaplugin.py index 3438f0279..b1c1a2f3e 100644 --- a/openlp/plugins/media/mediaplugin.py +++ b/openlp/plugins/media/mediaplugin.py @@ -38,7 +38,7 @@ class MediaPlugin(Plugin): log.info(u'%s MediaPlugin loaded', __name__) def __init__(self, plugin_helpers): - Plugin.__init__(self, u'Media', u'1.9.4', plugin_helpers, + Plugin.__init__(self, u'Media', plugin_helpers, MediaMediaItem, MediaTab) self.weight = -6 self.icon_path = u':/plugins/plugin_media.png' diff --git a/openlp/plugins/presentations/presentationplugin.py b/openlp/plugins/presentations/presentationplugin.py index eb7e714f0..f45901e43 100644 --- a/openlp/plugins/presentations/presentationplugin.py +++ b/openlp/plugins/presentations/presentationplugin.py @@ -51,7 +51,7 @@ class PresentationPlugin(Plugin): """ log.debug(u'Initialised') self.controllers = {} - Plugin.__init__(self, u'Presentations', u'1.9.4', plugin_helpers) + Plugin.__init__(self, u'Presentations', plugin_helpers) self.weight = -8 self.icon_path = u':/plugins/plugin_presentations.png' self.icon = build_icon(self.icon_path) diff --git a/openlp/plugins/remotes/remoteplugin.py b/openlp/plugins/remotes/remoteplugin.py index 7236d7546..0ed0ec099 100644 --- a/openlp/plugins/remotes/remoteplugin.py +++ b/openlp/plugins/remotes/remoteplugin.py @@ -38,7 +38,7 @@ class RemotesPlugin(Plugin): """ remotes constructor """ - Plugin.__init__(self, u'Remotes', u'1.9.4', plugin_helpers, + Plugin.__init__(self, u'Remotes', plugin_helpers, settingsTabClass=RemoteTab) self.icon = build_icon(u':/plugins/plugin_remote.png') self.weight = -1 diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index bfd5c4eea..1e072afdf 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -53,8 +53,7 @@ class SongsPlugin(Plugin): """ Create and set up the Songs plugin. """ - Plugin.__init__(self, u'Songs', u'1.9.4', plugin_helpers, - SongMediaItem, SongsTab) + Plugin.__init__(self, u'Songs', plugin_helpers, SongMediaItem, SongsTab) self.weight = -10 self.manager = Manager(u'songs', init_schema) self.icon_path = u':/plugins/plugin_songs.png' diff --git a/openlp/plugins/songusage/songusageplugin.py b/openlp/plugins/songusage/songusageplugin.py index e1dc0f1a8..99446dbe4 100644 --- a/openlp/plugins/songusage/songusageplugin.py +++ b/openlp/plugins/songusage/songusageplugin.py @@ -42,7 +42,7 @@ class SongUsagePlugin(Plugin): log.info(u'SongUsage Plugin loaded') def __init__(self, plugin_helpers): - Plugin.__init__(self, u'SongUsage', u'1.9.4', plugin_helpers) + Plugin.__init__(self, u'SongUsage', plugin_helpers) self.weight = -4 self.icon = build_icon(u':/plugins/plugin_songusage.png') self.manager = None From 717a243bfcbdc639255a754f6192c293fa2cb8f8 Mon Sep 17 00:00:00 2001 From: "John Cegalis jseagull1@hotmail.com" Date: Thu, 10 Mar 2011 14:52:09 -0500 Subject: [PATCH 69/90] cleaned up grammar --- documentation/manual/source/dualmonitors.rst | 10 ++++++---- documentation/manual/source/songs.rst | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/documentation/manual/source/dualmonitors.rst b/documentation/manual/source/dualmonitors.rst index 72384fe52..9a021223b 100644 --- a/documentation/manual/source/dualmonitors.rst +++ b/documentation/manual/source/dualmonitors.rst @@ -29,7 +29,8 @@ Some computers also incorporate the use of :abbr:`S-Video (Separate Video)` or A typical OpenLP setup consist of your normal single monitor, with your projector hooked up to your computer as the second monitor. With the option of -extending your desktop across the second monitor, or your operating system's equivalent. +extending your desktop across the second monitor, or your operating system's +equivalent. Microsoft Windows ----------------- @@ -46,8 +47,8 @@ press :kbd:`Windows+P`. The more traditional way is also fairly straight forward. Go to :guilabel:`Control Panel` and click on :guilabel:`Display`. This will open up -the :guilabel:`Display` dialog. You may also bypass this step by a right click on -a blank area on your desktop and selecting :guilabel:`Resolution`. +the :guilabel:`Display` dialog. You may also bypass this step by a right click +on a blank area on your desktop and selecting :guilabel:`Resolution`. .. image:: pics/winsevendisplay.png @@ -123,7 +124,8 @@ Linux Systems Using nVidia Drivers This guide is for users of the proprietary nVidia driver on Linux Distributions. It is assumed that you have properly setup your drivers according to your -distribution's documentation, and you have a working ``xorg.conf`` file in place. +distribution's documentation, and you have a working ``xorg.conf`` file in +place. If you wish to make the changes permanent in setting up your system for dual monitors it will be necessary to modify your ``xorg.conf`` file. It is always a diff --git a/documentation/manual/source/songs.rst b/documentation/manual/source/songs.rst index 53db50242..91e5539c2 100644 --- a/documentation/manual/source/songs.rst +++ b/documentation/manual/source/songs.rst @@ -58,8 +58,9 @@ the folder. .. image:: pics/selectsongs.png On most operating systems, to select all the songs, first select the first song -in the list, press the shift key, and select the last song in the list. After this -press :guilabel:`Next` and you will see that your import has been successful. +in the list, press the shift key, and select the last song in the list. After +this press :guilabel:`Next` and you will see that your import has been +successful. .. image:: pics/finishedimport.png @@ -89,8 +90,9 @@ Choose either the .txt or .usr file. You will be asked to chose a download location if your browser does not automatically select that for you. Select this file from the OpenLP import window and then click :guilabel:`Next` You can also select multiple songs for import at once on most operating systems by -selecting the first item in the list then holding the shift key and select the last -item in the list. When finished, you will see that your import has completed. +selecting the first item in the list then holding the shift key and select the +last item in the list. When finished, you will see that your import has +completed. .. image:: pics/finishedimport.png From f07797f88fcd36dbe6748a53b3ab25f8a590714c Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 10 Mar 2011 21:49:53 +0100 Subject: [PATCH 70/90] fixed copyright --- openlp/core/ui/aboutdialog.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/ui/aboutdialog.py b/openlp/core/ui/aboutdialog.py index d973c5680..aec1bad51 100644 --- a/openlp/core/ui/aboutdialog.py +++ b/openlp/core/ui/aboutdialog.py @@ -226,7 +226,7 @@ class Ui_AboutDialog(object): 'Portions copyright \xa9 2004-2011 ' 'Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri,\n' 'Meinert Jordan, Andreas Preikschat, Christian Richter, Philip\n' - 'Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, Carstenn' + 'Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, Carsten\n' 'Tinggaard, Frode Woldsund') licence = translate('OpenLP.AboutForm', 'This program is free software; you can redistribute it and/or ' From b522247094b1a1af3dceed56fe830f323082a450 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Thu, 10 Mar 2011 22:25:58 +0000 Subject: [PATCH 71/90] Fix SoF/OOo imports --- openlp/plugins/songs/lib/oooimport.py | 10 +++++----- openlp/plugins/songs/lib/songimport.py | 19 ++++++++++--------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/openlp/plugins/songs/lib/oooimport.py b/openlp/plugins/songs/lib/oooimport.py index 4fb6b5876..77b629398 100644 --- a/openlp/plugins/songs/lib/oooimport.py +++ b/openlp/plugins/songs/lib/oooimport.py @@ -96,7 +96,7 @@ class OooImport(SongImport): """ if os.name == u'nt': self.start_ooo_process() - self.desktop = self.manager.createInstance( + self.desktop = self.ooo_manager.createInstance( u'com.sun.star.frame.Desktop') else: context = uno.getComponentContext() @@ -118,9 +118,9 @@ class OooImport(SongImport): def start_ooo_process(self): try: if os.name == u'nt': - self.manager = Dispatch(u'com.sun.star.ServiceManager') - self.manager._FlagAsMethod(u'Bridge_GetStruct') - self.manager._FlagAsMethod(u'Bridge_GetValueObject') + self.ooo_manager = Dispatch(u'com.sun.star.ServiceManager') + self.ooo_manager._FlagAsMethod(u'Bridge_GetStruct') + self.ooo_manager._FlagAsMethod(u'Bridge_GetValueObject') else: cmd = get_uno_command() process = QtCore.QProcess() @@ -134,6 +134,7 @@ class OooImport(SongImport): """ Open the passed file in OpenOffice.org Impress """ + self.filepath = filepath if os.name == u'nt': url = filepath.replace(u'\\', u'/') url = url.replace(u':', u'|').replace(u' ', u'%20') @@ -191,7 +192,6 @@ class OooImport(SongImport): if slidetext.strip() == u'': slidetext = u'\f' text += slidetext - song = SongImport(self.manager) songs = SongImport.process_songs_text(self.manager, text) for song in songs: song.finish() diff --git a/openlp/plugins/songs/lib/songimport.py b/openlp/plugins/songs/lib/songimport.py index fc78b5033..78d203ae3 100644 --- a/openlp/plugins/songs/lib/songimport.py +++ b/openlp/plugins/songs/lib/songimport.py @@ -55,13 +55,14 @@ class SongImport(QtCore.QObject): """ self.manager = manager QtCore.QObject.__init__(self) - if kwargs.has_key(u'filename'): - self.import_source = kwargs[u'filename'] - elif kwargs.has_key(u'filenames'): - self.import_source = kwargs[u'filenames'] - else: - raise KeyError(u'Keyword arguments "filename[s]" not supplied.') - log.debug(self.import_source) + if kwargs: + if kwargs.has_key(u'filename'): + self.import_source = kwargs[u'filename'] + elif kwargs.has_key(u'filenames'): + self.import_source = kwargs[u'filenames'] + else: + raise KeyError(u'Keyword arguments "filename[s]" not supplied.') + log.debug(self.import_source) self.song = None self.stop_import_flag = False self.set_defaults() @@ -146,12 +147,12 @@ class SongImport(QtCore.QObject): def process_verse_text(self, text): lines = text.split(u'\n') if text.lower().find(self.copyright_string) >= 0 \ - or text.find(SongStrings.CopyrightSymbol) >= 0: + or text.find(unicode(SongStrings.CopyrightSymbol)) >= 0: copyright_found = False for line in lines: if (copyright_found or line.lower().find(self.copyright_string) >= 0 or - line.find(SongStrings.CopyrightSymbol) >= 0): + line.find(unicode(SongStrings.CopyrightSymbol)) >= 0): copyright_found = True self.add_copyright(line) else: From e77ced2e64fdfca42e5275bf06faaed8fcf194d9 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 11 Mar 2011 06:50:32 +0200 Subject: [PATCH 72/90] Removed unnecessary comments. --- openlp/core/ui/mainwindow.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 54909b5a7..d638fd07d 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -228,11 +228,10 @@ class Ui_MainWindow(object): # i18n Language Items self.AutoLanguageItem = checkable_action(mainWindow, u'AutoLanguageItem', LanguageManager.auto_language) - #mainWindow.actionList.add_action(self.AutoLanguageItem, u'Settings') + mainWindow.actionList.add_action(self.AutoLanguageItem, u'Settings') self.LanguageGroup = QtGui.QActionGroup(mainWindow) self.LanguageGroup.setExclusive(True) self.LanguageGroup.setObjectName(u'LanguageGroup') - #self.LanguageGroup.setDisabled(LanguageManager.auto_language) add_actions(self.LanguageGroup, [self.AutoLanguageItem]) qmList = LanguageManager.get_qm_list() savedLanguage = LanguageManager.get_language() From 21d59235ac99b2a7585d97a009cb853b6a40fae9 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 11 Mar 2011 07:15:41 +0200 Subject: [PATCH 73/90] Stop signal from running twice and set 'Autodetect' text after language names have been set. --- openlp/core/ui/mainwindow.py | 10 ++++------ openlp/core/utils/languagemanager.py | 10 +++++++--- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index d638fd07d..cb324a872 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -425,14 +425,14 @@ class Ui_MainWindow(object): translate('OpenLP.MainWindow', '&Online Help')) self.helpWebSiteItem.setText( translate('OpenLP.MainWindow', '&Web Site')) - self.AutoLanguageItem.setText( - translate('OpenLP.MainWindow', '&Auto Detect')) - self.AutoLanguageItem.setStatusTip(translate('OpenLP.MainWindow', - 'Use the system language, if available.')) for item in self.LanguageGroup.actions(): item.setText(item.objectName()) item.setStatusTip(unicode(translate('OpenLP.MainWindow', 'Set the interface language to %s')) % item.objectName()) + self.AutoLanguageItem.setText( + translate('OpenLP.MainWindow', '&Autodetect')) + self.AutoLanguageItem.setStatusTip(translate('OpenLP.MainWindow', + 'Use the system language, if available.')) self.ToolsAddToolItem.setText( translate('OpenLP.MainWindow', 'Add &Tool...')) self.ToolsAddToolItem.setStatusTip(translate('OpenLP.MainWindow', @@ -550,8 +550,6 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): QtCore.SIGNAL(u'triggered()'), self.ServiceManagerContents.printServiceOrder) # i18n set signals for languages - QtCore.QObject.connect(self.AutoLanguageItem, - QtCore.SIGNAL(u'toggled(bool)'), self.setAutoLanguage) self.LanguageGroup.triggered.connect(LanguageManager.set_language) QtCore.QObject.connect(self.ModeDefaultItem, QtCore.SIGNAL(u'triggered()'), self.onModeDefaultItemClicked) diff --git a/openlp/core/utils/languagemanager.py b/openlp/core/utils/languagemanager.py index 9cadf06e2..28a8b06f8 100644 --- a/openlp/core/utils/languagemanager.py +++ b/openlp/core/utils/languagemanager.py @@ -112,9 +112,13 @@ class LanguageManager(object): """ language = u'en' if action: - action_name = u'%s' % action.objectName() - qm_list = LanguageManager.get_qm_list() - language = u'%s' % qm_list[action_name] + action_name = unicode(action.objectName()) + 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 # This needs to be here for the setValue to work From b4e888067133e603ed3636e1ccd0d0dabea15c9a Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Fri, 11 Mar 2011 08:33:22 +0000 Subject: [PATCH 74/90] Remove static methods and re-work code to avoid creation of additional SongImport's. --- openlp/plugins/songs/lib/oooimport.py | 20 ++++++++++----- openlp/plugins/songs/lib/sofimport.py | 9 ++++++- openlp/plugins/songs/lib/songimport.py | 35 +++++++------------------- 3 files changed, 31 insertions(+), 33 deletions(-) diff --git a/openlp/plugins/songs/lib/oooimport.py b/openlp/plugins/songs/lib/oooimport.py index 77b629398..e9db0ac3e 100644 --- a/openlp/plugins/songs/lib/oooimport.py +++ b/openlp/plugins/songs/lib/oooimport.py @@ -192,9 +192,7 @@ class OooImport(SongImport): if slidetext.strip() == u'': slidetext = u'\f' text += slidetext - songs = SongImport.process_songs_text(self.manager, text) - for song in songs: - song.finish() + self.process_songs_text(text) return def process_doc(self): @@ -216,6 +214,16 @@ class OooImport(SongImport): if textportion.BreakType in (PAGE_AFTER, PAGE_BOTH): paratext += u'\f' text += paratext + u'\n' - songs = SongImport.process_songs_text(self.manager, text) - for song in songs: - song.finish() + self.process_songs_text(text) + + def process_songs_text(self, text): + songtexts = self.tidy_text(text).split(u'\f') + self.set_defaults() + for songtext in songtexts: + if songtext.strip(): + self.process_song_text(songtext.strip()) + if self.check_complete(): + self.finish() + self.set_defaults() + if self.check_complete(): + self.finish() diff --git a/openlp/plugins/songs/lib/sofimport.py b/openlp/plugins/songs/lib/sofimport.py index 711761114..3e5334b71 100644 --- a/openlp/plugins/songs/lib/sofimport.py +++ b/openlp/plugins/songs/lib/sofimport.py @@ -183,7 +183,7 @@ class SofImport(OooImport): into line """ text = textportion.getString() - text = SongImport.tidy_text(text) + text = self.tidy_text(text) if text.strip() == u'': return text if textportion.CharWeight == BOLD: @@ -299,8 +299,15 @@ class SofImport(OooImport): verse += line + u'\n' if verse: self.song.add_verse(verse, versetag) + if not self.is_chorus and \ + u'C1' in self.verse_order_list_generated: + self.verse_order_list_generated.append(u'C1') + self.verse_order_list_generated_useful = True else: self.song.add_verse(self.currentverse, versetag) + if not self.is_chorus and u'C1' in self.verse_order_list_generated: + self.verse_order_list_generated.append(u'C1') + self.verse_order_list_generated_useful = True self.currentverse = u'' self.is_chorus = False diff --git a/openlp/plugins/songs/lib/songimport.py b/openlp/plugins/songs/lib/songimport.py index 78d203ae3..3bc1a082f 100644 --- a/openlp/plugins/songs/lib/songimport.py +++ b/openlp/plugins/songs/lib/songimport.py @@ -55,14 +55,13 @@ class SongImport(QtCore.QObject): """ self.manager = manager QtCore.QObject.__init__(self) - if kwargs: - if kwargs.has_key(u'filename'): - self.import_source = kwargs[u'filename'] - elif kwargs.has_key(u'filenames'): - self.import_source = kwargs[u'filenames'] - else: - raise KeyError(u'Keyword arguments "filename[s]" not supplied.') - log.debug(self.import_source) + if kwargs.has_key(u'filename'): + self.import_source = kwargs[u'filename'] + elif kwargs.has_key(u'filenames'): + self.import_source = kwargs[u'filenames'] + else: + raise KeyError(u'Keyword arguments "filename[s]" not supplied.') + log.debug(self.import_source) self.song = None self.stop_import_flag = False self.set_defaults() @@ -104,23 +103,7 @@ class SongImport(QtCore.QObject): def register(self, import_wizard): self.import_wizard = import_wizard - @staticmethod - def process_songs_text(manager, text): - songs = [] - songtexts = SongImport.tidy_text(text).split(u'\f') - song = SongImport(manager) - for songtext in songtexts: - if songtext.strip(): - song.process_song_text(songtext.strip()) - if song.check_complete(): - songs.append(song) - song = SongImport(manager) - if song.check_complete(): - songs.append(song) - return songs - - @staticmethod - def tidy_text(text): + def tidy_text(self, text): """ Get rid of some dodgy unicode and formatting characters we're not interested in. Some can be converted to ascii. @@ -241,7 +224,7 @@ class SongImport(QtCore.QObject): self.verse_counts[verse_def[0]] = int(verse_def[1:]) self.verses.append([verse_def, verse_text.rstrip(), lang]) self.verse_order_list_generated.append(verse_def) - + def repeat_verse(self): """ Repeat the previous verse in the verse order From 7336575067f4db37983364330fde54200f0fa827 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Fri, 11 Mar 2011 08:46:21 +0000 Subject: [PATCH 75/90] SOF fixes, auto add chorus to verse order again --- openlp/plugins/songs/lib/sofimport.py | 73 ++++++++++++++------------- 1 file changed, 37 insertions(+), 36 deletions(-) diff --git a/openlp/plugins/songs/lib/sofimport.py b/openlp/plugins/songs/lib/sofimport.py index 3e5334b71..49adcd302 100644 --- a/openlp/plugins/songs/lib/sofimport.py +++ b/openlp/plugins/songs/lib/sofimport.py @@ -72,6 +72,7 @@ class SofImport(OooImport): to SongImport for writing song to disk """ OooImport.__init__(self, manager, **kwargs) + self.song = False def process_ooo_document(self): """ @@ -94,8 +95,8 @@ class SofImport(OooImport): if paragraph.supportsService("com.sun.star.text.Paragraph"): self.process_paragraph(paragraph) if self.song: - self.song.finish() - self.song = None + self.finish() + self.song = False def process_paragraph(self, paragraph): """ @@ -143,7 +144,7 @@ class SofImport(OooImport): self.blanklines += 1 if self.blanklines > 1: return - if self.song.title != u'': + if self.title != u'': self.finish_verse() return self.blanklines = 0 @@ -161,17 +162,17 @@ class SofImport(OooImport): self.skip_to_close_bracket = True return if text.startswith(u'Copyright'): - self.song.add_copyright(text) + self.add_copyright(text) return if text == u'(Repeat)': self.finish_verse() - self.song.repeat_verse() + self.repeat_verse() return - if self.song.title == u'': - if self.song.copyright == u'': - self.add_author(text) + if self.title == u'': + if self.copyright == u'': + self.add_sof_author(text) else: - self.song.add_copyright(text) + self.add_copyright(text) return self.add_verse_line(text) @@ -188,10 +189,10 @@ class SofImport(OooImport): return text if textportion.CharWeight == BOLD: boldtext = text.strip() - if boldtext.isdigit() and self.song.song_number == '': + if boldtext.isdigit() and self.song_number == '': self.add_songnumber(boldtext) return u'' - if self.song.title == u'': + if self.title == u'': text = self.uncap_text(text) self.add_title(text) return text @@ -207,10 +208,11 @@ class SofImport(OooImport): """ if self.song: self.finish_verse() - if not self.song.check_complete(): + if not self.check_complete(): return - self.song.finish() - self.song = SongImport(self.manager) + self.finish() + self.song = True + self.set_defaults() self.skip_to_close_bracket = False self.is_chorus = False self.italics = False @@ -221,17 +223,17 @@ class SofImport(OooImport): Add a song number, store as alternate title. Also use the song number to work out which songbook we're in """ - self.song.song_number = song_no - self.song.alternate_title = song_no + u'.' - self.song.song_book_pub = u'Kingsway Publications' + self.song_number = song_no + self.alternate_title = song_no + u'.' + self.song_book_pub = u'Kingsway Publications' if int(song_no) <= 640: - self.song.song_book = u'Songs of Fellowship 1' + self.song_book = u'Songs of Fellowship 1' elif int(song_no) <= 1150: - self.song.song_book = u'Songs of Fellowship 2' + self.song_book = u'Songs of Fellowship 2' elif int(song_no) <= 1690: - self.song.song_book = u'Songs of Fellowship 3' + self.song_book = u'Songs of Fellowship 3' else: - self.song.song_book = u'Songs of Fellowship 4' + self.song_book = u'Songs of Fellowship 4' def add_title(self, text): """ @@ -243,10 +245,10 @@ class SofImport(OooImport): title = title[1:] if title.endswith(u','): title = title[:-1] - self.song.title = title + self.title = title self.import_wizard.incrementProgressBar(u'Processing song ' + title, 0) - def add_author(self, text): + def add_sof_author(self, text): """ Add the author. OpenLP stores them individually so split by 'and', '&' and comma. @@ -254,7 +256,7 @@ class SofImport(OooImport): "Mr Smith" and "Mrs Smith". """ text = text.replace(u' and ', u' & ') - self.song.parse_author(text) + self.parse_author(text) def add_verse_line(self, text): """ @@ -262,7 +264,7 @@ class SofImport(OooImport): we're beyond the second line of first verse, then this indicates a change of verse. Italics are a chorus """ - if self.italics != self.is_chorus and ((len(self.song.verses) > 0) or + if self.italics != self.is_chorus and ((len(self.verses) > 0) or (self.currentverse.count(u'\n') > 1)): self.finish_verse() if self.italics: @@ -282,14 +284,14 @@ class SofImport(OooImport): splitat = None else: versetag = u'V' - splitat = self.verse_splits(self.song.song_number) + splitat = self.verse_splits(self.song_number) if splitat: ln = 0 verse = u'' for line in self.currentverse.split(u'\n'): ln += 1 if line == u'' or ln > splitat: - self.song.add_verse(verse, versetag) + self.add_sof_verse(verse, versetag) ln = 0 if line: verse = line + u'\n' @@ -298,19 +300,18 @@ class SofImport(OooImport): else: verse += line + u'\n' if verse: - self.song.add_verse(verse, versetag) - if not self.is_chorus and \ - u'C1' in self.verse_order_list_generated: - self.verse_order_list_generated.append(u'C1') - self.verse_order_list_generated_useful = True + self.add_sof_verse(verse, versetag) else: - self.song.add_verse(self.currentverse, versetag) - if not self.is_chorus and u'C1' in self.verse_order_list_generated: - self.verse_order_list_generated.append(u'C1') - self.verse_order_list_generated_useful = True + self.add_sof_verse(self.currentverse, versetag) self.currentverse = u'' self.is_chorus = False + def add_sof_verse(self, lyrics, tag): + self.add_verse(lyrics, tag) + if not self.is_chorus and u'C1' in self.verse_order_list_generated: + self.verse_order_list_generated.append(u'C1') + self.verse_order_list_generated_useful = True + def uncap_text(self, text): """ Words in the title are in all capitals, so we lowercase them. From 6448ac50923560cee7bcbbc260d3ef8996dbd6c7 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 11 Mar 2011 12:20:09 +0200 Subject: [PATCH 76/90] Last few changes to the wizard. --- openlp.pyw | 4 +- openlp/core/ui/firsttimeform.py | 157 +++++++++++++++++++++--------- openlp/core/ui/firsttimewizard.py | 24 ++++- 3 files changed, 135 insertions(+), 50 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index 39719a80e..ca83a143b 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -171,8 +171,8 @@ class OpenLP(QtGui.QApplication): screens = ScreenList(self.desktop()) # First time checks in settings firstTime = QtCore.QSettings().value( - u'general/first time', QtCore.QVariant(True)).toBool() - if firstTime: + u'general/has run wizard', QtCore.QVariant(False)).toBool() + if not firstTime: FirstTimeForm(screens).exec_() if os.name == u'nt': self.setStyleSheet(application_stylesheet) diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index dd8c57eb0..b3f030fdc 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -54,19 +54,14 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): # check to see if we have web access self.web = u'http://openlp.org/files/frw/' self.config = SafeConfigParser() - self.webAccess = get_web_page(u'%s%s' % (self.web, u'download.cfg?%s' % randint(0, 20))) + self.webAccess = get_web_page(u'%s%s' % (self.web, u'download.cfg')) if self.webAccess: files = self.webAccess.read() self.config.readfp(io.BytesIO(files)) for screen in screens.get_screen_list(): self.displayComboBox.addItem(screen) - self.songsText = translate('OpenLP.FirstTimeWizard', 'Songs') - self.biblesText = translate('OpenLP.FirstTimeWizard', 'Bibles') - self.themesText = translate('OpenLP.FirstTimeWizard', 'Themes') - self.startUpdates = translate('OpenLP.FirstTimeWizard', - 'Starting Updates') self.downloading = unicode(translate('OpenLP.FirstTimeWizard', - 'Downloading %s')) + 'Downloading %s...')) QtCore.QObject.connect(self, QtCore.SIGNAL(u'currentIdChanged(int)'), self.onCurrentIdChanged) @@ -141,6 +136,8 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): return FirstTimePage.NoInternet else: return FirstTimePage.Songs + elif self.currentId() == FirstTimePage.Progress: + return -1 else: return self.currentId() + 1 @@ -158,54 +155,128 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): item = self.themesListWidget.item(iter) if item.checkState() == QtCore.Qt.Checked: self.themeComboBox.addItem(item.text()) + elif pageId == FirstTimePage.Progress: + self._preWizard() + self._performWizard() + self._postWizard() - def accept(self): - Receiver.send_message(u'cursor_busy') - self._updateMessage(self.startUpdates) - # Set up the Plugin status's - self._pluginStatus(self.songsCheckBox, u'songs/status') - self._pluginStatus(self.bibleCheckBox, u'bibles/status') - self._pluginStatus(self.presentationCheckBox, u'presentations/status') - self._pluginStatus(self.imageCheckBox, u'images/status') - self._pluginStatus(self.mediaCheckBox, u'media/status') - self._pluginStatus(self.remoteCheckBox, u'remotes/status') - self._pluginStatus(self.customCheckBox, u'custom/status') - self._pluginStatus(self.songUsageCheckBox, u'songusage/status') - self._pluginStatus(self.alertCheckBox, u'alerts/status') + def _incrementProgressBar(self, status_text, increment=1): + """ + Update the wizard progress page. + + ``status_text`` + Current status information to display. + + ``increment`` + The value to increment the progress bar by. + """ + if status_text: + self.progressLabel.setText(status_text) + if increment > 0: + self.progressBar.setValue(self.progressBar.value() + increment) + Receiver.send_message(u'openlp_process_events') + + def _preWizard(self): + """ + Prepare the UI for the process. + """ + # We start on 9 for the 9 plugins + max_progress = 9 + # Loop through the songs list and increase for each selected item + for i in xrange(self.songsListWidget.count()): + if self.songsListWidget.item(i).checkState() == QtCore.Qt.Checked: + max_progress += 1 + # Loop through the Bibles list and increase for each selected item + iterator = QtGui.QTreeWidgetItemIterator(self.biblesTreeWidget) + while iterator.value(): + item = iterator.value() + if item.parent() and item.checkState(0) == QtCore.Qt.Checked: + max_progress += 1 + iterator += 1 + # Loop through the themes list and increase for each selected item + for i in xrange(self.themesListWidget.count()): + if self.themesListWidget.item(i).checkState() == QtCore.Qt.Checked: + max_progress += 1 + self.finishButton.setVisible(False) + self.progressBar.setValue(0) + self.progressBar.setMinimum(0) + self.progressBar.setMaximum(max_progress) + + def _postWizard(self): + """ + Clean up the UI after the process has finished. + """ + self.progressBar.setValue(self.progressBar.maximum()) + self.finishButton.setVisible(True) + self.finishButton.setEnabled(True) + self.cancelButton.setVisible(False) + self.nextButton.setVisible(False) + Receiver.send_message(u'openlp_process_events') + + def _performWizard(self): + """ + Run the tasks in the wizard. + """ + # Set plugin states + self._incrementProgressBar(translate('OpenLP.FirstTimeWizard', + 'Enabling selected plugins...')) + self._setPluginStatus(self.songsCheckBox, u'songs/status') + self._incrementProgressBar(None) + self._setPluginStatus(self.bibleCheckBox, u'bibles/status') + self._incrementProgressBar(None) + self._setPluginStatus(self.presentationCheckBox, u'presentations/status') + self._incrementProgressBar(None) + self._setPluginStatus(self.imageCheckBox, u'images/status') + self._incrementProgressBar(None) + self._setPluginStatus(self.mediaCheckBox, u'media/status') + self._incrementProgressBar(None) + self._setPluginStatus(self.remoteCheckBox, u'remotes/status') + self._incrementProgressBar(None) + self._setPluginStatus(self.customCheckBox, u'custom/status') + self._incrementProgressBar(None) + self._setPluginStatus(self.songUsageCheckBox, u'songusage/status') + self._incrementProgressBar(None) + self._setPluginStatus(self.alertCheckBox, u'alerts/status') # Build directories for downloads - destination = AppLocation.get_temp_path() - check_directory_exists(destination) + songs_destination = AppLocation.get_section_data_path(u'songs') bibles_destination = AppLocation.get_section_data_path(u'bibles') - check_directory_exists(bibles_destination) themes_destination = AppLocation.get_section_data_path(u'themes') - check_directory_exists(destination) # Install songs - songs_iterator = QtGui.QListWidgetItemIterator(self.songsListWidget) - while songs_iterator.value(): - item = songs_iterator.value() + for i in xrange(self.songsListWidget.count()): + item = self.songsListWidget.item(i) if item.checkState() == QtCore.Qt.Checked: filename = item.data(QtCore.Qt.UserRole).toString() - urllib.urlretrieve(u'%s%s' % (self.web, filename), - os.path.join(destination, filename)) - #importer = SongImporter() - songs_iterator += 1 + self._incrementProgressBar(self.downloading % filename) + destination = os.path.join(songs_destination, u'songs.sqlite') + if os.path.exists(destination): + if QtGui.QMessageBox.question(self, + translate('OpenLP.FirstTimeWizard', + 'Overwrite Existing Songs?'), + translate('OpenLP.FirstTimeWizard', 'Your songs ' + 'database already exists, are you sure you want to ' + 'overwrite it?'), + QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, + QtGui.QMessageBox.No) != QtGui.QMessageBox.Yes: + continue + urllib.urlretrieve(u'%s%s' % (self.web, filename), destination) # Install Bibles bibles_iterator = QtGui.QTreeWidgetItemIterator(self.biblesTreeWidget) while bibles_iterator.value(): item = bibles_iterator.value() if item.parent() and item.checkState(0) == QtCore.Qt.Checked: bible = unicode(item.data(0, QtCore.Qt.UserRole).toString()) + self._incrementProgressBar(self.downloading % bible) urllib.urlretrieve(u'%s%s' % (self.web, bible), os.path.join(bibles_destination, bible)) bibles_iterator += 1 - themes_iterator = QtGui.QListWidgetItemIterator(self.themesListWidget) - while themes_iterator.value(): - item = themes_iterator.value() + # Install themes + for i in xrange(self.themesListWidget.count()): + item = self.themesListWidget.item(i) if item.checkState() == QtCore.Qt.Checked: theme = unicode(item.data(QtCore.Qt.UserRole).toString()) + self._incrementProgressBar(self.downloading % theme) urllib.urlretrieve(u'%s%s' % (self.web, theme), - os.path.join(theme_destination, theme)) - themes_iterator += 1 + os.path.join(themes_destination, theme)) # Set Default Display if self.displayComboBox.currentIndex() != -1: QtCore.QSettings().setValue(u'General/monitor', @@ -214,19 +285,11 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): if self.themeComboBox.currentIndex() != -1: QtCore.QSettings().setValue(u'themes/global theme', QtCore.QVariant(self.themeComboBox.currentText())) - QtCore.QSettings().setValue(u'general/first time', - QtCore.QVariant(False)) - Receiver.send_message(u'cursor_normal') - return QtGui.QWizard.accept(self) + QtCore.QSettings().setValue(u'general/has run wizard', + QtCore.QVariant(True)) - def _pluginStatus(self, field, tag): + def _setPluginStatus(self, field, tag): status = PluginStatus.Active if field.checkState() \ == QtCore.Qt.Checked else PluginStatus.Inactive QtCore.QSettings().setValue(tag, QtCore.QVariant(status)) - def _updateMessage(self, text): - """ - Keep screen up to date - """ - self.updateLabel.setText(text) - Receiver.send_message(u'openlp_process_events') diff --git a/openlp/core/ui/firsttimewizard.py b/openlp/core/ui/firsttimewizard.py index d33264362..9a8d2515e 100644 --- a/openlp/core/ui/firsttimewizard.py +++ b/openlp/core/ui/firsttimewizard.py @@ -37,6 +37,7 @@ class FirstTimePage(object): Bibles = 4 Themes = 5 Defaults = 6 + Progress = 7 class Ui_FirstTimeWizard(object): @@ -46,10 +47,12 @@ class Ui_FirstTimeWizard(object): FirstTimeWizard.setModal(True) FirstTimeWizard.setWizardStyle(QtGui.QWizard.ModernStyle) FirstTimeWizard.setOptions(QtGui.QWizard.IndependentPages| - QtGui.QWizard.NoBackButtonOnStartPage) + QtGui.QWizard.NoBackButtonOnStartPage | + QtGui.QWizard.NoBackButtonOnLastPage) self.finishButton = self.button(QtGui.QWizard.FinishButton) self.cancelButton = self.button(QtGui.QWizard.CancelButton) self.nextButton = self.button(QtGui.QWizard.NextButton) + self.backButton = self.button(QtGui.QWizard.BackButton) add_welcome_page(FirstTimeWizard, u':/wizards/wizard_firsttime.bmp') # The plugins page self.pluginPage = QtGui.QWizardPage() @@ -169,6 +172,19 @@ class Ui_FirstTimeWizard(object): self.themeComboBox.setObjectName(u'themeComboBox') self.defaultsLayout.addRow(self.themeLabel, self.themeComboBox) FirstTimeWizard.setPage(FirstTimePage.Defaults, self.defaultsPage) + # Progress page + self.progressPage = QtGui.QWizardPage() + self.progressPage.setObjectName(u'progressPage') + self.progressLayout = QtGui.QVBoxLayout(self.progressPage) + self.progressLayout.setMargin(48) + self.progressLayout.setObjectName(u'progressLayout') + self.progressLabel = QtGui.QLabel(self.progressPage) + self.progressLabel.setObjectName(u'progressLabel') + self.progressLayout.addWidget(self.progressLabel) + self.progressBar = QtGui.QProgressBar(self.progressPage) + self.progressBar.setObjectName(u'progressBar') + self.progressLayout.addWidget(self.progressBar) + FirstTimeWizard.setPage(FirstTimePage.Progress, self.progressPage) self.retranslateUi(FirstTimeWizard) QtCore.QMetaObject.connectSlotsByName(FirstTimeWizard) @@ -233,7 +249,13 @@ class Ui_FirstTimeWizard(object): 'Default Settings')) self.defaultsPage.setSubTitle(translate('OpenLP.FirstTimeWizard', 'Set up default settings to be used by OpenLP.')) + self.progressPage.setTitle(translate('OpenLP.FirstTimeWizard', + 'Setting Up And Importing')) + self.progressPage.setSubTitle(translate('OpenLP.FirstTimeWizard', + 'Please wait while OpenLP is set up and your data is imported.')) self.displayLabel.setText(translate('OpenLP.FirstTimeWizard', 'Default output display:')) self.themeLabel.setText(translate('OpenLP.FirstTimeWizard', 'Select default theme:')) + self.progressLabel.setText(translate('OpenLP.FirstTimeWizard', + 'Starting configuration process...')) From ba24cce68ef277f61b6956dde94c899b0a520eca Mon Sep 17 00:00:00 2001 From: John Cegalis Date: Fri, 11 Mar 2011 05:48:48 -0500 Subject: [PATCH 77/90] spelling fix --- documentation/manual/source/dualmonitors.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/manual/source/dualmonitors.rst b/documentation/manual/source/dualmonitors.rst index 9a021223b..5c29e8650 100644 --- a/documentation/manual/source/dualmonitors.rst +++ b/documentation/manual/source/dualmonitors.rst @@ -67,7 +67,7 @@ a blank place on the desktop and click :guilabel:`Personalization`. .. image:: pics/vistapersonalize.png From the :guilabel:`Personalization` window click on :guilabel:`Display -Settings`. Click on the montior that represents your projector and make sure +Settings`. Click on the monitor that represents your projector and make sure you have checked :guilabel:`Extend the desktop onto this monitor`. .. image:: pics/vistadisplaysettings.png From b7aa0e4c70474db90dfa623832e86680e4b7b109 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 11 Mar 2011 17:18:51 +0200 Subject: [PATCH 78/90] Fix up issues with merge proposal. --- openlp.pyw | 4 ++-- openlp/core/ui/firsttimeform.py | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index ca83a143b..cec743f01 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -170,9 +170,9 @@ class OpenLP(QtGui.QApplication): # Decide how many screens we have and their size screens = ScreenList(self.desktop()) # First time checks in settings - firstTime = QtCore.QSettings().value( + has_run_wizard = QtCore.QSettings().value( u'general/has run wizard', QtCore.QVariant(False)).toBool() - if not firstTime: + if not has_run_wizard: FirstTimeForm(screens).exec_() if os.name == u'nt': self.setStyleSheet(application_stylesheet) diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index b3f030fdc..b2895cb47 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -253,8 +253,9 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): translate('OpenLP.FirstTimeWizard', 'Overwrite Existing Songs?'), translate('OpenLP.FirstTimeWizard', 'Your songs ' - 'database already exists, are you sure you want to ' - 'overwrite it?'), + 'database already exists and your current songs will ' + 'be permanently lost, are you sure you want to ' + 'replace it ?'), QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No) != QtGui.QMessageBox.Yes: continue From f0379925bc3a00f5f6df0abb0391667bcbcec0eb Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 11 Mar 2011 16:38:22 +0100 Subject: [PATCH 79/90] fixed bug #719102 Fixes: https://launchpad.net/bugs/719102 --- openlp/plugins/songs/lib/mediaitem.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 46c027316..64802d05f 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -274,6 +274,7 @@ class SongMediaItem(MediaManagerItem): def onNewClick(self): log.debug(u'onNewClick') + self.editItem = None self.edit_song_form.newSong() self.edit_song_form.exec_() From 7c7410a218e928d32f376398acd98dd5ff5b6376 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 11 Mar 2011 16:53:26 +0100 Subject: [PATCH 80/90] complete fixe --- openlp/plugins/songs/lib/mediaitem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 64802d05f..6efeee618 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -274,7 +274,6 @@ class SongMediaItem(MediaManagerItem): def onNewClick(self): log.debug(u'onNewClick') - self.editItem = None self.edit_song_form.newSong() self.edit_song_form.exec_() @@ -311,6 +310,7 @@ class SongMediaItem(MediaManagerItem): item_id = (self.editItem.data(QtCore.Qt.UserRole)).toInt()[0] self.edit_song_form.loadSong(item_id, False) self.edit_song_form.exec_() + self.editItem = None def onDeleteClick(self): """ From 648d33688ac31f0b4cbc8556b83debccc5764df9 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 11 Mar 2011 18:36:34 +0200 Subject: [PATCH 81/90] Fixed some things from my last merge proposal. --- openlp.pyw | 8 ++++---- openlp/core/ui/firsttimeform.py | 4 +--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index cec743f01..3dee7452b 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -186,7 +186,7 @@ class OpenLP(QtGui.QApplication): # start the main app window self.appClipboard = self.clipboard() self.mainWindow = MainWindow(screens, app_version, self.appClipboard, - firstTime) + has_run_wizard) self.mainWindow.show() if show_splash: # now kill the splashscreen @@ -271,11 +271,11 @@ def main(): # Now create and actually run the application. app = OpenLP(qt_args) # Define the settings environment - QtCore.QSettings(u'OpenLP', u'OpenLP') + settings = QtCore.QSettings(u'OpenLP', u'OpenLP') # First time checks in settings # Use explicit reference as not inside a QT environment yet - if QtCore.QSettings(u'OpenLP', u'OpenLP').value( - u'general/first time', QtCore.QVariant(True)).toBool(): + if not settings.value(u'general/has run wizard', + QtCore.QVariant(False)).toBool(): if not FirstTimeLanguageForm().exec_(): # if cancel then stop processing sys.exit() diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index b2895cb47..9f211e49e 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -28,7 +28,6 @@ import io import logging import os import urllib -from random import randint from tempfile import gettempdir from ConfigParser import SafeConfigParser @@ -58,8 +57,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): if self.webAccess: files = self.webAccess.read() self.config.readfp(io.BytesIO(files)) - for screen in screens.get_screen_list(): - self.displayComboBox.addItem(screen) + self.displayComboBox.addItems(screens.get_screen_list()) self.downloading = unicode(translate('OpenLP.FirstTimeWizard', 'Downloading %s...')) QtCore.QObject.connect(self, From 94d7f4e9326bbddc054a90a1b502e1ddffd7b396 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 11 Mar 2011 19:03:16 +0100 Subject: [PATCH 82/90] speed up application start/song search --- openlp/plugins/songs/lib/db.py | 2 +- openlp/plugins/songs/lib/mediaitem.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/openlp/plugins/songs/lib/db.py b/openlp/plugins/songs/lib/db.py index a6255476a..b72517f70 100644 --- a/openlp/plugins/songs/lib/db.py +++ b/openlp/plugins/songs/lib/db.py @@ -256,7 +256,7 @@ def init_schema(url): mapper(Song, songs_table, properties={ 'authors': relation(Author, backref='songs', - secondary=authors_songs_table), + secondary=authors_songs_table, lazy=False), 'book': relation(Book, backref='songs'), 'media_files': relation(MediaFile, backref='songs', secondary=media_files_songs_table), diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 46c027316..05f8b29bc 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -253,9 +253,9 @@ class SongMediaItem(MediaManagerItem): if self.searchAsYouType: search_length = 1 if self.searchTextEdit.currentSearchType() == SongSearch.Entire: - search_length = 7 + search_length = 4 elif self.searchTextEdit.currentSearchType() == SongSearch.Lyrics: - search_length = 6 + search_length = 3 if len(text) > search_length: self.onSearchTextButtonClick() elif len(text) == 0: From f1b8e53e30a255a6b09cd35228e8d1f5964c3bbc Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 11 Mar 2011 19:02:36 +0000 Subject: [PATCH 83/90] Fix missing path for song usage report generation Fixes: https://launchpad.net/bugs/733271 --- openlp/plugins/songusage/forms/songusagedetailform.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/openlp/plugins/songusage/forms/songusagedetailform.py b/openlp/plugins/songusage/forms/songusagedetailform.py index ee37b2a9c..71cbcba96 100644 --- a/openlp/plugins/songusage/forms/songusagedetailform.py +++ b/openlp/plugins/songusage/forms/songusagedetailform.py @@ -88,6 +88,14 @@ class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog): """ log.debug(u'accept') path = unicode(self.fileLineEdit.text()) + if path == u'': + Receiver.send_message(u'openlp_error_message', { + u'title': translate('SongUsagePlugin.SongUsageDetailForm', + 'Report Creation'), + u'message': unicode(translate( + 'SongUsagePlugin.SongUsageDetailForm', 'No output path has been' + ' selected for the report.'))}) + return check_directory_exists(path) filename = unicode(translate('SongUsagePlugin.SongUsageDetailForm', 'usage_detail_%s_%s.txt')) % ( From b3ca0ef69a3dd5db60f1d366c14dd4c69b208c84 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 11 Mar 2011 19:20:31 +0000 Subject: [PATCH 84/90] Fix text --- openlp/plugins/songusage/forms/songusagedetailform.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/openlp/plugins/songusage/forms/songusagedetailform.py b/openlp/plugins/songusage/forms/songusagedetailform.py index 71cbcba96..edfee3595 100644 --- a/openlp/plugins/songusage/forms/songusagedetailform.py +++ b/openlp/plugins/songusage/forms/songusagedetailform.py @@ -91,10 +91,11 @@ class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog): if path == u'': Receiver.send_message(u'openlp_error_message', { u'title': translate('SongUsagePlugin.SongUsageDetailForm', - 'Report Creation'), + 'Output Path Not Selected'), u'message': unicode(translate( - 'SongUsagePlugin.SongUsageDetailForm', 'No output path has been' - ' selected for the report.'))}) + 'SongUsagePlugin.SongUsageDetailForm', 'You have not set a ' + 'valid output location for your song usage report. Please ' + 'select an existing path on your computer.'))}) return check_directory_exists(path) filename = unicode(translate('SongUsagePlugin.SongUsageDetailForm', From 18004c396820b574421906045141004074075a93 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 11 Mar 2011 22:51:29 +0200 Subject: [PATCH 85/90] Fixed some of the last bugs in the first time wizard. --- openlp.pyw | 2 +- openlp/core/ui/firsttimeform.py | 14 ++++---------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index 3dee7452b..0c7893071 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -186,7 +186,7 @@ class OpenLP(QtGui.QApplication): # start the main app window self.appClipboard = self.clipboard() self.mainWindow = MainWindow(screens, app_version, self.appClipboard, - has_run_wizard) + not has_run_wizard) self.mainWindow.show() if show_splash: # now kill the splashscreen diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index 9f211e49e..b049e2ea7 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -178,8 +178,8 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): """ Prepare the UI for the process. """ - # We start on 9 for the 9 plugins - max_progress = 9 + # We start on 2 for plugins status setting plus a "finished" point. + max_progress = 2 # Loop through the songs list and increase for each selected item for i in xrange(self.songsListWidget.count()): if self.songsListWidget.item(i).checkState() == QtCore.Qt.Checked: @@ -209,6 +209,8 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): self.finishButton.setEnabled(True) self.cancelButton.setVisible(False) self.nextButton.setVisible(False) + self.progressLabel.setText(translate('OpenLP.FirstTimeWizard', + 'Download complete. Click the finish button to start OpenLP.')) Receiver.send_message(u'openlp_process_events') def _performWizard(self): @@ -219,21 +221,13 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): self._incrementProgressBar(translate('OpenLP.FirstTimeWizard', 'Enabling selected plugins...')) self._setPluginStatus(self.songsCheckBox, u'songs/status') - self._incrementProgressBar(None) self._setPluginStatus(self.bibleCheckBox, u'bibles/status') - self._incrementProgressBar(None) self._setPluginStatus(self.presentationCheckBox, u'presentations/status') - self._incrementProgressBar(None) self._setPluginStatus(self.imageCheckBox, u'images/status') - self._incrementProgressBar(None) self._setPluginStatus(self.mediaCheckBox, u'media/status') - self._incrementProgressBar(None) self._setPluginStatus(self.remoteCheckBox, u'remotes/status') - self._incrementProgressBar(None) self._setPluginStatus(self.customCheckBox, u'custom/status') - self._incrementProgressBar(None) self._setPluginStatus(self.songUsageCheckBox, u'songusage/status') - self._incrementProgressBar(None) self._setPluginStatus(self.alertCheckBox, u'alerts/status') # Build directories for downloads songs_destination = AppLocation.get_section_data_path(u'songs') From 0bf2962ff36863ff44851a015f8ea66133af5e49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Sat, 12 Mar 2011 00:04:26 +0200 Subject: [PATCH 86/90] Mediaplugin mimetypes extensions hacky fix. --- openlp/plugins/media/mediaplugin.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/openlp/plugins/media/mediaplugin.py b/openlp/plugins/media/mediaplugin.py index b1c1a2f3e..53fc8d2cc 100644 --- a/openlp/plugins/media/mediaplugin.py +++ b/openlp/plugins/media/mediaplugin.py @@ -45,6 +45,18 @@ class MediaPlugin(Plugin): self.icon = build_icon(self.icon_path) # passed with drag and drop messages self.dnd_id = u'Media' + self.additional_extensions = { + u'audio/ac3': [u'.ac3'], + u'audio/flac': [u'.flac'], + u'audio/x-m4a': [u'.m4a'], + u'audio/x-mp3': [u'.mp3'], + u'audio/mpeg': [u'.mp3', u'.mp2', u'.mpga', u'.mpega', u'.m4a'], + u'audio/qcelp': [u'.qcp'], + u'audio/x-wma': [u'.wma'], + u'audio/x-ms-wma': [u'.wma'], + u'video/x-matroska': [u'.mpv', u'.mkv'], + u'video/x-wmv': [u'.wmv'], + u'video/x-ms-wmv': [u'.wmv']} self.audio_extensions_list = [] self.video_extensions_list = [] mimetypes.init() @@ -65,6 +77,17 @@ class MediaPlugin(Plugin): self.serviceManager.supportedSuffixes(extension[1:]) log.info(u'MediaPlugin: %s extensions: %s' % (mimetype, u' '.join(extensions))) + # Add extensions for this mimetype from self.additional_extensions. + # This hack clears mimetypes' and operating system's shortcomings + # by providing possibly missing extensions. + if mimetype in self.additional_extensions.keys(): + for extension in self.additional_extensions[mimetype]: + ext = u'*%s' % extensions + if ext not in list: + list.append(ext) + self.serviceManager.supportedSuffixes(extension[1:]) + log.info(u'MediaPlugin: %s additional extensions: %s' % (mimetype, + u' '.join(self.additional_extensions[mimetype]))) def about(self): about_text = translate('MediaPlugin', 'Media Plugin' From 21679d6a1ab570b86512028ddfb9a8e41affec2e Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 12 Mar 2011 08:12:02 +0000 Subject: [PATCH 87/90] comment fixes --- openlp/core/lib/pluginmanager.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openlp/core/lib/pluginmanager.py b/openlp/core/lib/pluginmanager.py index d2b05ab7c..dc1100e4a 100644 --- a/openlp/core/lib/pluginmanager.py +++ b/openlp/core/lib/pluginmanager.py @@ -73,7 +73,7 @@ class PluginManager(object): A list of helper objects to pass to the plugins. """ - self.plugin_helpers = plugin_helpers + #self.plugin_helpers = plugin_helpers startdepth = len(os.path.abspath(plugin_dir).split(os.sep)) log.debug(u'finding plugins in %s at depth %d', unicode(plugin_dir), startdepth) @@ -102,11 +102,11 @@ class PluginManager(object): plugin_objects = [] for p in plugin_classes: try: - plugin = p(self.plugin_helpers) - log.debug(u'Loaded plugin %s with helpers', unicode(p)) + plugin = p(plugin_helpers) + log.debug(u'Loaded plugin %s', unicode(p)) plugin_objects.append(plugin) except TypeError: - log.exception(u'loaded plugin %s has no helpers', unicode(p)) + log.exception(u'Failed to load plugin %s', unicode(p)) plugins_list = sorted(plugin_objects, self.order_by_weight) for plugin in plugins_list: if plugin.checkPreConditions(): From d65cab1d157ee919c6f49850e49baf0e9be4afc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Sat, 12 Mar 2011 11:59:38 +0200 Subject: [PATCH 88/90] Sorry, guys. --- openlp/plugins/media/mediaplugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/media/mediaplugin.py b/openlp/plugins/media/mediaplugin.py index 53fc8d2cc..06936cd44 100644 --- a/openlp/plugins/media/mediaplugin.py +++ b/openlp/plugins/media/mediaplugin.py @@ -82,7 +82,7 @@ class MediaPlugin(Plugin): # by providing possibly missing extensions. if mimetype in self.additional_extensions.keys(): for extension in self.additional_extensions[mimetype]: - ext = u'*%s' % extensions + ext = u'*%s' % extension if ext not in list: list.append(ext) self.serviceManager.supportedSuffixes(extension[1:]) From 0fe62c3591c1b7a8f0e23d1a1f7b362006b39401 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 12 Mar 2011 17:02:24 +0000 Subject: [PATCH 89/90] Memory improvements and additional logging --- openlp.pyw | 3 +-- openlp/core/lib/pluginmanager.py | 7 +++---- openlp/core/lib/toolbar.py | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index 3dee7452b..0d3a21c7b 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -184,8 +184,7 @@ class OpenLP(QtGui.QApplication): # make sure Qt really display the splash screen self.processEvents() # start the main app window - self.appClipboard = self.clipboard() - self.mainWindow = MainWindow(screens, app_version, self.appClipboard, + self.mainWindow = MainWindow(screens, app_version, self.clipboard(), has_run_wizard) self.mainWindow.show() if show_splash: diff --git a/openlp/core/lib/pluginmanager.py b/openlp/core/lib/pluginmanager.py index dc1100e4a..f9009d7ac 100644 --- a/openlp/core/lib/pluginmanager.py +++ b/openlp/core/lib/pluginmanager.py @@ -55,10 +55,7 @@ class PluginManager(object): sys.path.insert(0, plugin_dir) self.basepath = os.path.abspath(plugin_dir) log.debug(u'Base path %s ', self.basepath) - self.plugin_helpers = [] self.plugins = [] - # this has to happen after the UI is sorted - # self.find_plugins(plugin_dir) log.info(u'Plugin manager Initialised') def find_plugins(self, plugin_dir, plugin_helpers): @@ -73,7 +70,7 @@ class PluginManager(object): A list of helper objects to pass to the plugins. """ - #self.plugin_helpers = plugin_helpers + log.info(u'Finding plugins') startdepth = len(os.path.abspath(plugin_dir).split(os.sep)) log.debug(u'finding plugins in %s at depth %d', unicode(plugin_dir), startdepth) @@ -203,6 +200,7 @@ class PluginManager(object): Loop through all the plugins and give them an opportunity to initialise themselves. """ + log.info(u'Initialise Plugings - Started') for plugin in self.plugins: log.info(u'initialising plugins %s in a %s state' % (plugin.name, plugin.isActive())) @@ -211,6 +209,7 @@ class PluginManager(object): log.info(u'Initialisation Complete for %s ' % plugin.name) if not plugin.isActive(): plugin.removeToolboxItem() + log.info(u'Initialise Plugings - Finished') def finalise_plugins(self): """ diff --git a/openlp/core/lib/toolbar.py b/openlp/core/lib/toolbar.py index 37fb67d52..1da68d72d 100644 --- a/openlp/core/lib/toolbar.py +++ b/openlp/core/lib/toolbar.py @@ -48,7 +48,7 @@ class OpenLPToolbar(QtGui.QToolBar): self.icons = {} self.setIconSize(QtCore.QSize(20, 20)) self.actions = {} - log.debug(u'Init done') + log.debug(u'Init done for %s' % parent.__class__.__name__) def addToolbarButton(self, title, icon, tooltip=None, slot=None, checkable=False, shortcut=0, alternate=0, From 6cab8c1a9020b126a25194aafe971f4927a6e342 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 12 Mar 2011 17:35:27 +0000 Subject: [PATCH 90/90] comments corrected --- openlp/core/lib/pluginmanager.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openlp/core/lib/pluginmanager.py b/openlp/core/lib/pluginmanager.py index f9009d7ac..6085b0da3 100644 --- a/openlp/core/lib/pluginmanager.py +++ b/openlp/core/lib/pluginmanager.py @@ -49,7 +49,7 @@ class PluginManager(object): ``plugin_dir`` The directory to search for plugins. """ - log.info(u'Plugin manager initing') + log.info(u'Plugin manager Initialising') if not plugin_dir in sys.path: log.debug(u'Inserting %s into sys.path', plugin_dir) sys.path.insert(0, plugin_dir) @@ -200,7 +200,7 @@ class PluginManager(object): Loop through all the plugins and give them an opportunity to initialise themselves. """ - log.info(u'Initialise Plugings - Started') + log.info(u'Initialise Plugins - Started') for plugin in self.plugins: log.info(u'initialising plugins %s in a %s state' % (plugin.name, plugin.isActive())) @@ -209,7 +209,7 @@ class PluginManager(object): log.info(u'Initialisation Complete for %s ' % plugin.name) if not plugin.isActive(): plugin.removeToolboxItem() - log.info(u'Initialise Plugings - Finished') + log.info(u'Initialise Plugins - Finished') def finalise_plugins(self): """